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

发布订阅模式其实与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>
相关推荐
GIS数据转换器5 小时前
地下空间综合管廊运营管理平台
大数据·开发语言·人工智能·经验分享·perl
Wang's Blog10 小时前
Java 项目实战: 交友项目:登录链路回顾与今日任务地图
java·开发语言·状态模式·交友
砚底藏山河11 小时前
python量化:行情数据回溯
java·开发语言·python·金融·maven
今年下半年11 小时前
AI智能体项目实战记录(02):初始化 Python 项目
开发语言·人工智能·python·fastapi
Williamtym11 小时前
PickGo Lab实践:用浏览器、Python和MCP串起机器人搬运仿真
开发语言·python·机器人
DongQiShanRen11 小时前
六根硬件映射(四):归属澄清、两处不一致与卷十一总表
开发语言·人工智能·算法·rust·哈希算法·集成学习
CS创新实验室12 小时前
Python 对象“死“了之后去了哪?——引用计数与分代垃圾回收
开发语言·jvm·python
持敬chijing12 小时前
白盒测试与代码审计-js登录逆向实战
javascript·网络·安全·web安全·网络安全·网络攻击模型
quantdash_cc12 小时前
Pandas 处理分钟级股票行情:从原始数据清洗到 K 线聚合
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
yu_zhidun12 小时前
企业电脑监控软件怎么选:别只看功能清单,先看这 6 个底层能力
开发语言·电脑·php·域智盾系统