深入浅析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 相关文章推荐
javascript垃圾收集机制与内存泄漏详细解析
Nov 11 Javascript
JavaScript实现列表分页功能特效
May 15 Javascript
jQuery仿gmail实现fixed布局的方法
May 27 Javascript
Bootstrap实现带暂停功能的轮播组件(推荐)
Nov 25 Javascript
详解Weex基于Vue2.0开发模板搭建
Mar 20 Javascript
JS字符串按逗号和回车分隔的方法
Apr 25 Javascript
axios拦截设置和错误处理方法
Mar 05 Javascript
详解项目升级到vue-cli3的正确姿势
Jan 28 Javascript
JavaScript多种页面刷新方法小结
Apr 04 Javascript
利用Bootstrap Multiselect实现下拉框多选功能
Apr 08 Javascript
JS实现简单日历特效
Jan 03 Javascript
详解ES6数组方法find()、findIndex()的总结
May 12 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编写和读取XML的几种方式
2013/01/12 PHP
php返回相对时间(如:20分钟前,3天前)的方法
2015/04/14 PHP
用javascript自动显示最后更新时间
2007/03/15 Javascript
FormValidate 表单验证功能代码更新并提供下载
2008/08/23 Javascript
解决html按钮切换绑定不同函数后点击时执行多次函数问题
2014/05/14 Javascript
利用原生JavaScript获取元素样式只是获取而已
2014/10/08 Javascript
javascript截取字符串小结
2015/04/28 Javascript
基于jquery实现在线选座订座之影院篇
2015/08/24 Javascript
第一章之初识Bootstrap
2016/04/25 Javascript
ionic由于使用了header和subheader导致被遮挡的问题的两种解决方法
2016/09/22 Javascript
js实现控制textarea输入字符串的个数,鼠标按下抬起判断输入字符数
2016/10/25 Javascript
vue.js数据绑定的方法(单向、双向和一次性绑定)
2017/07/13 Javascript
jQuery取得元素标签名称小结(附代码)
2017/08/16 jQuery
Vue如何从1.0迁移到2.0
2017/10/19 Javascript
基于vue开发的在线付费课程应用过程
2018/01/25 Javascript
JS中判断某个字符串是否包含另一个字符串的五种方法
2018/05/03 Javascript
分享5个顶级的JavaScript Ajax组件库
2018/09/16 Javascript
JavaScript中工厂函数与构造函数示例详解
2019/05/06 Javascript
vue使用echarts画组织结构图
2021/02/06 Vue.js
python线程池的实现实例
2013/11/18 Python
python多线程抓取天涯帖子内容示例
2014/04/03 Python
Python和GO语言实现的消息摘要算法示例
2015/03/10 Python
python实现JAVA源代码从ANSI到UTF-8的批量转换方法
2015/08/10 Python
python OpenCV学习笔记实现二维直方图
2018/02/08 Python
pytorch 中的重要模块化接口nn.Module的使用
2020/04/02 Python
使用Keras预训练模型ResNet50进行图像分类方式
2020/05/23 Python
Python爬取微信小程序Charles实现过程图解
2020/09/29 Python
详解CSS3伸缩布局盒模型Flex布局
2018/08/20 HTML / CSS
大学生实习思想汇报
2014/01/12 职场文书
医生进修自我鉴定
2014/01/19 职场文书
教师年度考核评语
2014/04/28 职场文书
保证书格式范文
2014/04/28 职场文书
教师个人读书活动总结
2014/07/08 职场文书
领导干部四风问题自我剖析材料
2014/09/25 职场文书
酒店温馨提示语
2015/07/14 职场文书
python绘制简单直方图(质量分布图)的方法
2022/04/21 Python