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


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

    store.js文件

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

    1. export default {
    2. datalist: [], //存放带一个参数的函数集合
    3. //订阅
    4. subscribe(fun) {
    5. this.datalist.push(fun) //将一个带一个参数的函数添加到datalist中
    6. },
    7. //发布
    8. publish(value) {
    9. this.datalist.forEach(fun=>{
    10. fun(value) //遍历datalist中的函数并且立即执行 (函数带几个参数需要自己根据自己的实际情况来决定)
    11. })
    12. }
    13. }

    App.vue组件

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

    1. <template>
    2. <div>
    3. <AChild>AChild>
    4. <BChild>BChild>
    5. div>
    6. template>
    7. <script>
    8. import AChild from "./components/AChild.vue" //导入AChild组件模板
    9. import BChild from "./components/BChild.vue";
    10. export default {
    11. inheritAttrs: false,
    12. data() {
    13. return {
    14. nvaTitle:"首页"
    15. }
    16. },
    17. components: {
    18. AChild,
    19. BChild
    20. }
    21. }
    22. script>
    23. <style>
    24. #app{
    25. width: 100%;
    26. max-width: 95%;
    27. }
    28. * {
    29. margin: 0px;
    30. padding: 0px
    31. }
    32. ul {
    33. list-style: none;
    34. }
    35. body{
    36. display:block
    37. }
    38. style>

    AChild.vue

    1. <script>
    2. import store from "./store.js" //导入store.js
    3. export default {
    4. inheritAttrs: false,
    5. data() {
    6. return {
    7. title: "我是标题"
    8. }
    9. },
    10. mounted(){ //钩子函数,项目一启动立即订阅,只要谁触发了store.publish 发布函数,这里能立即获取到发布的值
    11. store.subscribe((value)=>{
    12. this.title=value; //将发布的值赋值给title
    13. })
    14. }
    15. }
    16. script>
    17. <style scoped>
    18. div{
    19. background: gray;
    20. }
    21. style>

    BChild.vue

    1. <template>
    2. <div>
    3. <ul>
    4. <li v-for="item in titleArr" :key="item" @click="handelClick(item)">{{item}}li>
    5. ul>
    6. div>
    7. template>
    8. <script >
    9. import store from './store';
    10. export default{
    11. inheritAttrs:false,
    12. data(){
    13. return{
    14. titleArr:["首页", "列表", "我的"]
    15. }
    16. },
    17. methods:{
    18. handelClick(item){
    19. store.publish(item); //谁点击了li标签,立即发布数据(我发布的数据就是我点击的li的文本,所以我发布的就是一个文本)
    20. }
    21. }
    22. }
    23. script>

  • 相关阅读:
    智能合约通过getAmountsOut方法获取最近币对价格
    SpringCloud学习笔记 - 消息总线 - Spring Cloud Bus
    Python List 中的append 和 extend 的区别
    如何解决git clone http/https仓库失败(403错误)
    并发编程——1.java内存图及相关内容
    【运维日常】运维必备的 免费 在线画图工具,真的很好用!
    大话设计模式之抽象工厂模式
    企业防护墙管理,有什么防火墙管理工具?
    JavaEE进阶----SpringBoot快速入门
    SpringCloud-NacosFoundation
  • 原文地址:https://blog.csdn.net/Fanbin168/article/details/134031476