非父子组件通信-发布订阅模式

发布订阅模式其实与vue无关,完全是ES6的代码,但是它可以通过这种模式实现非父子组件的通信

store.js文件

首先创建一个store.js文件,用于提供发布与订阅方法

javascript 复制代码
export default {
    datalist: [], //存放带一个参数的函数集合

    //订阅
    subscribe(fun) {
        this.datalist.push(fun) //将一个带一个参数的函数添加到datalist中 
    },

    //发布
    publish(value) {
        this.datalist.forEach(fun=>{  
            fun(value)   //遍历datalist中的函数并且立即执行 (函数带几个参数需要自己根据自己的实际情况来决定)
        })
    } 
}

App.vue组件

我有一个根组件App.vue根组件 它下面有一个AChild.vue子组件,和一个BChild.vue子组件

html 复制代码
<template>
  <div>
    <AChild></AChild>
    <BChild></BChild>
  </div>
</template>
<script>
import AChild from "./components/AChild.vue" //导入AChild组件模板
import BChild from "./components/BChild.vue";
export default {
  inheritAttrs: false,
  data() {
    return {
      nvaTitle:"首页"
    }
  },
  components: {
    AChild,
    BChild
  }
}
</script>
<style>
#app{
  width: 100%;
  max-width: 95%;
}
* {
  margin: 0px;
  padding: 0px
}

ul {
  list-style: none;
}
body{
  display:block
}
</style>

AChild.vue

javascript 复制代码
<template>
    <div>
        {{title}}
    </div>
</template>
<script>
import store from "./store.js" //导入store.js
export default {
    inheritAttrs: false,
    data() {
        return {
            title: "我是标题"
        }
    },
    mounted(){ //钩子函数,项目一启动立即订阅,只要谁触发了store.publish 发布函数,这里能立即获取到发布的值
        store.subscribe((value)=>{
            this.title=value; //将发布的值赋值给title
        })
    }
}
</script>
<style scoped>
    div{
        background: gray;
    }
</style>

BChild.vue

html 复制代码
<template>
    <div>
        <ul>
            <li v-for="item in titleArr" :key="item" @click="handelClick(item)">{{item}}</li>
        </ul>
    </div>
</template>
<script >
import store from './store';
export default{
    inheritAttrs:false,
    data(){
        return{
            titleArr:["首页", "列表", "我的"]
        }
    },
    methods:{
        handelClick(item){
             store.publish(item); //谁点击了li标签,立即发布数据(我发布的数据就是我点击的li的文本,所以我发布的就是一个文本)
        }
    }
}
</script>
相关推荐
To_OC5 小时前
LC 51 N 皇后:我以为难的是回溯,结果栽在了对角线下标
javascript·算法·leetcode
Scott9999HH5 小时前
【IIoT流量实战】蒸汽管道阀门全关却仍有流量?用 Python 实现涡街信号 FFT 频谱分析与温压全补偿积算网关,深度拆解靠谱的涡街流量计厂家硬核技术标准
开发语言·python
码智社6 小时前
AES加密原理详解及Java实现加解密实战
java·开发语言
AI云海6 小时前
python 列表、元组、集合和字典
开发语言·python
小林ixn6 小时前
从零到一理解 React 父子组件通信:手写一个 Todo 应用带你彻底搞懂单向数据流
前端·javascript·react.js
萧瑟余晖7 小时前
JDK 26 新特性详解
java·开发语言
马优晨7 小时前
Freemarker 完整讲解(后端 Java 模板引擎)
java·开发语言·freemarker·freemarker 完整讲解·freemarker模板引擎
窝子面9 小时前
手搓最简前后端协作-node
javascript·数据库
人邮异步社区9 小时前
怎么把C语言学到精通?
c语言·开发语言
kyriewen10 小时前
我让AI给前端项目做了一次完整的Code Review——它和人类的差距,比我想的大得多
前端·javascript·ai编程