组件参数校验与非Props特性

1.组件参数校验:

父组件向子组件传递内容,子组件可以对这些内容做一些约束,这种约束称为组件参数校验

示例:对传入数据 content 进行约束,必须为 string 类型数据

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>组件参数校验与非Props特性</title>
	<script src="./vue.js"></script>
</head>
<body>
	<div id="root">
	<child content="hello world"></child>	
	</div>	
	<script>
	Vue.component('child',{
		//对 content 进行约束,必须是字符串String类型
		props:{
			content:String
		},
		template:'<div>{{content}}</div>'
	})

	var vm = new Vue({
		el:'#root'
		
		})
	</script>
</body>
</html>

输出:

vue中rules校验数字_html

当更改输入为数字(Number)类型时

<child :content="123"></child>

输出:报错([Vue warn]: Invalid prop: type check failed for prop "content". Expected String, got Number.)

vue中rules校验数字_Vue_02

改变约束条件为输入为 Number 类型,错误消失

props:{
			content:Number
		},

输出:

vue中rules校验数字_字符串_03

若想同时满足条件,加入数组即可

props:{
			content:[Number,String]
		},

同样的,使用对象也可以完成上述功能

props:{
			content:{
				type:String
			}
		},

稍微复杂一些的功能

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>组件参数校验与非Props特性</title>
	<script src="./vue.js"></script>
</head>
<body>
	<div id="root">
	<child ></child>	
	</div>	
	<script>
	Vue.component('child',{
		//对 content 进行约束,必须是字符串String类型
		props:{
			content:{
				type:String,
				required:false,  //不传递数据
				default:'default value' //属性content不传递值时的输出内容
			}
		},
		template:'<div>{{content}}</div>'
	})

	var vm = new Vue({
		el:'#root'
		
		})
	</script>
</body>
</html>

输出:

vue中rules校验数字_字符串_04

再复杂一点的功能(对输入内容的长度进行约束)

Vue.component('child',{
		//对 content 进行约束,必须是字符串String类型
		props:{
			content:{
				type:String,
				
				validator:function(value){
					return (value.length > 5)
	//对 content 属性通过校验器进行校验,value 是传入的内容,要求传入的内容长度必须 > 5
	
				}
			}
		},
		template:'<div>{{content}}</div>'
	})

当输出为 hello world 时满足条件,不报错

vue中rules校验数字_html_05

当输出为 hell 时,不满足条件,报错

vue中rules校验数字_字符串_06

2.Props特性

当父组件调用子组件,通过属性向子组件传值的时候(传递了 content),如果子组件里写了对父组件内容的接收(在 Props 中声明了 content),父子组件之间有对应关系,这种对应关系就称为 Props特性;

Props特性的特点:1.content 在 DOM 结构中不显示

<body>
	<div id="root">
	<child content="hell"></child>	
	</div>

控制台输出:

vue中rules校验数字_vue中rules校验数字_07

特点2:父组件传递 content ,子组件接收 content ,在子组件里可以通过差值表达式的形式来取得 content 中的内容了

将 hell 传给 content ,子组件通过差值表达式来获取到 hell ---Props特性

3.非Props特性

父组件向子组件传递了一个属性,但子组件中并没有 Props 内容,子组件并没有声明要接收父组件传递过来的内容

特点1.如果声明非 Props特性 ,则 content="hell" 为非 Props特性,在子组件中无法获取到 content 内容,故会报错

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>组件参数校验与非Props特性</title>
	<script src="./vue.js"></script>
</head>
<body>
	<div id="root">
	<child content="hell"></child>	
	</div>	
	<script>
	Vue.component('child',{
		
		template:'<div>{{content}}</div>'
	})

	var vm = new Vue({
		el:'#root'
		
		})
	</script>
</body>
</html>

vue中rules校验数字_字符串_08

2.特点2:声明非 Props特性,这个属性会展示在子组件最外层的 DOM 标签HTML 属性里面

template:'<div>hello</div>'

输出:

vue中rules校验数字_字符串_09