深入浅析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 CSS 修改学习第四章 透明度设置
Feb 19 Javascript
基于jQuery的可用于选项卡及幻灯的切换插件
Mar 28 Javascript
原生Js实现元素渐隐/渐现(原理为修改元素的css透明度)
Jun 24 Javascript
调用innerHTML之后onclick失效问题的解决方法
Jan 28 Javascript
JS获取当前网页大小以及屏幕分辨率等
Sep 05 Javascript
Jquery Ajax Error 调试错误的技巧
Nov 20 Javascript
创建基于Bootstrap的下拉菜单的DropDownList的JQuery插件
Jun 02 Javascript
JS基于构造函数实现的菜单滑动显隐效果【测试可用】
Jun 21 Javascript
Bootstrap按钮组实例详解
Jul 03 Javascript
Vue结合SignalR实现前后端实时消息同步
Sep 19 Javascript
vue中的 $slot 获取插槽的节点实例
Nov 12 Javascript
Vue $attrs &amp; inheritAttr实现button禁用效果案例
Dec 07 Vue.js
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
使用GROUP BY的时候如何统计记录条数 COUNT(*) DISTINCT
2011/04/23 PHP
php上传大文件失败的原因及应对策略
2015/10/20 PHP
告诉大家什么是JSON
2008/06/10 Javascript
javascript 图片上传预览-兼容标准
2009/06/01 Javascript
IE8 下的Js错误HTML Parsing Error...
2009/08/14 Javascript
javascript Math.random()随机数函数
2009/11/04 Javascript
javascript采用数组实现tab菜单切换效果
2012/12/12 Javascript
js操作table示例(个人心得)
2013/11/29 Javascript
jquery模拟alert的弹窗插件
2015/07/31 Javascript
Javascript验证方法大全
2015/09/21 Javascript
JavaScript隐式类型转换
2016/03/15 Javascript
jquery实现简单的banner轮播效果【实例】
2016/03/30 Javascript
AngularJS下对数组的对比分析
2016/08/24 Javascript
判断js的Array和Object的实现方法
2016/08/29 Javascript
JS锚点的设置与使用方法
2016/09/05 Javascript
前端弹出对话框 js实现ajax交互
2016/09/09 Javascript
一个非常好用的文字滚动的案例,鼠标悬浮可暂停[两种方案任选]
2016/12/01 Javascript
基于JavaScript实现自动更新倒计时效果
2016/12/19 Javascript
使用Bootstrap Tabs选项卡Ajax加载数据实现
2016/12/23 Javascript
JavaScript之面向对象_动力节点Java学院整理
2017/06/29 Javascript
vue双击事件2.0事件监听(点击-双击-鼠标事件)和事件修饰符操作
2020/07/27 Javascript
vue添加自定义右键菜单的完整实例
2020/12/08 Vue.js
vue+element实现动态加载表单
2020/12/13 Vue.js
PYTHON压平嵌套列表的简单实现
2016/06/08 Python
Python冲顶大会 快来答题!
2018/01/17 Python
Pytorch入门之mnist分类实例
2018/04/14 Python
Python双向循环链表实现方法分析
2018/07/30 Python
python 实现读取一个excel多个sheet表并合并的方法
2019/02/12 Python
Python编程快速上手——强口令检测算法案例分析
2020/02/29 Python
浅析NumPy 切片和索引
2020/09/02 Python
Python模块常用四种安装方式
2020/10/20 Python
Bailey帽子官方商店:Bailey Hats
2018/09/25 全球购物
英国领先的维生素和营养补充剂直接供应商:Healthspan
2019/04/22 全球购物
物理分数没达标检讨书
2014/09/13 职场文书
PHP中多字节字符串操作实例详解
2021/08/23 PHP
浅谈 JavaScript 沙箱Sandbox
2021/11/02 Javascript