处理Reducer

双向绑定

在文档的多个例子中,reducer的变更都是通过直接变更state对象,这很好,简化了代码的复杂度,减少了代码量,阅读起来也方便。

  1. (state) => {
  2. state.counter += 1;
  3. }

合并

如果您只想变更部分数据,但又不想一个一个地赋值,那么请使用Object.assign处理

  1. (state, payload) => {
  2. // 请勿使用 return { ...state, ...payload } 的方式!!!
  3. Object.assign(state, payload);
  4. }

?> Q: 为什么要用assign而不用的rest/spread模式?A: 因为state是被监听的数据,如果你使用 return { …state, …payload }; 这种形式,那么相当于返回了新的对象,被监听的那部分数据就无法被解除,最终造成内存溢出


新数据

有时候我们想使用全新的数据代替当前的state,那么请直接返回。

!> 对于新的数据,请务必返回,否则reducer不会改变

  1. (state, payload) => {
  2. return payload;
  3. }

不处理

如果执行Action并非是想改变当前模型的reducer,那么我们可以直接置空

  1. (state) => {
  2. // 不做任何处理
  3. }
  4.  
  5. (state) => {
  6. // 或者返回空
  7. return;
  8. }