vue非父子组件间通信

非父子组件间通信主要有两种一种是Provide和Inject,另一种是Mitt全局事件总线

Provide和Inject用于和子孙组件间通信

无论层级结构有多深,父组件都可以作为其所有子组件的依赖提供者
父组件有一个provide 选项来提供数据;
子组件有一个inject 选项,来开始使用这些数据;
下面上代码:
在父组件中定义provide定义数据

<template>
  <div>
    <home></home>
  </div>
</template>

<script>
import home from "./home.vue"
  export default {
    provide(){
      return{
        name:"ws",
      age:18,
      length:this.list.length
      }
    },
    components:{
      home
    },
    data(){
    return{
      list:[1,2,3,4,5,6,7,8]
    }
    }
  }
</script>

<style scoped>

</style>

在孙子组件使用

<template>
  <div>
    <h2>{{name}}-{{age}}-{{length}}</h2>
  </div>
</template>

<script>
  export default {
    inject:["name","age","length"]
  }
</script>

<style scoped>

</style>

注意:父组件里面的provide是对象形式是不能使用this拿取当前组件data里面的数据的。如果要使用data里面的数据可以使用函数形式。

Mitt全局事件总线可以在在任何组件间通信

vue3从实例中移除了$on,$off,$once方法,所以如果我们希望继续使用全局事件总线,要通过第三方库,
vue3官网推荐我们使用mitt或者tiny-emitter
使用Mitt:
首先安装Mitt第三方库:npm install --save mitt
然后在utils文件夹下创建js文件,引入mitt

import mitt from 'mitt'
export const emitter3 = mitt()

可以在组件中引入使用

<template>
  <div>
    <H2>about</H2>
    <Home></Home>
  </div>
</template>

<script>
import Home from '@/04_事件总线的使用/Home'
import {emitter3} from '../../utils/eventBus'
  export default {
    created(){
      emitter3.on('why',(indo)=>{
        console.log(indo)
      })
    },
    components:{
      Home
    }
  }
</script>

在另一个组件中:

<template>
  <div>
     <button @click="btnClick">点击按钮发送</button>
    <h2>孙子组件</h2>
  </div>
</template>

<script>
import {emitter3} from '../../utils/eventBus'
  export default {
    methods:{
      btnClick(){
        console.log("about按钮的点击")
        emitter3.emit('why',{name:19,age:18})
      }
    }
  }
</script>

发送 emitter3.emit(‘why’,{name:19,age:18})
监听:通过 emitter3.on(‘why’,(indo)=>{
console.log(indo)
})

Vue2 非父子组件间通信有以下几种实现方法: - **Event Bus(事件总线)**:创建一个事件总线实例,非父子组件通过这个实例来触发和监听事件。例如,在项目中创建一个 `eventBus.js` 文件: ```javascript import Vue from 'vue'; export const eventBus = new Vue(); ``` 在发送数据的组件中触发事件: ```javascript import { eventBus } from './eventBus.js'; eventBus.$emit('message', 'Hello from another component'); ``` 在接收数据的组件中监听事件: ```javascript import { eventBus } from './eventBus.js'; export default { created() { eventBus.$on('message', (data) => { console.log(data); }); } }; ``` - **Vuex**:是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。使用 Vuex 可以方便地在非父子组件间共享和管理状态。 ```javascript import Vue from 'vue'; import Vuex from 'vuex'; Vue.use(Vuex); const store = new Vuex.Store({ state: { count: 0 }, mutations: { increment(state) { state.count++; } } }); export default store; ``` 在组件中使用: ```javascript export default { computed: { count() { return this.$store.state.count; } }, methods: { increment() { this.$store.commit('increment'); } } }; ``` - **通过 `ref` 在父组件中调用子组件的方法**:在父组件中可以通过 `ref` 来引用子组件实例,从而调用子组件的方法。示例代码如下: ```html <div id="app"> <loading ref="load"></loading> </div> <template id="myalert"> <div> <h2 v-show="flag">加载中...</h2> </div> </template> <script> const loading = { data() { return { flag: true }; }, template: '#myalert', methods: { hide() { this.flag = false; } } }; var vm = new Vue({ // 根实例 el: '#app', data: {}, components: { loading }, mounted() { setTimeout(() => { this.$refs.load.hide(); }, 2000); } }); </script> ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值