深入了解组件- -- Prop
gitHub地址:https://github.com/huangpna/vue_learn/example里面的lesson08
一 Prop的大小写(camelCase vs kebab-case)
举个例子:
HTML 中的特性名是大小写不敏感的,所以浏览器会把所有大写字符解释为小写字符。这意味着当你使用 DOM 中的模板时,camelCase (驼峰命名法) 的 prop 名需要使用其等价的 kebab-case (短横线分隔命名) 命名:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>index1</title>
</head>
<body>
<div id="app1">
<blog-post v-bind:post-title="msg"></blog-post>
</div>
</body>
<script src="../js/vue.min.js"></script>
<script>
Vue.component('blog-post',{
props:['postTitle'],
template:'<div>{{postTitle}}</div>'
});
new Vue({
el:'#app1',
data:{
msg:'hello!'
}
})
</script>
</html>
重申一次,如果你使用字符串模板,那么这个限制就不存在了。
二 Prop的类型
举例:
props: ['title', 'likes', 'isPublished', 'commentIds', 'author']
我们除了使用以字符串数组形式列出的prop外,你也可以以对象的形式列出prop:
props: {
title: String,
likes: Number,
isPublished: Boolean,
commentIds: Array,
author: Object
}
三 传递静态和动态Prop
举例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>index2</title>
</head>
<body>
<div id="app2">
<!--静态传值-->
<my-component title="hello"></my-component>
<!--动态传值-->
<my-component v-bind:title="post.title"></my-component>
</div>
</body>
<script src="../js/vue.min.js"></script>
<script>
Vue.component('my-component',{
props:['title'],
template:'<div>{{title}}</div>'
});
new Vue({
el:'#app2',
data:{
post:{
title:'标题'
}
}
})
</script>
</html>
在上述示例中,我们传入的值都是字符串类型的,但实际上任何类型的值都可以传给一个 prop。
举例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>index3</title>
</head>
<body>
<div id="app3">
<!--传入一个数字-->
<component-a v-bind:num="42"></component-a>
<component-a v-bind:num="postsA.a"></component-a> <!--用一个变量进行动态赋值-->
<!--传入一个布尔值-->
<component-b bool></component-b> <!--该 prop 没有值的情况在内,都意味着 `true`-->
<component-b v-bind:bool="false"></component-b>
<component-b v-bind:bool="postsB.a"></component-b>
<!--传入一个数组-->
<component-c v-bind:arr="[221,225,220]"></component-c>
<component-c v-bind:arr="postsC.a"></component-c>
<!--传入一个对象-->
<component-d v-bind:obj="{title:'标题1',content:'内容1'}"></component-d>
<component-d v-bind:obj="postsD.a"></component-d>
<!--传入一个对象的所有属性-->
<component-e v-bind:obj1="postE"></component-e>
<!--等价于-->
<!--<component-e-->
<!--v-bind:id="postE.id"-->
<!--v-bind:title="postE.title"-->
<!--v-bind:content="postE.content"-->
<!--></component-e>-->
</div>
</body>
<script src="../js/vue.min.js"></script>
<script>
/**
* 注意:即便你传入的值是静态的,我们仍然需要 `v-bind` 来告诉 Vue
*
* */
var componentA = {
props:['num'],
template:'<div>传入的数字:{{num}}</div>'
};
var componentB = {
props:{
bool:{
type:Boolean,
default:false
}
},
template:'<div>传入的一个布尔值:{{bool}}</div>'
};
var componentC = {
props:['arr'],
template:'<div>传入的一个数组:<span v-for="item in arr">{{item}} </span></div>'
};
var componentD = {
props:['obj'],
template:'<div>传入一个对象:<span>{{obj.title}}:{{obj.content}}</span></div>'
};
var componentE = {
props:['obj1'],
template:'<div>传入一个对象的所有属性:<span>{{obj1}}</span></div>'
};
new Vue({
el:'#app3',
data:{
postsA:{
a:42
},
postsB:{
a:true
},
postsC:{
a:[226,221,228]
},
postsD:{
a:{
title:'标题一',
content:'内容一'
}
},
postE: {
id: 1,
title: 'My Journey with Vue',
content:'My Journey with Vue'
}
},
components:{
'component-a':componentA,
'component-b':componentB,
'component-c':componentC,
'component-d':componentD,
'component-e':componentE
}
})
</script>
四 单向数据流
占位
五 Prop验证
举例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>index4</title>
</head>
<body>
<div id="app4">
<my-component v-bind:prop-a="12" v-bind:prop-b="'sfsfs'" v-bind:prop-c="'sdfsf'" v-bind:prop-d="45"
v-bind:prop-e="{a:'a'}" v-bind:prop-f="100"></my-component>
</div>
</body>
<script src="../js/vue.js"></script>
<script>
/**
* 注意:这里踩了一个非常大的坑,应该说很无语的坑,在深入了解prop的时候该报错的时候总是没有报错,最开始还以为是自己理解错了,最后看到一篇文章,才想到最初看到的vue安装时看到的如果开发是
* 生产版本会自动所有常见错误相关的警告!----请使用开发版本
* */
Vue.component('my-component',{
props:{
// 基础类型检测 (`null` 意思是任何类型都可以)
propA:Number,
// 多种类型
propB:[String, Number],
// 必填的字符串
propC:{
type:String,
required:true
},
// 带有默认值的数字
propD: {
type: Number,
default: 100
},
//带有默认值的对象
propE:{
type:Object,
default:function () {
return {message:'hello'}
}
},
// 自定义验证函数
propF:{
validator:function (value) {
return value > 10
}
}
},
template:'<div><p>{{propA}}</p><p>{{propB}}</p><p>{{propC}}</p><p>{{propD}}</p><p>{{propE}}</p><p>{{propF}}</p></div>'
});
new Vue({
el:'#app4'
})
</script>
</html>
这里都是通过验证了的,能够全部输出来,而且控制台没有报错。
如果有不符合的,控制台会报错。
例如:
当propA的类型为Number时,而传入的值是一个字符串,这时控制台便会报错:
<my-component v-bind:prop-a="csdsff"></my-component>//传入一个字符串
亦或者验证propF的值必须大于10时,而传入的值小于10,此时也会报错:
<my-component v-bind:prop-f="1"></my-component>
但是这里要特别注意一点:这里踩了一个非常大的坑,应该说很无语的坑,在深入了解prop的时候该报错的时候总是没有报错,最开始还以为是自己理解错了,最后看到一篇文章,才想到最初看到的vue安装时如果是在开发的时候使用生产版本会自动失去所有常见错误相关的警告!
注意那些 prop 会在一个组件实例创建之前进行验证,所以实例的属性 (如 data
、computed
等) 在 default
或 validator
函数中是不可用的。
六 类型检查
type
可以是下列原生构造函数中的一个:
String
Number
Boolean
Array
Object
Date
Function
Symbol
额外的,type
还可以是一个自定义的构造函数,并且通过 instanceof
来进行检查确认。例如:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>index5</title>
</head>
<body>
<div id="app5">
<ul-lik :names="text"></ul-lik>
</div>
</body>
<script src="../js/vue.js"></script>
<script>
function Foo(name) {
this.name = name;
}
Vue.component('ul-lik', {
props: {
names: Foo
},
template: '<div>{{names.name}}</div>'
});
var vm = new Vue({
el: '#app5',
data: {
text: new Foo('zhangsan')
}
});
</script>
</html>
来验证 author
prop 的值是否是通过 new Foo
创建的。
深入了解组件- -- Prop的更多相关文章
- vue深入了解组件——Prop
一.Prop的大小写(camelCase vs kebab-case) HTML中的特性名是大小写不敏感的,所以浏览器会把所有大写字符解释为小写字符.这意味着当你使用DOM中的模板时,cameCase ...
- vue组件 Prop传递数据
组件实例的作用域是孤立的.这意味着不能(也不应该)在子组件的模板内直接引用父组件的数据.要让子组件使用父组件的数据,我们需要通过子组件的props选项. prop 是单向绑定的:当父组件的属性变化时, ...
- VueJs组件prop验证简单理解
今天看了vuejs的组件,看到了prop组件,主要作用是在传入数据的时候对传入的值做判断,写了个小例子. <div id="app"> <my-child :nu ...
- vue中子组件直接修改父组件prop属性bug
在有些时候,子组件直接修改父组件传来的 prop 对象的属性会出现不同步的问题. 比如,父组件传过来的一个对象 checkBoxObj: checkBoxObj:{ checked: false } ...
- Vue - 组件 Prop
组件注册 全局注册 可在多个vue实例中使用 <div id="app"> <my-component></my-component> < ...
- 组件prop检验
Vue.js中的父子组件相信都已经是大家很常用到的功能了, 父组件通过props属性向子组件传值子组件通过自定义事件向父组件传值 那么我们怎么去校验props属性中的类型呢 笔者列出以下几种方法: 1 ...
- 组件Prop验证
<div id="example"> <kkk></kkk> </div> <script src="https:/ ...
- vue-learning:26 - component - 组件三大API之一:prop
组件三大API之一: prop prop的大小写 prop接收类型 字符串数组形式 对象形式: type / required / default / validator prop传递类型: 静态传递 ...
- Vue.js——60分钟组件快速入门(上篇)
组件简介 组件系统是Vue.js其中一个重要的概念,它提供了一种抽象,让我们可以使用独立可复用的小组件来构建大型应用,任意类型的应用界面都可以抽象为一个组件树: 那么什么是组件呢?组件可以扩展HTML ...
随机推荐
- react 组件的生命周期 超简版
组件从被创建到被销毁的过程称为组件的 生命周期: 通常,组件的生命周期可以被分为三个阶段:挂载阶段.更新阶段.卸载阶段: 一.挂载阶段 这个阶段组件被创建,执行初始化,并被挂载到DOM中,完成组件的第 ...
- 二分查找总结及部分Lintcode题目分析 1
进行二分查找课程回顾与总结,包括以下几个方面,二分法的模板总结和解题思路.应用. 二分法模板总结classical binary search: 1. 必须要做的排除极端情况,也就是数组(用A表示)不 ...
- VS2010-MFC(常用控件:标签控件Tab Control 上)
转自:http://www.jizhuomi.com/software/205.html 前面两节讲了树形控件Tree Control,本节开始讲解标签控件Tab Control,也可以称为选项卡控件 ...
- day 49 Bootstrap框架和inconfont、font-awesome使用
Bootstrap框架和inconfont.font-awesome使用 iconfont的使用:https://www.cnblogs.com/clschao/articles/10387580 ...
- Spring中AOP的实现
Spring中整合了AOP的功能,虽然有不足,没有专门做AOP框架的那么完美,但是用一用感觉还是不错的 一些概念: AOP 面向切面编程 aspect 切面/切面类(我个人认为一个真正被解耦的程序,切 ...
- C# 中的三个高级参数 params
params params 关键字可以指定采用数目可变的参数的方法参数. 可以发送参数声明中所指定类型的逗号分隔的参数列表或指定类型的参数数组. 还可以不发送参数. 在方法声明中的 params 关键 ...
- netty 使用Java序列化
SubscribeReq package com.zhaowb.netty.ch7_1; import java.io.Serializable; public class SubscribeReq ...
- 2018-8-10-win10-uwp-如何判断一个对象被移除
title author date CreateTime categories win10 uwp 如何判断一个对象被移除 lindexi 2018-08-10 19:16:50 +0800 2018 ...
- JavaScript特效源码(3、菜单特效)
1.左键点击显示菜单 左键弹出式菜单[推荐][修改显示的文字及链接即可][共2步] ====1.将以下代码加入HEML的<head></head>之间: <style t ...
- android中实现监听的四种方法
(1)自身类作为事件监听器 package cn.edu.gdmec.s07150745.work5; import android.support.v7.app.AppCompatActivity; ...