我的reducer中的代码如下:
import {ADD_FILTER, REMOVE_FILTER} from "../../../../actions/types";
const removeFilter = (state, name) => {
return state.filter(f => f.name !== name);
};
export default function addRemoveFilterReducer(state = [], action) {
switch (action.type) {
case ADD_FILTER:
let nState = state;
if(state.some(i => i.name === action.searchFilter.name))
nState = removeFilter(state, action.searchFilter.name);
return [...nState, {name: action.searchFilter.name, values: [action.searchFilter.values]}];
//Call another action
case REMOVE_FILTER:
return removeFilter(state, action.searchFilter.name);
default:
return state;
}
}
我有一个组件陈列室,在展厅内我有搜索组件和内容组件。
在搜索组件内部,我处理过滤,并调度一个用此reducer处理的动作。
添加过滤器后,我想调度一个包含所有过滤器的操作。我怎样才能做到这一点?
该操作将使用reducer处理,我只返回符合搜索条件的汽车,并将其显示在内容组件中。
我希望你明白我想说的话。
这种做法是否很好?
答案 0 :(得分:7)
您可以考虑使用redux-thunk。
您将有两个单独的操作,一个用于添加过滤器,另一个用于进行搜索。您的 addFilterAndMakeSearch thunk将负责按顺序调用这些操作。通过这种方式,您无需从减速器发送动作。
// Thunk
function addFilterAndMakeSearch(searchFilter) {
return dispatch => {
dispatch(addFilter(searchFilter);
dispatch(makeSearch());
}
}
// Action Creator One
function addFilter(searchFilter) {
return {
type: 'ADD_FILTER',
payload: searchFilter,
};
}
// Action Creator Two
function makeSearch() {
return {
type: 'MAKE_SEARCH',
};
}
为了完成这项工作,您需要使用 addFilterAndMakeSearch 作为onSubmit处理程序。
答案 1 :(得分:2)
调用动作很可能是副作用操作。由于减速器应遵循函数式编程原则,我认为它不应该触发任何动作。
要解决您的使用案例,您仍然可以从触发更换减速器的地方触发两个动作。我们有时会在我们的应用程序中这样做。例如,您的组件可以触发两个操作,或者操作可以触发两个Redux存储更新。