深入浅析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 相关文章推荐
基于Jquery的实现回车键Enter切换焦点
Sep 14 Javascript
js分页代码分享
Apr 28 Javascript
javascript Array 数组常用方法
Apr 05 Javascript
AngularJS Module方法详解
Dec 08 Javascript
EasyUI的doCellTip实现鼠标放到单元格上提示单元格内容
Aug 24 Javascript
一步一步封装自己的HtmlHelper组件BootstrapHelper(三)
Sep 14 Javascript
JS实现点击网页判断是否安装app并打开否则跳转app store
Nov 18 Javascript
vue component组件使用方法详解
Jul 14 Javascript
如何重置vue打印变量的显示方式
Dec 06 Javascript
微信小程序实现打卡日历功能
Sep 21 Javascript
vue实现输入一位数字转汉字功能
Dec 13 Javascript
js实现简单图片拖拽效果
Feb 22 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 第二节 数据类型之数值型
2012/04/28 PHP
PHP 获取文件路径(灵活应用__FILE__)
2013/02/15 PHP
浅析php中常量,变量的作用域和生存周期
2013/08/10 PHP
php增删改查示例自己写的demo
2013/09/04 PHP
php将access数据库转换到mysql数据库的方法
2014/12/24 PHP
php采集中国代理服务器网的方法
2015/06/16 PHP
php文件系统处理方法小结
2016/05/23 PHP
PHP使用finfo_file()函数检测上传图片类型的实现方法
2017/04/18 PHP
PHP实现基本留言板功能原理与步骤详解
2020/03/26 PHP
关于UTF-8的客户端用AJAX方式获取GB2312的服务器端乱码问题的解决办法
2010/11/30 Javascript
JQuery datepicker 使用方法
2011/05/20 Javascript
node.js中的events.emitter.listeners方法使用说明
2014/12/10 Javascript
同一个网页中实现多个JavaScript特效的方法
2015/02/02 Javascript
真正好用的js验证上传文件大小的简单方法
2016/10/27 Javascript
解决Vue.js 2.0 有时双向绑定img src属性失败的问题
2018/03/14 Javascript
php中and 和 &amp;&amp;出坑指南
2018/07/13 Javascript
vue+element-ui+axios实现图片上传
2019/08/20 Javascript
JS实现轮播图效果
2020/01/11 Javascript
JavaScript组合模式---引入案例分析
2020/05/23 Javascript
python选择排序算法实例总结
2015/07/01 Python
Python元组操作实例分析【创建、赋值、更新、删除等】
2017/07/24 Python
python实现Windows电脑定时关机
2018/06/20 Python
使用Template格式化Python字符串的方法
2019/01/22 Python
python实现AES加密与解密
2019/03/28 Python
python根据时间获取周数代码实例
2019/09/30 Python
Python连接Oracle之环境配置、实例代码及报错解决方法详解
2020/02/11 Python
详解pytorch中squeeze()和unsqueeze()函数介绍
2020/09/03 Python
香港No.1得奖零食网:香港零食大王
2016/07/22 全球购物
Lime Crime官网:美国一家主打梦幻精灵系的彩妆品牌
2019/03/22 全球购物
波兰品牌鞋履在线商店:Eastend.pl
2020/01/11 全球购物
公司外出活动方案
2014/08/14 职场文书
2015幼儿园新学期寄语
2015/02/27 职场文书
初中生思想道德自我评价
2015/03/09 职场文书
上手简单,功能强大的Python爬虫框架——feapder
2021/04/27 Python
Java Dubbo框架知识点梳理
2021/06/26 Java/Android
Python+Selenium实现抖音、快手、B站、小红书、微视、百度好看视频、西瓜视频、微信视频号、搜狐视频、一点号、大风号、趣头条等短视频自动发布
2022/04/13 Python