react + mobx中store的值不能初始化,只能通过刷新界面来重置吗?

我写了一个通用的input组件,有获取验证码还有倒计时的功能。倒计时的时间是存在组件的store里面的。现在的情况是,当我在A页面倒计时了,hashHistory.push()跳转到B页面,其中B页面也有到计时组件,此时B页面就显示的是正在倒计时。最佳的效果是,跳转到B页面时,没有开始倒计时。但是刷新页面之后就没问题了。

想知道以什么方法来达到这个效果。目前我想到的是,在组件componentDidMount的时候重置store,就是写一个action,在action里面把所以observable的数据都手动重置一下。
想问问大神们,还有其他的方法吗?

下面是我的代码:

组件代码:

    class InputStore {

        @observable sendSuccess = false;
        @observable leftTime = 60;
          ......
        
    }
    
    //倒计时
    @action countDown = () => {
        let count = setInterval(()=>{

            if(this.leftTime === 1){

                clearInterval(count);

                runInAction(()=>{
                    this.leftTime = 60;
                    this.sendSuccess = false;
                });

            }

            runInAction(()=>{
                this.leftTime = this.leftTime - 1
            });

        },1000);
    }
    

A页面代码:

   hashHistory.push("/Login");

A、B页面都只是引用这个公用组件

其实不只是公用组件会有这样的问题,同一个页面进入两次也会有这样的问题。比如在A页面上传一张图片,将url保存在了store里面,当第二次进入A页面的时候,上次上传的图片还存在。

我在想有没有什么一劳永逸的方法,不用在每个页面里面去重置store。

17-12-16
经过几天的思考实践,总结出,如果只是少部分的数据需要重置的话,就在componentWillUnmount中调action手动重置(componentDidMount中重置会影响性能)。如果是大量数据需要重置,还是在store中分页面存储数据比较好。

阅读 7.5k
4 个回答

export的应该是class,而不是实例化后的store,在constructor里this.store = new InputStore(),这样每次载入组件都会初始化mobx。

componentDidMount里重置估计会有出现问题,会闪一下;你公用的一个store从A到B的时候store里面已经有值了在第一次渲染的时候还是会渲染上去;可以试试在componentWillUnmount或者componentWillMount里面

  1. 如楼上所说,建议在第一个组件的componentWillUnmount中重置store。
  2. 这个问题的根本原因是,两个组件实例(input组件),共享了store中的一个变量,所以可以使用不同的变量来标识不同页面的input组件实例的状态。当然这种方式会显得冗余些,但store中保存的状态,有一类就是属于UI状态,而UI状态的描述确实会比较冗余,但结构还是比较简单的。

为什么不能初始化呢?
store.js:

import {observable, action} from 'mobx';

class HomeStore {
  @observable num;

  constructor() {
    this.num = 0 //这个就是初始化是可以得到
  }

  @action plus = () => {
    this.num = ++this.num
  }
  @action minus = () => {
    this.num = --this.num
  }
}
const homeStore = new HomeStore()
export {homeStore}

具体也可以看看我的demo:https://github.com/Hancoson/r...

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题