Vue3 coderwhy笔记 12非父子组件通信与插槽

419 阅读2分钟

非父子组件通信 -- 爷孙跨组件通信

provide与inject 在父组件提供依赖,用的较少,一般用Vuex

  • 父组件
- provide:{//与data、methods同级,对象写法用this拿不到data数据
-     name:'123',
-     age: '345',
- }
- provide(){
-     return {
-         name: this.names, //没法响应式
-     }
- }
  • 最终写法
- import { computed } from 'vue';
- export default {
-     provide(){ //默认写法
>     -     return {
>     -         name: computed(() => this.names), //计算属性做包裹,即成响应式数据
>     -     }
>     - }
  • 子孙组件
  • inject:["name","age"]

全局事件总线mitt库

  1. 使用场景:兄弟组件,非父子组件之间,一个组件发生事件,在其他组件监听
  2. 安装
- npm install mitt
  1. 使用
  • 创建封装一个eventbus.js文件
- import mitt from 'mitt';
- const emitter = mitt(); //调用会返回对象
- export default emitter; //导出她
    • A组件(发生事件)
-     import emitter from './xxx'
-     某fn(){
-         emitter.emit('add',{ A:a,B:b }) //定义事件名
-     }
    • B组件
-     import emitter from './xxx'
-     created(){
-         emitter.on("add",(info) => { //对add事件进行监听,info传递过来的数据
-             console.log(info)
-         })
-         emitter.on("*",(type,info) => { //监听所有事件
-             console.log(type,info)
-         })
-     }
  1. 取消监听
- emitter.all.clear() //取消所有
- 
- function onfoo(){}
- emitter.on('foo', onfoo) //监听
- emitter.off('foo',onfoo) //取消

插槽slot

  1. 插槽slot的基本使用

    • 在封装的组件内的html位置写上,在使用组件时,需要在插槽的位置放的东西
    • 可以传组件进去
    • 默认元素,使用i标签
    • 多个slot 插槽会各自分配一份
  2. 具名插槽的基本使用

    • 组件里(子)给slot一个具体的名字
    • 动态插槽思路,使用props传递插槽名,但注意父组件定义v-slot:[name] ,加中括号会解析成value值
    • 缩写v-solt: 替换为 #, 组件<a #name>我是插槽内容
    • 使用组件时(父),需要使用模板
- <template v-slot:left>
-     <span>想要放置的元素或内容</span>
- </template>
  1. 作用域插槽
    • 编译作用域,指的是,父组件拿不到子组件数据
    • 具名插槽加作用域插槽:v-slot:left="slotProps"
    • 解决办法:子组件传递数据给父组件
- 子组件定义属性
- <slot :name="name"></slot>
- 父组件
- <a name="svn1">
-     <template v-slot="slotProps">
-         <span>{{slotProps.name}}</span>
-     </template>
- </a>