Skip to content

1.监听 vuex 中数据的变化,当变化时调用相应的回调函数

如果我们只需要监听数据变化,并把变化后的数据应用到页面上,我们只需要写个计算属性返回 store 中的值就可以了,但是这里的场景是我们要在变化时调用相应的回调函数!(应用场景:封装统一的tabel 并加入分页功能,分页功能可以存在 vuex 中,但是不如直接pubsub发布订阅更好)

错误的思路:

1.使用计算属性,然后用 watch 监听计算属性并调用回调函数 ——> 错误,watch 无法监听 computed 的属性,只能监听 data 中定义的属性!

2.使用 watch 监听 data 中的属性 ——> 错误,data 中取 store 的内容根本无法感知到变化,所以监听不到!

正确的方法:使用 vuex 的subscribe订阅方法

js
created() {
  // 注册监听器,监听 count 的变化
  this.$store.subscribe((mutation, state) => {
    if (mutation.type === "changeHandleSize") { //对应的 vuex 的 mutation方法名,当这个mutation被调用的时候就会触发这个订阅了!
      // 在 handleSize 变化时调用你想要的回调函数
      this.Search();
    }
    if (mutation.type === "changeHandleCurrent") {
      // 在 handleCurrent 变化时调用你想要的回调函数
      this.Search();
    }
  });
},

2.pubsub消息订阅发布的回调函数

基本写法:

js
npm i pubsub-js

import pubsub from 'pubsub-js'

pubsub.publish('eventName',this.name) //发布消息,把this.name作为 data 传过去

methods:{
  methodDemo(msgName,data) {
    console.log('我是School组件,收到了数据:',data)
  }
},
mounted() {
	this.pubId = pubsub.subscribe('eventName',this.methodDemo) //订阅消息传入一个回调函数
},
beforeDestroy() {
  pubsub.unsubscribe(this.pubId) //取消订阅
}

或者这样写:在订阅的时候,直接传入回调函数

js
this.pubId1 = pubsub.subscribe("changeSize", (_, data) => {
  this.pageSize = data;
  this.Search();
});

this.pubId2 = pubsub.subscribe("changeCurrent", (_, data) => {
  this.pageCurrent = data;
  this.Search();
});

注意:如果只是需要通讯,而不需要全局存储状态,那么就用 pubsub 就可以了,不需要用 vuex