Vue组件通信

67 阅读1分钟

1、父组件向子组件传值

props透传属性

  • 在父组件中使用了这个组件,并传入class、style、事件监听器会透传到该组件里的根元素上(即根元素继承了)
  • 可以通过$attrs来透传到根元素以外的其他元素上、以及指定透传到哪个元素上

问题: props逐级透传

comunication1.jpeg

如何解决: 父组件提供依赖,注入子组件

comunication2.jpeg

  • 注入会在组件自身的状态之前被解析,可以在data()访问到注入的属性
  • 为了避免注入名冲突,最好使用Smbol作为注入名
  • 为了保证提供方和注入方之间的响应性链接,即使得注入保持响应性,需要在provide()这里使用computed()函数提供一个计算属性
communication3.jpeg

插槽

  • 为子组件传递一些片段,由父组件提供内容
  • 插槽内容可以访问到父组件的数据作用域,,但无法访问子组件的数据,因为插槽内容是在父组件中定义的

具体实现方式:

<slot>XXXX</slot>插槽里写的内容为指定默认内容,若父组件没有提供任何插槽内容,便展示默认内容,但要是提供了,便会取代默认内容。

communication4.jpeg

具名插槽

  • 将插槽内容传入到各自指定的目标插槽出口

具体实现方式:

其中的#header表示为 v-slot:header,   #为v-slot的简写 comunication5.jpeg

作用域插槽

  • 想要同时使用父组件域内和子组件域内的数据:让子组件在渲染时将一部分数据提供给插槽

具体实现方式:

communication6.jpeg

这里的v-slot也可以写成解构:v-slot="{text, count }"

  • 具名插槽的话将表示为:v-slot:name="slotProps" 简写为 #name="slotProps"

示例

comunication7.jpeg

2、子组件向父组件通信、调用父组件的方法

子组件使用this.$emit触发自定义事件并传值父组件监听该事件
template> <button @click="submit">click me export default { methods: { submit() { this.$emit('submit',xxx)} }}<Child @submit="submit"> export default { methods: { submit(xxx) {} }}
子组件中直接调用this.$parent父组件:method:{ xxx(){}}; 子组件:   method:{ childFun(){this.$parent.xxx()}

3、父组件直接调用子组件的方法

在子组件标签上添加ref属性,在父组件中可通过该属性调用子组件的方法        method:{ xxx(){this.$refs.child.function()}
通过$emit、$on 子组件中:this.$on('childFun',function(){})  父组件中:<Child ref="child">  method:{ xxx(){this.$refs.child.$emit(childFun)`}