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
);
};