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学习阶段性总结(2)--(X)HTML学习
Feb 03 Javascript
Jquery on方法绑定事件后执行多次的解决方法
Jun 02 Javascript
Jquery揭秘系列:ajax原生js实现详解(推荐)
Jun 08 Javascript
8 行 Node.js 代码实现代理服务器
Dec 05 Javascript
你真的了解BOM中的history对象吗
Feb 13 Javascript
微信小程序富文本渲染引擎的详解
Sep 30 Javascript
基于jQuery解决ios10以上版本缩放问题
Nov 03 jQuery
原生JS实现前端本地文件上传
Sep 08 Javascript
jQuery 点击获取验证码按钮及倒计时功能
Sep 20 jQuery
JS将时间秒转换成天小时分钟秒的字符串
Jul 10 Javascript
JS实现普通轮播图特效
Jan 01 Javascript
解决vue elementUI 使用el-select 时 change事件的触发问题
Nov 17 Vue.js
使用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
浅谈php提交form表单
2015/07/01 PHP
JS(jQuery)实现聊天接收到消息语言自动提醒功能详解【提示“您有新的消息请注意查收”】
2019/04/16 PHP
JavaScript 原型继承
2011/12/26 Javascript
11个用于提高排版水平的基于jquery的文字效果插件
2012/09/14 Javascript
Python脚本后台运行的几种方式
2015/03/09 Javascript
详细分析使用AngularJS编程中提交表单的方式
2015/06/19 Javascript
Chrome不支持showModalDialog模态对话框和无法返回returnValue问题的解决方法
2016/10/30 Javascript
js点击任意区域弹出层消失实现代码
2016/12/27 Javascript
javascript 显示全局变量与隐式全局变量的区别
2017/02/09 Javascript
仿ElementUI实现一个Form表单的实现代码
2019/04/23 Javascript
Nuxt项目支持eslint+pritter+typescript的实现
2019/05/20 Javascript
vue的注意规范之v-if 与 v-for 一起使用教程
2019/08/04 Javascript
vue使用lodop打印控件实现浏览器兼容打印的方法
2021/02/07 Vue.js
[02:03]永远的信仰DOTA2 中国军团历届国际邀请赛回顾
2016/06/26 DOTA
Python实现TCP/IP协议下的端口转发及重定向示例
2016/06/14 Python
Python简单网络编程示例【客户端与服务端】
2017/05/26 Python
Python使用matplotlib实现的图像读取、切割裁剪功能示例
2018/04/28 Python
python 读取dicom文件,生成info.txt和raw文件的方法
2019/01/24 Python
10分钟教你用python动画演示深度优先算法搜寻逃出迷宫的路径
2019/08/12 Python
PyTorch中常用的激活函数的方法示例
2019/08/20 Python
基于pandas中expand的作用详解
2019/12/17 Python
Python有参函数使用代码实例
2020/01/06 Python
Python远程linux执行命令实现
2020/11/11 Python
美国香薰蜡烛品牌:PADDYWAX
2018/10/06 全球购物
Microsoft Advertising美国:微软搜索广告
2019/05/01 全球购物
英国工作场所设备购买网站:Slingsby
2019/05/03 全球购物
C++面试题:关于链表和指针
2013/06/05 面试题
个人求职简历的自我评价范文
2013/10/09 职场文书
资产经营总监岗位职责
2013/12/04 职场文书
会议开场欢迎词
2014/01/15 职场文书
高中生物教学反思
2014/02/05 职场文书
文明生主要事迹
2014/05/25 职场文书
开学典礼策划方案
2014/05/28 职场文书
汽车销售员岗位职责
2015/04/11 职场文书
文艺部部长竞选稿
2015/11/21 职场文书
《我的美好婚事》动画化决定纪念插画与先导PV公开
2022/04/06 日漫