Vue中props的详解


Posted in Javascript onMay 16, 2019

看一下官方文档:

组件实例的作用域是孤立的。这意味着不能 (也不应该) 在子组件的模板内直接引用父组件的数据。父组件的数据需要通过 prop 才能下发到子组件中。

也就是props是子组件访问父组件数据的唯一接口。

详细一点解释就是:

一个组件可以直接在模板里面渲染data里面的数据(双大括号)。

子组件不能直接在模板里面渲染父元素的数据。

如果子组件想要引用父元素的数据,那么就在prop里面声明一个变量(比如a),这个变量就可以引用父元素的数据。然后在模板里渲染这个变量(前面的a),这时候渲染出来的就是父元素里面的数据。

1. 基本用法

Vue中props的详解

图1-props

<div id="app1">
    <!-- hello引用父元素的hello,它也可以引用message,greet,world等 -->
    <child :hello='hello'></child>
  </div>
  <script>
    var com1 = Vue.component('child',{
      // 声明在prop中的变量可以引用父元素的数据
      props:['hello'],
      // 这里渲染props中声明的那个hello
      template:'<div><p>{{ hello }}</p></div>',
    })
 
    var app1 = new Vue ({
      el: '#app1',
      data: {
        greet: {
          hello:'hello,',
          world: 'world',
        },
        message: 'message1',
      }
    })
  </script>

2. camelCase vs. kebab-case:js中用驼峰式命名,在html中替换成短横线分隔式命名

<!-- 在 HTML 中使用 kebab-case -->
<child my-message="hello!"></child>
 
<script>
  Vue.component('child', {
    // 在 JavaScript 中使用 camelCase
    props: ['myMessage'],
    template: '<span>{{ myMessage }}</span>'
  })
</script>

3.单向数据流: props是单向绑定的

当父组件的属性变化时,将传导给子组件,但是反过来不会。

每次父组件更新时,子组件的所有 prop 都会更新为最新值。

不要在子组件内部改变 prop。如果你这么做了,Vue 会在控制台给出警告。

在两种情况下,我们很容易忍不住想去修改 prop 中数据:

  1. Prop 作为初始值传入后,子组件想把它当作局部数据来用;
  2. Prop 作为原始数据传入,由子组件处理成其它数据输出。

对这两种情况,正确的应对方式是:
定义一个局部变量,并用 prop 的值初始化它:

props: ['initialCounter'],
  data: function () {
   return { counter: this.initialCounter }
  }

定义一个计算属性,处理 prop 的值并返回:

props: ['size'],
  computed: {
   normalizedSize: function () {
    return this.size.trim().toLowerCase()
   }
  }

注意在 JavaScript 中对象和数组是引用类型,指向同一个内存空间,如果 prop 是一个对象或数组,在子组件内部改变它会影响父组件的状态。

举个例子:

<div id="app3">
    <my-component :object='object'></my-component>
  </div>
  <script src="http://vuejs.org/js/vue.min.js"></script>
  <script>
    //
    var mycom = Vue.component('my-component', {
      //添加一个input改变子组件的childOject,那么父元素的object也会被改变,但是Vue没有报错!
      template: '<p>{{ object.name }} is {{ object.age }} years old.<br><input v-model="childObject.name" type="text"></p>',
      props: ['object','school'],
      data: function () {
        // 子组件的childObject 和 父组件的object 指向同一个对象
        return {
          childObject: this.object
        }
      }
    });
    var app3 = new Vue({
      el: '#app3',
      data: {
        object:{
          name: 'Xueying',
          age: '21',
        },
        school:'SCUT',
      },
    })
  </script>

Vue中props的详解

图2-改变childObject.name,object.name也改变

Vue中props的详解

图3-控制台输出app3.object.name

4. props验证

可以为prop指定验证规则,如果传入的数据不符合要求,Vue会发出警告。

具体验证规则见官方文档:Prop验证规则

5. $parent

$parent 也可以用来访问父组件的数据。

而且子组件可以通过$parent 来直接修改父组件的数据,不会报错!

可以使用props的时候,尽量使用props显式地传递数据(可以很清楚很快速地看出子组件引用了父组件的哪些数据)。

另外在一方面,直接在子组件中修改父组件的数据是很糟糕的做法,props单向数据流就没有这种顾虑了。

以上所述是小编给大家介绍的Vue中props的详解详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
JavaScript 密码强度判断代码
Sep 05 Javascript
Javascript 变量作用域 两个可能会被忽略的小特性
Mar 23 Javascript
Javascript 页面模板化很多人没有使用过的方法
Jun 05 Javascript
javascript实现修改微信分享的标题内容等
Dec 11 Javascript
原生js结合html5制作简易的双色子游戏
Mar 30 Javascript
Javascript学习之谈谈JS的全局变量跟局部变量(推荐)
Aug 28 Javascript
JavaScript trim 实现去除字符串首尾指定字符的简单方法
Dec 27 Javascript
js实现炫酷的左右轮播图
Jan 18 Javascript
Vue.js列表渲染绑定jQuery插件的正确姿势
Jun 29 jQuery
ES6之模版字符串的具体使用
May 17 Javascript
Node.js中Koa2在控制台输出请求日志的方法示例
May 02 Javascript
关于ligerui子页面关闭后,父页面刷新,重新加载的方法
Sep 27 Javascript
使用Vue实现移动端左滑删除效果附源码
May 16 #Javascript
Vue2.0实现组件之间数据交互和通信操作示例
May 16 #Javascript
Mpvue中使用Vant Weapp组件库的方法步骤
May 16 #Javascript
JS左右无缝轮播功能完整实例
May 16 #Javascript
Node.js Windows Binary二进制文件安装方法
May 16 #Javascript
详解mpvue中使用vant时需要注意的onChange事件的坑
May 16 #Javascript
详解如何搭建mpvue框架搭配vant组件库的小程序项目
May 16 #Javascript
You might like
memcached 和 mysql 主从环境下php开发代码详解
2010/05/16 PHP
PHP学习笔记 IIS7下安装配置php环境
2012/10/29 PHP
基于magic_quotes_gpc与magic_quotes_runtime的区别与使用介绍
2013/04/22 PHP
destoon供应信息title调用出公司名称的方法
2014/08/22 PHP
php保存二进制原始数据为图片的程序代码
2014/10/14 PHP
php+flash+jQuery多图片上传源码分享
2020/07/27 PHP
cakephp常见知识点汇总
2017/02/24 PHP
PHP strripos函数用法总结
2019/02/11 PHP
如何用javascript判断录入的日期是否合法
2007/01/08 Javascript
js removeChild 障眼法 可能出现的错误
2009/10/06 Javascript
2012年开发人员的16款新鲜的jquery插件体验分享
2012/12/28 Javascript
JS+ACTIVEX实现网页选择本地目录路径对话框
2013/03/18 Javascript
原生javascript实现获取指定元素下所有后代元素的方法
2014/10/28 Javascript
javascript实现简单的页面右下角提示信息框
2015/07/31 Javascript
理解javascript中的闭包
2017/01/11 Javascript
jquery中封装函数传递当前元素的方法示例
2017/05/05 jQuery
ECharts地图绘制和钻取简易接口详解
2019/07/12 Javascript
JS/CSS实现字符串单词首字母大写功能
2019/09/03 Javascript
JS判断数组是否包含某元素实现方法汇总
2020/06/24 Javascript
[49:59]KG vs Mineski 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
对python3中, print横向输出的方法详解
2019/01/28 Python
pytorch 获取层权重,对特定层注入hook, 提取中间层输出的方法
2019/08/17 Python
python爬虫之爬取百度音乐的实现方法
2019/08/24 Python
tensorflow2.0的函数签名与图结构(推荐)
2020/04/28 Python
使用Python提取文本中含有特定字符串的方法示例
2020/12/09 Python
CSS3盒子模型详解
2013/04/24 HTML / CSS
韩国CJ食品专卖网:CJonmart
2016/09/11 全球购物
远程Wi-Fi宠物监控相机:Petcube
2017/04/26 全球购物
卫校毕业生自我鉴定
2013/10/31 职场文书
化工专业个人的求职信范文
2013/11/28 职场文书
学习决心书
2014/03/11 职场文书
学习方法演讲稿
2014/05/10 职场文书
装配车间主任岗位职责
2015/04/08 职场文书
如何在CocosCreator里画个炫酷的雷达图
2021/04/16 Javascript
TV动画《间谍过家家》公开PV
2022/03/20 日漫
P站美图推荐——变身女主角特辑
2022/03/20 日漫