vue组件通信这些需要了解

163 阅读1分钟
组件通信

正常的组加件传值可以通过,组件属性绑定的方式,子组件通过props接收。

一级组件如果传值给二级组件的子组件,可以通过props不断的传递,还可以通过$attrs[属性]的方式传递

<my-p :content="$attrs.content"><my-p>
属性比较多的情况
<my-p v-bind="$attrs"><my-p>

父组件如果传值给子组件,传多个, 但子组件接收了其中某个,那么页面渲染会把没有被注册的属性渲染在标签上。可以通过子组件中设置 inheritAttrs,默认是true,设置为false,就不会把没有被注册的属性渲染到标签上了

inheritAttrs:false
vm.$parent

组件内部可以通过this.$parent或者再深一层可以父级组件的数据

vm.$children

可以在mouted中是用, created不能打印出来, 因为created的时候组件还没有被挂载

provide && inject
  1. 父组件通过provide 提供数据
provide: {
	content: 'contentInfo',
	title: 'titleInfo'
}
  1. 子组件通过inject接受注入
inject: ['content']
ref引用
<div ref="dom"></div>

在mounted中可以这样反问设置引用的这个dom ,如果设置相同的多个, 会获取最后一个

mounted() {
	console.log(this.$refs.dom)
}

如果是for循环,得到的ref引用会是一个数组

<!--获取到的是最后一个-->
<div ref="dom"></div>
<div ref="dom"></div>
<!--在mounted中通过this.$refs获取到的是一个数组-->
<div ref="dom" v-for="item in 5"></div>
  • 上面的用法是用在dom上
  • 重点是使用在页面子组件中,
  • 可以获得这个组件的实列, 从而得到这个组件的数据。

通过传递函数让子组件传参执行,父组件回调

$listeners

上面的方式是通过传递属性函数的方式,

还可以通过$listeners的方式

所有通过v-on绑定的函数都会存放在$listeners里面

<my-cmp @click="func"></my-cmp>
//子组件可以通过$listeners执行父组件的click
methods: {
	handleClick() {
		this.$listeners.click
  }
}
$emit

可以通过$emit通知父组件执行函数,可传递参数

methods: {
	handleClick() {
		this.$emit('click',this.msg)
	}
}
event bus事件总线

首先创建一个vue实列

Vue.prototype.bus = new Vue();
const vm = new Vue({
	el:"#app"
})
  • 某个组件触发事件
this.bus.$emit('click',this.inputVal)
  • 其他组件监听bus的事件
this.bus.$on('click',(val)=>{
	//执行
})

🚬每天分享一点点, 欢迎大家讨论, 共同学习, 有不对的地方,欢迎指出🚬