深入浅析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实现仿Windows关机效果
Mar 10 Javascript
Javascript入门学习资料收集整理篇
Jul 06 Javascript
基于jquery的滚动条滚动固定div(附演示下载)
Oct 29 Javascript
JQuery异步加载无限下拉框级联功能实现示例
Feb 19 Javascript
jquery跟js初始化加载的多种方法及区别介绍
Apr 02 Javascript
jQuery Ajax()方法使用指南
Nov 19 Javascript
JavaScript继承学习笔记【新手必看】
May 10 Javascript
Boostrap实现的登录界面实例代码
Oct 09 Javascript
实现隔行换色效果的两种方式【实用】
Nov 27 Javascript
JS Input里添加小图标的两种方法
Nov 11 Javascript
jQuery封装animate.css的实例
Jan 04 jQuery
AngularJS修改model值时,显示内容不变的实例
Sep 13 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 session_start()关于Cannot send session cache limiter - headers already sent错误解决方法
2009/11/27 PHP
PHP学习笔记(二) 了解PHP的基本语法以及目录结构
2014/08/04 PHP
使用PHP Socket 编程模拟Http post和get请求
2014/11/25 PHP
PHP的mysqli_stat()函数讲解
2019/01/23 PHP
arguments对象
2006/11/20 Javascript
关于捕获用户何时点击window.onbeforeunload的取消事件
2011/03/06 Javascript
15款优秀的jQuery导航菜单插件分享
2011/07/19 Javascript
js中apply方法的使用详细解析
2013/11/04 Javascript
JQuery boxy插件在IE中边角图片不显示问题的解决
2015/05/20 Javascript
使用Node.js配合Nginx实现高负载网络
2015/06/28 Javascript
jQuery EasyUI菜单与按钮详解
2016/07/13 Javascript
JS实现可编辑的后台管理菜单功能【附demo源码下载】
2016/09/13 Javascript
利用yarn实现一个webpack+react种子
2016/10/25 Javascript
jQuery实现标签页效果实战(4)
2017/02/08 Javascript
vue开发调试神器vue-devtools使用详解
2017/07/13 Javascript
Vuex中mutations与actions的区别详解
2018/03/01 Javascript
jQuery.validate.js表单验证插件的使用代码详解
2018/10/22 jQuery
解决layui laydate 时间控件一闪而过的问题
2019/09/28 Javascript
react 不用插件实现数字滚动的效果示例
2020/04/14 Javascript
vue 公共列表选择组件,引用Vant-UI的样式方式
2020/11/02 Javascript
解决vue页面刷新,数据丢失的问题
2020/11/24 Vue.js
在Python下使用Txt2Html实现网页过滤代理的教程
2015/04/11 Python
Python中zfill()方法的使用教程
2015/05/20 Python
Python实现获取域名所用服务器的真实IP
2015/10/25 Python
python提取具有某种特定字符串的行数据方法
2018/12/11 Python
python处理multipart/form-data的请求方法
2018/12/26 Python
python制作图片缩略图
2019/04/30 Python
Python正则表达式学习小例子
2020/03/03 Python
基于Python中random.sample()的替代方案
2020/05/23 Python
澳大利亚制造的羊皮靴:Original UGG Boots
2017/11/13 全球购物
美国首屈一指的礼品篮供应商:GiftTree
2018/01/06 全球购物
年会活动策划方案
2014/01/23 职场文书
学校安全生产月活动总结
2014/07/05 职场文书
群众路线党员个人整改措施
2014/10/27 职场文书
为自己工作观后感
2015/06/11 职场文书
Django给表单添加honeypot验证增加安全性
2021/05/06 Python