深入浅析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 相关文章推荐
innerHTML 和 getElementsByName 在IE下面的bug 的解决
Apr 09 Javascript
jQuery的each终止或跳过示例代码
Dec 12 Javascript
js修改原型的属性使用介绍
Jan 26 Javascript
node.js中的events.EventEmitter.listenerCount方法使用说明
Dec 08 Javascript
给before和after伪元素设置js效果的方法
Dec 04 Javascript
Angular中$broadcast和$emit的使用方法详解
May 22 Javascript
EasyUI中的dataGrid的行内编辑
Jun 22 Javascript
微信小程序遍历Echarts图表实现多个饼图
Apr 25 Javascript
深入解读Node.js中的koa源码
Jun 17 Javascript
基于jquery ajax的多文件上传进度条过程解析
Sep 11 jQuery
jquery添加div实现消息聊天框
Feb 08 jQuery
js实现移动端轮播图滑动切换
Dec 21 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对表单提交特殊字符的过滤和处理方法汇总
2014/02/18 PHP
在WordPress中使用PHP脚本来判断访客来自什么国家
2015/12/10 PHP
PHP 中 DOMDocument保存xml时中文出现乱码问题的解决方案
2016/09/19 PHP
Laravel中日期时间处理包Carbon的简单使用
2017/09/21 PHP
关于PHP虚拟主机概念及如何选择稳定的PHP虚拟主机
2018/11/20 PHP
推荐一些非常不错的javascript学习资源站点
2007/08/29 Javascript
才发现的超链接js导致网页中GIF动画停止的解决方法
2007/11/02 Javascript
IE innerHTML,outerHTML所引起的问题
2009/06/04 Javascript
ExtJS Grid使用SimpleStore、多选框的方法
2009/11/20 Javascript
javascript 窗口加载蒙板 内嵌网页内容
2010/11/19 Javascript
javascript中用星号表示预录入内容的实现代码
2011/01/08 Javascript
14款NodeJS Web框架推荐
2014/07/11 NodeJs
基于jQuery实现音乐播放试听列表
2016/04/14 Javascript
Bootstrap开发实战之第一次接触Bootstrap
2016/06/02 Javascript
表单中单选框添加选项和移除选项
2016/07/04 Javascript
判断输入的字符串是否是日期格式的简单方法
2016/07/11 Javascript
手机端点击图片放大特效PhotoSwipe.js插件实现
2016/08/24 Javascript
基于jQuery实现咖啡订单管理简单应用
2017/02/10 Javascript
深入理解React Native原生模块与JS模块通信的几种方式
2017/07/24 Javascript
微信小程使用swiper组件实现图片轮播切换显示功能【附源码下载】
2017/12/12 Javascript
Vue2.0仿饿了么webapp单页面应用详细步骤
2018/07/08 Javascript
帮你彻底搞懂JS中的prototype、__proto__与constructor(图解)
2019/08/23 Javascript
利用打码兔和超人打码自封装的打码类分享
2014/03/16 Python
python使用matplotlib绘制热图
2018/11/07 Python
QML用PathView实现轮播图
2020/06/03 Python
python支持多继承吗
2020/06/19 Python
python 中的9个实用技巧,助你提高开发效率
2020/08/30 Python
CSS3实现网站商品展示效果图
2020/01/18 HTML / CSS
巧克力领导品牌瑞士莲美国官网:Lindt Chocolate美国
2016/08/25 全球购物
为什么在使用动态 SQL 语句时必须为低层数据库对象授予权限
2012/12/13 面试题
2013年入党人员的自我鉴定
2013/10/25 职场文书
趣味运动会加油词
2015/07/18 职场文书
高三毕业感言
2015/07/30 职场文书
优质服务心得体会(共4篇)
2016/01/22 职场文书
Mysql数据库索引面试题(程序员基础技能)
2021/05/31 MySQL
在 SQL 语句中处理 NULL 值的方法
2021/06/07 SQL Server