请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

想请教老师一点小问题~

  • 老师好~,最近我刚接触react,对于redux的createStore方法的实现方式有一点问题,下面代码是实现方式,代码中的两个注释就是我的两个疑问,希望老师给予指点,谢谢老师~
	/**
	 * createStore方法的实现方式
	 */
	const createStore = (reducer) => {

	  let state;
	  let listeners = [];

	  const getState = () => state;

	  const dispatch = (action) => {
	    state = reducer(state, action);
	    // 1、State 一旦有变化,Store 就会调用监听函数。但如下写法并未监控state的变化,怎样监控state的变化呢?
	    listeners.forEach(listener => listener());
	  };

	  const subscribe = (listener) => {
	    listeners.push(listener);
	    return () => {
	      listeners = listeners.filter(l => l !== listener);
	    }
	  };

	  // 2、这里为什么要调用一下dispatch呢?
	  dispatch({});

	  return { getState, dispatch, subscribe };
	};

正在回答

1回答

第一,state 的变化就是通过 dispatch 来完成的,即:你不能直接 state.a = xxx 这样变,必须通过 dispatch 来触发 state 变化。所以,在 dispatch 中触发 listener 就能触发 subscribe 中订阅的所有函数。、

第二,根据 reducer 初始化 state 的值,因为 state 现在刚刚定义,是 undefined

0 回复 有任何疑惑可以回复我~
  • 提问者 Brannua #1
    嗯嗯,但是对于第一个问题,这里是触发了所有的listener,但是如果只是部分listener需要被触发,能否在这里优化一下呢?
    还有对于第二个问题,初始化调用dispatch方法传入的action是空对象,我理解为根据reducer中switch语句的default分支来计算对吗老师?
    
    对于第二个问题,初始化调用dispatch方法,我发现在redux chrome extension中会有一条init的dispatch记录,和这里的初始化调用对应吗?
    回复 有任何疑惑可以回复我~ 2020-06-02 20:51:20
  • 双越 回复 提问者 Brannua #2
    第一,只触发部分 listener ?你要根据什么规则来筛选,这样不越做越麻烦吗,不建议这样搞。第二,你回复的没问题。
    回复 有任何疑惑可以回复我~ 2020-06-02 21:42:35
  • 提问者 Brannua 回复 双越 #3
    感谢老师!
    回复 有任何疑惑可以回复我~ 2020-06-02 21:43:57
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信