props 验证
组件的 props
就是组件的参数,为了确保传入的数据在可控的合理范围内,我们需要对传入的 props
的值类型进行必要的验证
Vue.component('my-component', {
props: {
// 基础的类型检查 (`null` 和 `undefined` 会通过任何类型验证)
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 ['success', 'warning', 'danger'].indexOf(value) !== -1
}
}
}
})
非props特性
父传子,但是在复用组件中没有用props来接收
在数据传了的情况下,prop没有就收 就是一个非 prop
特性是指传向一个组件,
但是该组件并没有相应prop
定义的特性,这些 props
会被自动添加到组件的根元素(复用组件的跟元素)上
可以使用 this.$attrs在 复用组建中使用,但是数据多的情况下不这么写,
替换/合并已有的特性
默认情况下,非prop
特性的属性会覆盖组件根元素上同名的内容,但是针对 style
和
class
有特殊的处理,它们会合并(同名外面样式会覆盖,里面的优先级高)
禁用特性继承
如果你不希望组件的根元素继承特性,你可以在组件的选项中设置 inheritAttrs: false
,
我们可以通过组件的 this.$attrs
来获取这些属性,默认是true,如果有面向对象继承true会把继承属性关掉
> 注意 inheritAttrs: false
选项不会影响 style
和 class
的绑定
<div id="app">
<!-- 这里传了数据 -->
<k-div :pages=age :p="00" :a="999" style="background-color: blueviolet;"></k-div>
<div>庄三{{gender()}}</div>
</div>
Vue.component("k-div",{
inheritAttrs:false, //默认true 开启了false后:p="00" :a="999"会在dom中消失
props:['pages'], //正常情况下props这里接收,非prop说的数这里没有接收
template:` <div>{{this.$attrs.a}}
<div style="color:red;background:green">哈哈{{this.$attrs.p}}</div>
<div>呵呵{{p}}</div>
<button @click="getData">点点我</button>
</div>
`,
data(){
return{
name:"这里的data是自身的数据",
p:100, // 有相同的参数名的情况下各使用各的,相互不影响
}
},
methods:{
getData(){
console.log(this.$attrs)//我们可以使用this.$attrs来接收
}
}
})