深入浅析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 相关文章推荐
JS绘制生成花瓣效果的方法
Aug 05 Javascript
Node.js实现JS文件合并小工具
Feb 02 Javascript
Bootstrap中的fileinput 多图片上传及编辑功能
Sep 05 Javascript
解决AngualrJS页面刷新导致异常显示问题
Apr 20 Javascript
angular中实现控制器之间传递参数的方式
Apr 24 Javascript
浅析Angular2子模块以及异步加载
Apr 24 Javascript
vue 验证码界面实现点击后标灰并设置div按钮不可点击状态
Oct 28 Javascript
vue2.0 获取从http接口中获取数据,组件开发,路由配置方式
Nov 04 Javascript
javascript数组元素删除方法delete和splice解析
Dec 09 Javascript
谈谈JavaScript中的垃圾回收机制
Sep 17 Javascript
js实现删除json中指定的元素
Sep 22 Javascript
基于JavaScript实现随机点名器
Feb 25 Javascript
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
php download.php实现代码 跳转到下载文件(response.redirect)
2009/08/26 PHP
php session安全问题分析
2011/06/24 PHP
关于PHP开发的9条建议
2015/07/27 PHP
微信支付开发订单查询实例
2016/07/12 PHP
yii2高级应用之自定义组件实现全局使用图片上传功能的方法
2016/10/08 PHP
Yii框架实现记录日志到自定义文件的方法
2017/05/23 PHP
PHP使用curl_multi实现并发请求的方法示例
2018/04/29 PHP
利用javascript中的call实现继承
2007/01/22 Javascript
Dreamweaver jQuery智能提示插件,支持版本提示,支持1.6api
2011/07/31 Javascript
Jquery 获取checkbox的checked问题
2011/11/16 Javascript
Textarea与懒惰渲染实现代码
2012/01/04 Javascript
在JavaScript中构建ArrayList示例代码
2014/09/17 Javascript
基于jQuery倾斜打开侧边栏菜单特效代码
2015/09/15 Javascript
JS实现的网页背景闪电闪烁效果代码
2015/10/17 Javascript
jQuery插件FusionCharts实现的MSBar2D图效果示例【附demo源码】
2017/03/24 jQuery
NodeJS模块与ES6模块系统语法及注意点详解
2019/01/04 NodeJs
php结合js实现多条件组合查询
2019/05/28 Javascript
[01:22:28]DOTA2-DPC中国联赛 正赛 SAG vs RNG BO3 第一场 1月18日
2021/03/11 DOTA
python实现class对象转换成json/字典的方法
2016/03/11 Python
Python判断文件和字符串编码类型的实例
2017/12/21 Python
pycharm 关掉syntax检查操作
2020/06/09 Python
python类共享变量操作
2020/09/03 Python
IE9下html5初试小刀
2010/09/21 HTML / CSS
台湾SHOPRO购物行家:亚洲首创影视.3C.家电.优质购物平台
2018/05/07 全球购物
英国领先的大码时装品牌之一:Elvi
2018/08/26 全球购物
大班亲子运动会方案
2014/06/10 职场文书
单位实习工作证明怎么写
2014/11/02 职场文书
怎样写家长意见
2015/06/04 职场文书
单独二胎证明
2015/06/24 职场文书
《七月的天山》教学反思
2016/02/19 职场文书
2016民族团结先进个人事迹材料
2016/02/26 职场文书
工作转正自我鉴定范文
2019/06/21 职场文书
Redis Cluster 集群搭建你会吗
2021/08/04 Redis
MySql分区类型及创建分区的方法
2022/04/13 MySQL
mysql通过group by分组取最大时间对应数据的两种有效方法
2022/09/23 MySQL
MySQL新手入门进阶语句汇总
2022/09/23 MySQL