Vue组件选项props实例详解


Posted in Javascript onAugust 18, 2017

前面的话

组件接受的选项大部分与Vue实例一样,而选项props是组件中非常重要的一个选项。在 Vue 中,父子组件的关系可以总结为 props down, events up。父组件通过 props 向下传递数据给子组件,子组件通过 events 给父组件发送消息。本文将详细介绍Vue组件选项props

Vue组件选项props实例详解

静态props

组件实例的作用域是孤立的。这意味着不能 (也不应该) 在子组件的模板内直接引用父组件的数据。要让子组件使用父组件的数据,需要通过子组件的 props 选项

使用Prop传递数据包括静态和动态两种形式,下面先介绍静态props

子组件要显式地用 props 选项声明它期待获得的数据

var childNode = {
 template: '<div>{{message}}</div>',
 props:['message']
}

静态Prop通过为子组件在父组件中的占位符添加特性的方式来达到传值的目的

<div id="example">
 <parent></parent>
</div>
<script>
var childNode = {
 template: '<div>{{message}}</div>',
 props:['message']
}
var parentNode = {
 template: `
 <div class="parent">
 <child message="aaa"></child>
 <child message="bbb"></child>
 </div>`,
 components: {
 'child': childNode
 }
};
// 创建根实例
new Vue({
 el: '#example',
 components: {
 'parent': parentNode
 }
})
</script>

Vue组件选项props实例详解

命名约定

对于props声明的属性来说,在父级HTML模板中,属性名需要使用中划线写法

var parentNode = {
 template: `
 <div class="parent">
 <child my-message="aaa"></child>
 <child my-message="bbb"></child>
 </div>`,
 components: {
 'child': childNode
 }
};

子级props属性声明时,使用小驼峰或者中划线写法都可以;而子级模板使用从父级传来的变量时,需要使用对应的小驼峰写法

var childNode = {
 template: '<div>{{myMessage}}</div>',
 props:['myMessage']
}
var childNode = {
 template: '<div>{{myMessage}}</div>',
 props:['my-message']
}

动态props

在模板中,要动态地绑定父组件的数据到子模板的 props,与绑定到任何普通的HTML特性相类似,就是用 v-bind。每当父组件的数据变化时,该变化也会传导给子组件

var childNode = {
 template: '<div>{{myMessage}}</div>',
 props:['myMessage']
}
var parentNode = {
 template: `
 <div class="parent">
 <child :my-message="data1"></child>
 <child :my-message="data2"></child>
 </div>`,
 components: {
 'child': childNode
 },
 data(){
 return {
 'data1':'aaa',
 'data2':'bbb'
 }
 }
};

传递数字

初学者常犯的一个错误是使用字面量语法传递数值

<!-- 传递了一个字符串 "1" -->
<comp some-prop="1"></comp>
<div id="example">
 <my-parent></my-parent>
</div>
<script>
var childNode = {
 template: '<div>{{myMessage}}的类型是{{type}}</div>',
 props:['myMessage'],
 computed:{
 type(){
 return typeof this.myMessage
 }
 }
}
var parentNode = {
 template: `
 <div class="parent">
 <my-child my-message="1"></my-child>
 </div>`,
 components: {
 'myChild': childNode
 }
};
// 创建根实例
new Vue({
 el: '#example',
 components: {
 'MyParent': parentNode
 }
})
</script>

Vue组件选项props实例详解

因为它是一个字面 prop,它的值是字符串 "1" 而不是 number。如果想传递一个实际的 number,需要使用 v-bind,从而让它的值被当作JS表达式计算

<!-- 传递实际的 number -->
<comp v-bind:some-prop="1"></comp>
var parentNode = {
 template: `
 <div class="parent">
 <my-child :my-message="1"></my-child>
 </div>`,
 components: {
 'myChild': childNode
 }
};

Vue组件选项props实例详解

或者可以使用动态props,在data属性中设置对应的数字1

var parentNode = {
 template: `
 <div class="parent">
 <my-child :my-message="data"></my-child>
 </div>`,
 components: {
 'myChild': childNode
 },
 data(){
 return {
 'data': 1
 }
 }
};

props验证

可以为组件的 props 指定验证规格。如果传入的数据不符合规格,Vue会发出警告。当组件给其他人使用时,这很有用

要指定验证规格,需要用对象的形式,而不能用字符串数组

Vue.component('example', {
 props: {
 // 基础类型检测 (`null` 意思是任何类型都可以)
 propA: Number,
 // 多种类型
 propB: [String, Number],
 // 必传且是字符串
 propC: {
 type: String,
 required: true
 },
 // 数字,有默认值
 propD: {
 type: Number,
 default: 100
 },
 // 数组/对象的默认值应当由一个工厂函数返回
 propE: {
 type: Object,
 default: function () {
 return { message: 'hello' }
 }
 },
 // 自定义验证函数
 propF: {
 validator: function (value) {
 return value > 10
 }
 }
 }
})

type 可以是下面原生构造器

String
Number
Boolean
Function
Object
Array
Symbol

type 也可以是一个自定义构造器函数,使用 instanceof 检测。

当 prop 验证失败,Vue 会在抛出警告 (如果使用的是开发版本)。props会在组件实例创建之前进行校验,所以在 default 或 validator 函数里,诸如 data、computed 或 methods 等实例属性还无法使用

下面是一个简单例子,如果传入子组件的message不是数字,则抛出警告

<div id="example">
 <parent></parent>
</div>
<script>
var childNode = {
 template: '<div>{{message}}</div>',
 props:{
 'message':Number
 }
}
var parentNode = {
 template: `
 <div class="parent">
 <child :message="msg"></child>
 </div>`,
 components: {
 'child': childNode
 },
 data(){
 return{
 msg: '123'
 }
 }
};
// 创建根实例
new Vue({
 el: '#example',
 components: {
 'parent': parentNode
 }
})
</script>

传入数字123时,则无警告提示。传入字符串'123'时,结果如下所示

Vue组件选项props实例详解

将上面代码中,子组件的内容修改如下,可自定义验证函数,当函数返回为false时,则输出警告提示

var childNode = {
 template: '<div>{{message}}</div>',
 props:{
 'message':{
 validator: function (value) {
 return value > 10
 }
 }
 }
}

在父组件中传入msg值为1,由于小于10,则输出警告提示

var parentNode = {
 template: `
 <div class="parent">
 <child :message="msg"></child>
 </div>`,
 components: {
 'child': childNode
 },
 data(){
 return{
 msg:1
 }
 }
};

Vue组件选项props实例详解

单向数据流

prop 是单向绑定的:当父组件的属性变化时,将传导给子组件,但是不会反过来。这是为了防止子组件无意修改了父组件的状态——这会让应用的数据流难以理解

另外,每次父组件更新时,子组件的所有 prop 都会更新为最新值。这意味着不应该在子组件内部改变 prop。如果这么做了,Vue 会在控制台给出警告

下面是一个典型例子

<div id="example">
 <parent></parent>
</div>
<script>
var childNode = {
 template: `
 <div class="child">
 <div>
 <span>子组件数据</span>
 <input v-model="childMsg">
 </div>
 <p>{{childMsg}}</p>
 </div>
 `,
 props:['childMsg']
}
var parentNode = {
 template: `
 <div class="parent">
 <div>
 <span>父组件数据</span>
 <input v-model="msg">
 </div>
 <p>{{msg}}</p>
 <child :child-msg="msg"></child>
 </div>
 `,
 components: {
 'child': childNode
 },
 data(){
 return {
 'msg':'match'
 }
 }
};
// 创建根实例
new Vue({
 el: '#example',
 components: {
 'parent': parentNode
 }
})
</script>

父组件数据变化时,子组件数据会相应变化;而子组件数据变化时,父组件数据不变,并在控制台显示警告

Vue组件选项props实例详解

修改prop中的数据,通常有以下两种原因

1、prop 作为初始值传入后,子组件想把它当作局部数据来用

2、prop 作为初始值传入,由子组件处理成其它数据输出

对于这两种情况,正确的应对方式是

1、定义一个局部变量,并用 prop 的值初始化它

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

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

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

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

总结

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

Javascript 相关文章推荐
Jquery调用webService远程访问出错的解决方法
May 21 Javascript
在JavaScript中typeof的用途介绍
Apr 11 Javascript
zTree插件之多选下拉菜单实例代码
Nov 06 Javascript
Bootstrap的图片轮播示例代码
Aug 31 Javascript
基于Phantomjs生成PDF的实现方法
Nov 07 Javascript
JavaScript仿微博输入框效果(案例分析)
Dec 06 Javascript
概述如何实现一个简单的浏览器端js模块加载器
Dec 07 Javascript
Angular的MVC和作用域
Dec 26 Javascript
jquery 给动态生成的标签绑定事件的几种方法总结
Feb 24 jQuery
js 获取本周、上周、本月、上月、本季度、上季度的开始结束日期
Feb 01 Javascript
ant design charts 获取后端接口数据展示
May 25 Javascript
JS函数式编程实现XDM一
Jun 16 Javascript
浅谈angular4 ng-content 中隐藏的内容
Aug 18 #Javascript
Node.JS更改Windows注册表Regedit的方法小结
Aug 18 #Javascript
浅谈Angular2 ng-content 指令在组件中嵌入内容
Aug 18 #Javascript
Vue中引入样式文件的方法
Aug 18 #Javascript
jQuery+HTML5实现WebGL高性能烟花绽放动画效果【附demo源码下载】
Aug 18 #jQuery
JS实现基于Sketch.js模拟成群游动的蝌蚪运动动画效果【附demo源码下载】
Aug 18 #Javascript
select自定义小三角样式代码(实用总结)
Aug 18 #Javascript
You might like
深入理解PHP之require/include顺序 推荐
2011/01/02 PHP
深入PHP异步执行的详解
2013/06/03 PHP
定义php常量的详解
2013/06/09 PHP
PHP加密函数 Javascript/Js 解密函数
2013/09/23 PHP
PHP保存session到memcache服务器的方法
2016/01/19 PHP
php 将json格式数据转换成数组的方法
2018/08/21 PHP
TP5框架model常见操作示例小结【增删改查、聚合、时间戳、软删除等】
2020/04/05 PHP
谷歌浏览器 insertCell与appendChild的区别
2009/02/12 Javascript
for 循环性能比较 提高for循环的效率
2009/03/19 Javascript
js选择并转移导航菜单示例代码
2014/08/19 Javascript
node.js中使用q.js实现api的promise化
2014/09/17 Javascript
jQuery自定义添加&quot;$&quot;与解决&quot;$&quot;冲突的方法
2015/01/19 Javascript
JS两个数组比较,删除重复值的巧妙方法(推荐)
2016/06/03 Javascript
[原创]SyntaxHighlighter自动识别并加载脚本语言
2017/02/07 Javascript
Vue 2.0 服务端渲染入门介绍
2017/03/29 Javascript
BootStrap模态框闪退问题实例代码详解
2018/12/10 Javascript
加快Vue项目的开发速度的方法
2018/12/12 Javascript
JS根据Unix时间戳显示发布时间是多久前【项目实测】
2019/07/10 Javascript
JS数组Reduce方法功能与用法实例详解
2020/04/29 Javascript
javascript实现京东快递单号的查询效果
2020/11/30 Javascript
Python中使用PDB库调试程序
2015/04/05 Python
详谈Python2.6和Python3.0中对除法操作的异同
2017/04/28 Python
解决python爬虫中有中文的url问题
2018/05/11 Python
详解python的argpare和click模块小结
2019/03/31 Python
Python爬取腾讯视频评论的思路详解
2019/12/19 Python
PYQT5 vscode联合操作qtdesigner的方法
2020/03/24 Python
Python 利用argparse模块实现脚本命令行参数解析
2020/12/28 Python
英国时尚家具、家居饰品及礼品商店:Graham & Green
2016/09/15 全球购物
夜班门卫岗位职责
2013/12/09 职场文书
十周年庆典策划方案
2014/06/03 职场文书
2014房屋登记授权委托书
2014/10/13 职场文书
机关作风建设心得体会
2014/10/22 职场文书
2014年电厂工作总结
2014/12/04 职场文书
上课讲话检讨书范文
2015/05/07 职场文书
建党伟业的观后感
2015/06/01 职场文书
导游词之黄果树瀑布
2019/09/20 职场文书