美文网首页
12-消息订阅与发布

12-消息订阅与发布

作者: 荆承鹏 | 来源:发表于2022-07-19 23:49 被阅读0次

    1. 定义

    消息订阅与发布是一种组件间通信的方法。适用于任意组件。
    pubsub 是由两个单词组成:publish 和 subscribe 发布和订阅。
    设计思路:订阅者可以理解为接收数据的组件,发布者理解为提供数据的组件。在订阅者组件里预定一个消息名,然后是一个回调函数;当发布者组件里调用相同的消息名的时候,订阅者的回调函数被执行。这个过程中实现通信。
    目前第三方由很多库是可以实现这个功能的,比如 pubsub

    2. 使用步骤

    1. 安装第三方库:npm i pubsub-js
    2. 引入:import pubsub from "pubsub-js"
    3. 接收数据的组件:A组件想要接收数据,则在A组件中订阅消息,订阅的回调留在 A 中
    methods(){
      demo(data){....}
    }
    ...
    mounted(){
      this.pid = pubsub.subscribe('xxx',this.demo) //订阅消息
    }
    
    1. 提供数据:pubsub.publish('xxx', 数据)
    2. 最好在 beforeDestroy·钩子中,用pubsub.unsubscribe(pid)去取消订阅。

    3 案例

    说明:兄弟组件 Student, School 和 父级组件 App,现在我们要把Student组件里的 name 数据给到 Student 和 App

    //App.vue
    <script>
    //import 引入所有组件
    import Student from './components/Student.vue'
    import School from './components/School.vue'
    import PubSub from 'pubsub-js'
    export default {
        name: "App", // 给app组建命名为 App
        //注册注册组件 components: { School,Student },
        components: {School,Student},
        data(){
          return {
            msg:"你好啊",
          }
    
        },
        mounted(){
         this.pid = PubSub.subscribe("studentName2", (name,data)=>{
            console.log('我是app组件,我收到了发布者的信息', name,data)
            this.msg = this.msg + data
          })
        },
        beforeDestroy(){
          PubSub.unscribe(this.pid)
        }
    
    }
    </script>
    
    //School.vue
    <script>
    import PubSub from 'pubsub-js'
    export default {
        name:"School",
        data(){
            return {
                msg2: "尚硅谷",
                address:"长安区"
            }
        },
        mounted(){
            this.pid = PubSub.subscribe('studentName1', (name,data)=>{
                console.log('我是订阅组件,从发布组件接收到了信息', name,data)
            })
        },
        beforeDestroy(){
            PubSub.unsubscribe(this.pid)
        }
    
    }
    </script>
    
    //Student.vue
    <script>
    import PubSub from 'pubsub-js'
    export default {
        name: "Student",
        data(){
            return {
                name: "Jackie",
                age:18
            }
        },
        methods: {
            //把数据给School组件
            sendStudentName(){
                PubSub.publish('studentName1',this.name)
            },
            //把数据给App组件
            sendNameToApp(){
                PubSub.publish('studentName2',this.name)
            }
        }
    }
    </script>
    

    相关文章

      网友评论

          本文标题:12-消息订阅与发布

          本文链接:https://www.haomeiwen.com/subject/laxeirtx.html