我有一些数据作为对象数组。我会用 redux 和 react-redux 对其进行排序或过滤。
我的初始状态:
let initialState = {
persons:[],
active:0,
loading:false,
filter:"",
field:"name",
increase:true
}
由于过滤和排序是针对 UI 的,所以我尝试在容器(智能组件)中实现它。过去几天我在阅读 redux,react-redux 的文档,发现我需要使用reselect。因此,我创建了两个选择器:存储最新排序数据数组的sortData和存储最新过滤数据数组的filterData
选择器的参数 - 选择器监视的字段:
let getPersons = (state) => state.persons
let getFilter = (state) => state.filter
let getField = (state) => state.field
let getIncrease = (state) => state.increase
排序数据:
let sortData = createSelector(
[getPersons, getField,getIncrease],
(persons,field,increase) => {
console.log("SORT");
let sortarr = persons.slice(0);
return sortarr.sort((a , b) => {
if (a[field] > b[field]) return increase ? 1: -1
if (a[field] < b[field]) return increase ? -1:1
return 0
})
})
过滤数据:
let filterData = createSelector(
[sortData,getFilter],
(persons,filter) => {
return persons.filter( p =>{
console.log("FILTER");
return p.name.toLowerCase().indexOf(filter.toLowerCase()) !== -1
})
},
)
我的mapStateToProps:
let mapStateToProps = (state) =>{
let modernState = filterData(state)
return {
activePerson:modernState[state.active],
persons:modernState,
loading:state.loading,
active:state.active
}
}
- 如何在不重新计算的情况下实现此功能?
- 我可以在不重新选择的情况下实现它吗?
PS 我阅读了 Dan Abramov 的示例,但不幸的是,我无法将其应用于解决我的任务。更多代码:在此处输入链接描述