当前位置: 首页 > article >正文

vue中props详解

看一下官方文档:

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

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

详细一点解释就是:

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

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

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

1. 基本用法

图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中声明的那个hellotemplate:'<div><p>{{ hello }}</p></div>',})
    var app1 &#61; new Vue ({el: &#39;#app1&#39;,data: {greet: {hello:&#39;hello,&#39;,world: &#39;world&#39;,},message: &#39;message1&#39;,}})
&lt;/script&gt;

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>

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

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

4. props验证

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

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

5. $parent

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

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

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

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

http://www.lryc.cn/news/2420444.html

相关文章:

  • BLE基础知识详解
  • C++ 与 CUDA: 搭建高性能计算系统
  • 使用历山手游SDK,轻松搭建高效的游戏联运平台
  • 磊科NW330 LINUX下驱动安装记
  • Apache Spark 基础知识总结及应用示例
  • pthread_cancel手册翻译
  • 微信小程序开发中的数据分析与统计
  • 出身比你好的人,比你聪明,还比你努力
  • Oracle数据库链Database links(dblinks)使用方法
  • Qt 防止程序多次运行
  • 器件选型篇:二极管之肖特基选型
  • 龙生九子 联想06年超越新机官方多图赏上篇
  • 无线震动传感器
  • 亚马逊云aws12个月免费服务器搭建小结
  • 多普达S900 使用详细说明(使用技巧大全)
  • 家中常用药
  • ADUM1201和川土微电子的CA-IS3722HS数字隔离器参数对比
  • 不喜欢stormliv.exe的最简单解决办法
  • 冷风机的安装
  • SEO按天计费系统源码 聚合SEO关键词按天自动扣费 | Thinkphp框架
  • 3d工口医Android,3d口工医完整版
  • Windows10系统安装软件时显示“无法访问Windows Installer服务。Windows Installer没有正确安装时可能发生这种情况。” or “错误2:系统找不到指定的文件”
  • 乌班图服务器系统升级,Ubuntu 13.04升级至Ubuntu 13.10(服务器版)教程
  • ARM烧录笔记
  • java7723魂斗罗2_魂斗罗3代-完全版
  • 课程设计-基于Springboot+Vue的大学生社团活动平台的设计与实现(源码+LW+包运行)
  • springboot房屋租赁系统-计算机毕业设计源码74728
  • 【Unity Shader入门精要 第3章】Unity Shader基础
  • 卡巴斯基kis6换许可文件key教程(转)
  • 基于Matlab的碎纸片的自动拼接复原技术