深入了解组件- -- 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 ...
随机推荐
- git使用过程中问题
git提交文件命令顺序 fetch merge add commit pull push 取消已add文件 git reset HEAD 文件名 覆盖本地文件 git checkout 文件名 $ g ...
- js和jQuery以及ajax的小练习
今天学习了通过鼠标的点击事件然后让边框变颜色,还有怎么设置一个点击浏览器的输入框然后显示一个边框,还学习了通过ajak来获取post和get的值,通过它如何调用这个函数. 第一部分: 通过鼠标的点击让 ...
- Redis-GEO
一. Redis的GEO特性 Redis3.2版本提供了GEO功能,支持存储地理位置信息用来实现诸如摇一摇,附近位置这类依赖于地理位置信息的功能.二. 命令2.1 增加地理位置信息 命令:geoadd ...
- 2019-10-4-C#-极限压缩-dotnet-core-控制台发布文件
title author date CreateTime categories C# 极限压缩 dotnet core 控制台发布文件 lindexi 2019-10-04 14:59:36 +080 ...
- matlab之原始处理图像几何变换
(一)图像几何变换理论知识 (1)图像的平移与比例 图像的平移很简单,平移前后的坐标分别为(x,y)和(x',y'),则满足的关系式为 x'= x +Tx: y'= y +Ty: 其中Tx与Ty分别为 ...
- Array.prototype.splice()
splice() 方法通过删除或替换现有元素或者原地添加新的元素来修改数组,并以数组形式返回被修改的内容.此方法会改变原数组. 在1位置上添加一项 我们没有下标为4的项,这个超了,就在最大项后面添加这 ...
- 便携版Mysql安装
目录 1.安装 0.Mysql下载地址 1.解压 2.在主目录下新建data和tempData两个文件夹 3.配置环境变量 4.配置my.ini 5.安装服务(管理员模式CMD) 6.清空data文件 ...
- Python的字符串修改报错:TypeError: 'str' object does not support item assignment
Python中想修改字符串的最后一个字符,使用name[-1] = 'e'来实现,运行后报错. 报错内容是:TypeError: 'str' object does not support item ...
- leetcode-337-打家劫舍三*
题目描述: 方法一:递归 # Definition for a binary tree node. # class TreeNode(object): # def __init__(self, x): ...
- [JZOJ4913] 【GDOI2017模拟12.3】告别
题目 描述 题目大意 给你两个排列AAA和BBB,每次随即选三个数进行轮换操作,问mmm次操作内使AAA变成BBB的概率. 思考历程 首先随便搞一下,就变成了AAA中每个数回归自己原位. 一眼望去,感 ...