Redux 重新复制、重新选择和保存缓存数据

Redux 重新复制、重新选择和保存缓存数据,redux,reselect,Redux,Reselect,所以,据我所知,重选适用于不同状态树部分之间的派生状态,或来自不同还原器的派生状态。但是,如果我有类似于: <ul> <li onClick="this.getItems({id: 122})">Item 1 <li onClick="this.getItems({id: 342})">Item 2 <li onClick="this.getItems({id: 8767})">Item 3 <li onClick="this

所以,据我所知,重选适用于不同状态树部分之间的派生状态,或来自不同还原器的派生状态。但是,如果我有类似于:

<ul>
  <li onClick="this.getItems({id: 122})">Item 1
  <li onClick="this.getItems({id: 342})">Item 2
  <li onClick="this.getItems({id: 8767})">Item 3
  <li onClick="this.getItems({id: 12})">Item 4
</ul>
重选 “重新选择”用于避免基于状态计算重新渲染

以下面的代码为例

const mapStateToProps = ({someStateKeys, someEntity}) => {
  return {
    newProp = someStateKeys.map(key => someEntity[key])
  }
}
即使状态未更改,贴图也将返回一个新数组,因此
newProp
键将无法通过对象相等性检查并强制重新渲染

重新选择memoize提供的
createSelector
功能可以在道具未更改的情况下返回相同对象的贴图,从而不会发生重新渲染

使用Redux中间件取消绑定操作 听起来你想要做的可能是限制动作的触发速率

这将只允许每隔
n
ms触发一个操作

一个简单的中间件可能会这样

const pending = {};

const debounceMiddleware = () => next => action => {
  const { debounce } = action.meta || {}; 
  if (!debounce) {
    return next(action);
  }
  if (pending[action.type]) { 
    clearTimeout(pending[action.type]);
  }
  pending[action.type] = setTimeout(
    () => {
      delete pending[action.type];
      next(action);
    },
    debounce 
  );
};

如果缓存了数据,则可以通过getState(redux thunk)检入操作。一些例子
const pending = {};

const debounceMiddleware = () => next => action => {
  const { debounce } = action.meta || {}; 
  if (!debounce) {
    return next(action);
  }
  if (pending[action.type]) { 
    clearTimeout(pending[action.type]);
  }
  pending[action.type] = setTimeout(
    () => {
      delete pending[action.type];
      next(action);
    },
    debounce 
  );
};