Всем привет. Возник вопрос с
reselect для
redux. Сразу оговорюсь, что решил задачу создавая еще одно поле в редьюссере, которое хранило отсортированный/отфильтрованный массив в зависимости от действий.
Однако, я думаю, что как сортировка, так и фильтрация это дело отдельно UI. Соответственно хотелось бы реализовать те же функции, но в контейнере (Smart component).
Начальное состояние корневого редьюсера:
let initialState = {
persons:[],
active:0,
loading:false,
filter:"",
field:"name"
}
1.Сначала с помощью reselect создал два селектора, которые при изменении соответствующих полей вызывали нужные функции:
let getPersons = (state) => state.persons
let getFilter = (state) => state.filter
let getField = (state) => state.field
let filterData = createSelector(
getPersons,
getFilter,
(persons,filter) => {
return persons.filter( p =>{
console.log("FILTER");
return p.name.toLowerCase().indexOf(filter.toLowerCase()) !== -1
})
},
)
let sortData = createSelector(
getPersons,
getField,
(persons,field) => {
console.log("SORT");
let sortarr = persons.slice(0);
return sortarr.sort((a , b) => {
if (a[field] > b[field]) return -1
if (a[field] < b[field]) return 1
return 0
})
})
2. Собственно теперь sortData возвращает отсортированный массив по последнему field и, что важно хранит его значение, что помогает нам избежать лишних вызовов сортировки.
Подобно и fielterData
3. Нужно реализовать фильтрацию последних отсортированных данных и сортировку последних отфильтрованных данных
ссылка на код:
https://github.com/maximusnikulin