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 相关文章推荐
js 静态动态成员 and 信息的封装和隐藏
May 29 Javascript
关于setInterval、setTimeout在jQuery中的使用注意事项
Sep 28 Javascript
JavaScript实现复制功能各浏览器支持情况实测
Jul 18 Javascript
JQuery判断radio(单选框)是否选中和获取选中值方法总结
Apr 15 Javascript
JavaScript日期对象(Date)基本用法示例
Jan 18 Javascript
jQuery正则验证注册页面经典实例
Jun 10 jQuery
jQuery使用zTree插件实现可拖拽的树示例
Sep 23 jQuery
javascript按钮禁用和启用的效果实例代码
Oct 29 Javascript
基于JS实现web端录音与播放功能
Apr 17 Javascript
js实现带搜索功能的下拉框
Jan 11 Javascript
解决Vue 移动端点击出现300毫秒延迟的问题
Jul 21 Javascript
javascript实现点击小图显示大图
Nov 29 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
destoon实现底部添加你是第几位访问者的方法
2014/07/15 PHP
PHP 7.0.2 正式版发布
2016/01/08 PHP
PHP安装GeoIP扩展根据IP获取地理位置及计算距离的方法
2016/07/01 PHP
thinkPHP实现基于ajax的评论回复功能
2018/06/22 PHP
两种简单实现菜单高亮显示的JS类代码
2010/06/27 Javascript
关于eval 与new Function 到底该选哪个?
2013/04/17 Javascript
js捕获鼠标滚轮事件代码
2013/12/16 Javascript
jquery插件lazyload.js延迟加载图片的使用方法
2014/02/19 Javascript
jQuery1.9.1针对checkbox的调整方法(prop)
2014/05/01 Javascript
JavaScript检查某个function是否是原生代码的方法
2014/08/20 Javascript
JavaScript中property和attribute的区别详细介绍
2015/03/03 Javascript
JavaScript类型检测之typeof 和 instanceof 的缺陷与优化
2016/01/13 Javascript
Js与Jq获取浏览器和对象值的方法
2016/03/18 Javascript
浅谈JS中的bind方法与函数柯里化
2016/08/10 Javascript
nodejs超出最大的调用栈错误问题
2017/12/27 NodeJs
Vue-cli项目获取本地json文件数据的实例
2018/03/07 Javascript
微信小程序实践之动态控制组件的显示/隐藏功能
2018/07/18 Javascript
js中call()和apply()改变指针问题的讲解
2019/01/17 Javascript
JavaScript实现随机五位数验证码
2019/09/27 Javascript
jquery实现弹窗(系统提示框)效果
2019/12/10 jQuery
nuxt静态部署打包相对路径操作
2020/11/06 Javascript
详解Python 实现元胞自动机中的生命游戏(Game of life)
2018/01/27 Python
python机器学习之贝叶斯分类
2018/03/26 Python
Python网络编程基于多线程实现多用户全双工聊天功能示例
2018/04/10 Python
python发送多人邮件没有展示收件人问题的解决方法
2019/06/21 Python
使用python打印十行杨辉三角过程详解
2019/07/10 Python
python3实现斐波那契数列(4种方法)
2019/07/15 Python
6行Python代码实现进度条效果(Progress、tqdm、alive-progress​​​​​​​和PySimpleGUI库)
2020/01/06 Python
Selenium自动化测试工具使用方法汇总
2020/06/12 Python
pyx文件 生成pyd 文件用于 cython调用的实现
2021/03/04 Python
法国最大的在线眼镜店:EasyLunettes
2019/08/26 全球购物
维多利亚的秘密阿联酋官网:Victoria’s Secret阿联酋
2019/12/07 全球购物
机关出纳岗位职责
2014/04/03 职场文书
药店收银员岗位职责
2015/04/07 职场文书
学校隐患排查制度
2015/08/05 职场文书
MySQL串行化隔离级别(间隙锁实现)
2022/06/16 MySQL