组件传值
隔代传值
1. v-bind='$attrs'
- 将调用组件时的组件标签上绑定的非props的特性(class和style除外)向下传递。
- 在子组件中应当添加 ==inheritAttrs: false== (避免父作用域的不被认作props的特性绑定应用在子组件的根元素上)。
- vm.$attrs
- 包含了父作用域中 不作为prop被识别的特性。
- 当一个组件没有声明任何prop时,包含所有父作用域的绑定 通过v-bind="$attrs"传入内部组件
例子
//父组件 <child notprops='123' :name=name >
// 子组件 <span></span> // 展示 {"notprops":"123"} <script> inheritAttrs: false, </script>
2. v-bind="$props"
- 将父组件 所有的props下发给 父组件的子组件
- 子组件通过props:{} 定义接收的props
例子
// grandfather <father :name=name /> <script> export default{ data(){return { name: 'wy' }} } </script>
// father <child v-bind="$props" /> <script> export default{ data(){return {}}, props:['name'] } </script>
// child <span> </span> // 显示wy <script> export default{ data(){return {}}, props:['name'] } </script>
3. v-bind ="$listeners"
将组组件标签 自定义事件 向下传递
- 子组件(孙子组件) 可以直接通过
this.$emit(eventName)方式调用
- vm.$listeners 包括了 父作用域中(不含 .native)的v-on监听事件 可以通过 v-on="$listeners" 传入内部组件——在创建更高层次的组件时非常有用。
- ==vue3 弃用== vue3中 $sttrs和$listeners合并
- 例子 vue2
// grandFather
<Father @fun="fun" />
<script>
methods:{
fun(){
console.log('test')
}
}
</script>
// father
<child v-on="$listeners" />
//Child
mounted(){
this.$emit('fun')
}
参考
.sync
- 需要对prop进行“双向绑定”
// 我是父组件 <Child v-bind:title.sync="doc.title"></Child>
// 我是子组件 this.emit('update:title',newTitle)
- 不能和表达式一起用
v-bind:title.sync=”doc.title + ‘!’”
无效
- 不能和字面量对象一起用
v-bind.sync=”{ title: doc.title }”
无效
- 同一个对象设置多个prop
<Child v-bind.sync="doc"></Child>