深入浅析Vue中的Prop


Posted in Javascript onJune 10, 2018

Prop

基本用法

Prop的基本用法很简单,只需要在子组件的Vue实例中定义该属性并把值设为目标属性的数组即可

Vue.component('child', {
 ...
 // 接收message
 props: ['message']
 ...
})

tips:由于HTML中的属性是不区分大小写的,所以当使用DOM中的模板(HTML中)时,驼峰写法需要转化为短横线写法。但是,如果使用字符串模板(JS中)时,不受限制,可以为所欲为。

Prop中的静态和动态值

在正常情况下,一般在父组件中通过v-bind定义一个动态值,子组件通过Prop接收该值,所以,很多人认为,Prop只能接收动态值。但是,其实Prop可以接受静态属性。

示例:

/* 父组件 */
<child type="video"></child>

/* 子组件 */
Vue.component('child', {
 ...
 // 成功接收
 props: ['type']
 ...
})

在示例中,父组件在子组件标签上定义了静态属性type,子组件依然通过Prop拿到了静态属性type。

单向数据流

所有的 prop 都使得其父子 prop 之间形成了一个单向下行绑定:父组件的 Prop 的更新会向下流动到子组件中,但是反过来则不行。这样会防止从子组件意外改变父组件以及同级子组件的状态,从而导致你的应用的数据流向难以理解。

另外,每次父组件发生更新时,子组件中所有的Prop都将刷新为最新的值。这意味着你不应该在子组件内部改变Prop,如果你这样做了,Vue会在控制台抛出一个警告。

一般来说,如果子组件需要操作Prop中的值,需要将Prop中的值赋值给本地定义的属性:

...
props: ['message'],
data () {
 return {
  mes: this.message
 }
}
...

非Prop特性

非Props特性是指在组件上定义了属性,而又没有使用Prop接受属性。此时,子组件内不可使用该属性值,该属性会直接添加到子组件的根节点上。

比如,在一个只含有一个div的子组件上,如果我向子组件传了一个content属性,但是子组件不使用Prop接收content属性,则渲染结果为:

<div id="root">
  <div content="hello"></div>
</div>

Prop校验

子组件用Props接收父组件传来的消息有多种形式:

1.数组形式

props: [data1, data2]

数组形式相当于直接接收消息,不做任何校验,一般来说,不太建议使用数组形式。

2.简单对象形式

props: {
 data1: String,
 data2: Array
}

简单对象形式对父组件传递的值进行了类型校验,如果传过来的值类型不一致,控制台会报错。

3.复杂对象形式

props: {
 data1: {
  type: String,
  required: true,
  default: 'default value',
  validator (value) {
   return (value.length < 5)
  }
 },
 data2: {
  type: Array,
  required: true,
  default: () => ['', '', '']
 }
}

复杂对象形式的情况下,作为对象属性的参数可以写为对象形式,参数对象含有4个属性,type、required、default、validator。

type:设定参数类型,当传入参数类型与type不相符时,控制台会报错

required:设定参数是否是必传,当设为true时,不传该参数会报错

default:设定默认值,当参数类型为复杂类型时,需使用工厂模式生成默认值,否则Vue会在控制台抛出警告。如图所示,就通过工厂模式生成了一个长度为3的空数组。

validator:校验器,是一个函数,拥有一个代表传入值的形参,可以自定义各种校验,当返回false时,会报错,表示没通过校验。

Javascript 相关文章推荐
Node.js中使用Log.io在浏览器中实时监控日志(等同tail -f命令)
Sep 17 Javascript
js实现星星打分效果的方法
Jul 05 Javascript
javascript中eval和with用法实例总结
Nov 30 Javascript
js禁止表单重复提交
Aug 29 Javascript
详解使用create-react-app添加css modules、sasss和antd
Jul 31 Javascript
记React connect的几种写法(小结)
Sep 18 Javascript
微信小程序new Date()方法失效问题解决方法
Jul 29 Javascript
Openlayers实现图形绘制
Sep 28 Javascript
在react项目中使用antd的form组件,动态设置input框的值
Oct 24 Javascript
解决iView Table组件宽度只变大不变小的问题
Nov 13 Javascript
JavaScript实现图片合成下载的示例
Nov 19 Javascript
vue实现表格合并功能
Dec 01 Vue.js
vue项目部署上线遇到的问题及解决方法
Jun 10 #Javascript
js技巧之十几行的代码实现vue.watch代码
Jun 09 #Javascript
浅谈JS对象添加getter与setter的5种方法
Jun 09 #Javascript
让你5分钟掌握9个JavaScript小技巧
Jun 09 #Javascript
jQuery基于闭包实现的显示与隐藏div功能示例
Jun 09 #jQuery
JS实现区分中英文并统计字符个数的方法示例
Jun 09 #Javascript
详解angular脏检查原理及伪代码实现
Jun 08 #Javascript
You might like
深入解析fsockopen与pfsockopen的区别
2013/07/05 PHP
PHP中source #N问题的解决方法
2014/01/27 PHP
PHP如何将XML转成数组
2016/04/04 PHP
浅析Yii2 GridView实现下拉搜索教程
2016/04/22 PHP
php 删除一维数组中某一个值元素的操作方法
2018/02/01 PHP
[原创]静态页面也可以实现预览 列表不同的显示方式
2006/10/14 Javascript
js 左右悬浮对联广告代码示例
2014/12/12 Javascript
Javascript中的arguments与重载介绍
2015/03/15 Javascript
简述Jquery与DOM对象
2015/07/10 Javascript
jQuery基于函数重载实现自定义Alert函数样式的方法
2016/07/27 Javascript
vue.js入门教程之绑定class和style样式
2016/09/02 Javascript
浅谈js继承的实现及公有、私有、静态方法的书写
2016/10/28 Javascript
ES6中Proxy与Reflect实现重载(overload)的方法
2017/03/30 Javascript
3种vue路由传参的基本模式
2018/02/22 Javascript
JS代码实现电脑配置检测功能
2018/03/21 Javascript
浅谈vue项目如何打包扔向服务器
2018/05/08 Javascript
Vue js 的生命周期(看了就懂)(推荐)
2019/03/29 Javascript
原生js实现each方法实例代码详解
2019/05/27 Javascript
Vue CLI3移动端适配(px2rem或postcss-plugin-px2rem)
2020/04/27 Javascript
element-ui封装一个Table模板组件的示例
2021/01/04 Javascript
[01:34]DOTA2 7.22版本新增神杖效果一览(敏捷英雄篇)
2019/05/28 DOTA
[01:10:24]DOTA2-DPC中国联赛 正赛 VG vs Aster BO3 第一场 2月28日
2021/03/11 DOTA
Python实现各种排序算法的代码示例总结
2015/12/11 Python
Python实现删除列表中满足一定条件的元素示例
2017/06/12 Python
Python编程使用*解包和itertools.product()求笛卡尔积的方法
2017/12/18 Python
谈谈python中GUI的选择
2018/03/01 Python
Python实现定时执行任务的三种方式简单示例
2019/03/30 Python
树莓派实现移动拍照
2019/06/22 Python
PyCharm Ctrl+Shift+F 失灵的简单有效解决操作
2021/01/15 Python
HTML5 DeviceOrientation实现手机网站摇一摇功能代码实例
2015/04/24 HTML / CSS
给护士表扬信
2014/01/19 职场文书
工程管理英文求职信
2014/03/18 职场文书
明星员工获奖感言
2014/08/14 职场文书
工会工作先进事迹
2014/08/18 职场文书
python小程序之飘落的银杏
2021/04/17 Python
Jedis操作Redis实现模拟验证码发送功能
2021/09/25 Redis