深入浅析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 Ajax方法调用 Asp.Net WebService 的详细实例代码
Apr 27 Javascript
EASYUI TREEGRID异步加载数据实现方法
Aug 22 Javascript
jquery html动态生成select标签出问题的解决方法
Nov 20 Javascript
JS将所有对象s的属性复制给对象r(原生js+jquery)
Jan 25 Javascript
javascript使用smipleChart实现简单图表
Jan 02 Javascript
JS实现黑色大气的二级导航菜单效果
Sep 18 Javascript
JavaScript获取页面中超链接数量的方法
Nov 09 Javascript
JavaScript的函数式编程基础指南
Mar 19 Javascript
JS组件Bootstrap实现下拉菜单效果代码
Apr 26 Javascript
js微信支付实现代码
Dec 22 Javascript
Node.js 如何利用异步提升任务处理速度
Jan 07 Javascript
vue webpack重写cookie路径的方法
Jul 10 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
咖啡知识大全
2021/03/03 新手入门
PHP 日志缩略名的创建函数代码
2010/05/26 PHP
Laravel5.5新特性之友好报错以及展示详解
2017/08/13 PHP
ThinkPHP3.2框架自定义配置和加载用法示例
2018/06/14 PHP
PHP sdk文档处理常用代码示例解析
2020/12/09 PHP
javascript 无提示关闭窗口脚本
2009/08/17 Javascript
jquery选择符快速提取web表单数据示例
2014/03/27 Javascript
JQuery的attr 与 val区别
2016/06/12 Javascript
js enter键激发事件实例代码
2016/08/17 Javascript
JS锚点的设置与使用方法
2016/09/05 Javascript
Bootstrap 3.x打印预览背景色与文字显示异常的解决
2016/11/06 Javascript
利用js来实现缩略语列表、文献来源链接和快捷键列表
2016/12/16 Javascript
vue监听滚动事件实现滚动监听
2017/04/11 Javascript
JS创建Tag标签的方法详解
2017/06/09 Javascript
node koa2实现上传图片并且同步上传到七牛云存储
2017/07/31 Javascript
vue 数组和对象不能直接赋值情况和解决方法(推荐)
2017/10/25 Javascript
html中通过JS获取JSON数据并加载的方法
2017/11/30 Javascript
基于vue2的canvas时钟倒计时组件步骤解析
2018/11/05 Javascript
VUE接入腾讯验证码功能(滑块验证)备忘
2019/05/07 Javascript
解决antd 表单设置默认值initialValue后验证失效的问题
2020/11/02 Javascript
Python实现Tab自动补全和历史命令管理的方法
2015/03/12 Python
Python爬虫爬取美剧网站的实现代码
2016/09/03 Python
Python处理Excel文件实例代码
2017/06/20 Python
django的分页器Paginator 从django中导入类
2019/07/25 Python
Python中正反斜杠(‘/’和‘\’)的意义与用法
2019/08/12 Python
Pycharm中安装Pygal并使用Pygal模拟掷骰子(推荐)
2020/04/08 Python
python爬虫中url管理器去重操作实例
2020/11/30 Python
TALLY WEiJL法国网上商店:服装、时装及配饰
2019/08/31 全球购物
C++:memset ,memcpy和strcpy的根本区别
2013/04/27 面试题
年度考核自我鉴定
2014/02/02 职场文书
公司财务流程之主管工作流程
2014/03/03 职场文书
简历中个人自我评价分享
2014/03/15 职场文书
晨会主持词
2014/03/17 职场文书
2014年乡镇纪委工作总结
2014/12/19 职场文书
80行代码写一个Webpack插件并发布到npm
2021/05/24 Javascript
Spring Boot优化后启动速度快到飞起技巧示例
2022/07/23 Java/Android