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 相关文章推荐
基于jquery的无限级联下拉框js插件
Oct 29 Javascript
Bootstrap开发实战之第一次接触Bootstrap
Jun 02 Javascript
JavaScript实现解析INI文件内容的方法
Nov 17 Javascript
浅谈JS读取DOM对象(标签)的自定义属性
Nov 21 Javascript
微信小程序  http请求封装详解及实例代码
Feb 15 Javascript
html5+canvas实现支持触屏的签名插件教程
May 08 Javascript
JS获取日期的方法实例【昨天,今天,明天,前n天,后n天的日期】
Sep 28 Javascript
vue使用laydate时间插件的方法
Nov 14 Javascript
基于mpvue搭建微信小程序项目框架的教程详解
Apr 10 Javascript
vue-cli3项目升级到vue-cli4 的方法总结
Mar 19 Javascript
vue任意关系组件通信与跨组件监听状态vue-communication
Oct 18 Javascript
如何让vue长列表快速加载
Mar 29 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
不用数据库的多用户文件自由上传投票系统(2)
2006/10/09 PHP
php生成的html meta和link标记在body标签里 顶部有个空行
2010/05/18 PHP
PHP中根据IP地址判断城市实现城市切换或跳转代码
2012/09/04 PHP
贴一个在Mozilla中常用的Javascript代码
2007/01/09 Javascript
二行代码解决全部网页木马
2008/03/28 Javascript
js实现浏览器窗口大小被改变时触发事件的方法
2015/02/02 Javascript
深入理解JavaScript系列(26):设计模式之构造函数模式详解
2015/03/03 Javascript
AngularJS表达式讲解及示例代码
2016/08/16 Javascript
vue.js动态数据绑定学习笔记
2017/05/19 Javascript
基于bootstrap实现多个下拉框同时搜索功能
2017/07/19 Javascript
vue组件学习教程
2017/09/09 Javascript
关于layui表单中按钮自动提交的解决方法
2019/09/09 Javascript
在Vue项目中使用Typescript的实现
2019/12/19 Javascript
jquery实现直播视频弹幕效果
2020/02/25 jQuery
Element el-button 按钮组件的使用详解
2021/02/01 Javascript
Python发送Email方法实例
2014/08/21 Python
Python字符串匹配算法KMP实例
2015/07/18 Python
Python使用getpass库读取密码的示例
2017/10/10 Python
python初学之用户登录的实现过程(实例讲解)
2017/12/23 Python
解读python logging模块的使用方法
2018/04/17 Python
设置jupyter中DataFrame的显示限制方式
2020/04/12 Python
python实现读取类别频数数据画水平条形图案例
2020/04/24 Python
没编程基础可以学python吗
2020/06/17 Python
CSS3教程(7):CSS3嵌入字体
2009/04/02 HTML / CSS
HTML5本地存储之Database Storage应用介绍
2013/01/06 HTML / CSS
HTML5轻松实现全屏视频背景的示例
2018/04/23 HTML / CSS
新西兰优惠网站:Treat Me
2019/07/04 全球购物
英国最大的割草机购买网站:Just Lawnmowers
2019/11/02 全球购物
表彰先进的通报
2014/01/31 职场文书
申请任职学生会干部自荐书范文
2014/02/13 职场文书
四风问题专项整治工作情况报告
2014/10/28 职场文书
大学生个人简历自我评价
2015/03/11 职场文书
Redis遍历所有key的两个命令(KEYS 和 SCAN)
2021/04/12 Redis
Redis主从配置和底层实现原理解析(实战记录)
2021/06/30 Redis
css中有哪些方式可以隐藏页面元素及区别
2022/06/16 HTML / CSS
Win11怎么解除儿童账号限制?Win11解除微软儿童账号限制方法
2022/07/07 数码科技