westore icon indicating copy to clipboard operation
westore copied to clipboard

如何在页面监听某个store变化执行某个函数

Open kiros1986 opened this issue 5 years ago • 9 comments

我试过使用onChange,但是不知道要怎么写 有DEMO吗?

kiros1986 avatar Oct 25 '18 09:10 kiros1986

没有。建议使用 onChange

dntzhang avatar Oct 25 '18 09:10 dntzhang

但是onChange是怎么使用 假设我某个页面某个状态需要监听 那要如何使用?

kiros1986 avatar Oct 26 '18 02:10 kiros1986

不对 是监听某个全局 store*

kiros1986 avatar Oct 26 '18 02:10 kiros1986

store.onChange = function(){}

dntzhang avatar Oct 26 '18 02:10 dntzhang

然后我使用的时候 是store里面某个值变化 它都会触发回调 但是我只想store.userInfo变化才回调那要怎么写?

kiros1986 avatar Oct 26 '18 02:10 kiros1986

store.onChange = function(diffResult){
  //根据diffResult里的内容判断。里面有path的
}

dntzhang avatar Oct 26 '18 02:10 dntzhang

多个页面使用会被覆盖

thirking avatar Jan 02 '20 09:01 thirking

@thirking 这是一个全局方法,只需要在一个页面里面注册就行了,甚至于直接在 store.js 里面就可以

littledu avatar Jan 16 '20 11:01 littledu

@thirking 这是一个全局方法,只需要在一个页面里面注册就行了,甚至于直接在 store.js 里面就可以

这个我明白,但是对一些场景不太方便,比如我两个页面分别需要针对这个状态的改变做不同的处理,这个时候,我需要分别在页面内写一个方法来处理。但是onChange只能指向一个方法。

我现在的处理方式,是在globalData中放置一个回调数组,当store触发change事件的时候,遍历执行此数组中的回调。这样我就可以在多个页面中,绑定多个change回调,针对不同页面的情况分别执行相应的处理。

globalData: {
    onStoreChange: []
}
store.onChange =  (e) => {
    app.globalData.onStoreChange.forEach(cb => cb(e))
}

在页面中,我们就可以这样写

app.globalData.onStoreChange.push((e) => {
    ...do some thing
})

以上是我的一点小小的建议,总之感谢分享这个好用的库

thirking avatar Jan 16 '20 12:01 thirking