Reactjs Redux Reducer:这是从初始状态切换布尔值的一种可接受的方法吗?
我有一个对象数组作为初始状态。此数组保存用户问题/响应数据。在HTML页面上有一个material ui开关切换,用于控制问题应该是公共的还是私有的。我知道redux建议在操作中保留逻辑,而不是reducer,但这就是我提出的解决方案。“toggleSwitch reducer”是一个可接受的解决方案还是我创建了一个反模式 注意,我使用“reducer helper”而不是“switch语句”来减少样板代码。 先谢谢你。我对redux很陌生Reactjs Redux Reducer:这是从初始状态切换布尔值的一种可接受的方法吗?,reactjs,redux,react-redux,reducers,Reactjs,Redux,React Redux,Reducers,我有一个对象数组作为初始状态。此数组保存用户问题/响应数据。在HTML页面上有一个material ui开关切换,用于控制问题应该是公共的还是私有的。我知道redux建议在操作中保留逻辑,而不是reducer,但这就是我提出的解决方案。“toggleSwitch reducer”是一个可接受的解决方案还是我创建了一个反模式 注意,我使用“reducer helper”而不是“switch语句”来减少样板代码。 先谢谢你。我对redux很陌生 // ACTION export const togg
// ACTION
export const toggleQuestion = (questionId) => {
return {
type: TOGGLE_QUESTION,
payload: {
questionId
}
}
}
//REDUCER
const initialState = [{
id: '1',
firstName: 'James',
lastName: 'Smith',
question: 'Ask a question here?',
response: 'This is an answer to the question',
public: true,
created: '2019-23-11T01:50:00+00:00',
modified: null
},
{
id: '2',
firstName: 'Taylor',
lastName: 'Johnson',
question: 'Ask another question here?',
response: 'Here is another answer to another question',
public: true,
created: '2019-23-11T01:50:00+00:00',
modified: null
}
];
const toggleSwitch = (state, payload) => {
return [
...state.map((item) => {
if (item.id === payload.questionId) {
return Object.assign(item, {
public: !item.public
})
}
return item
})
]
}
export default createReducer(initialState, {
[CREATE_QUESTION]: createQuestion,
[UPDATE_QUESTION]: updateQuestion,
[DELETE_QUESTION]: deleteQuestion,
[TOGGLE_QUESTION]: toggleQuestion
});
// HELPER TO CREATE THE REDUCER
export const createReducer = (initialState, fnMap) => {
return (state = initialState, {
type,
payload
}) => {
const handler = fnMap[type];
return handler ? handler(state, payload) : state
}
}
简单的答案是,如果你连续做同样的事情10次,你会得到同样的结果吗
减速机应该是纯的,没有任何副作用,意味着相同的输入,每次都产生相同的输出
根据你的例子,在我看来,相同的动作,针对相同的状态应该产生相同的输出,所以我会说是的,我看不出有任何问题
但是,您可以将该逻辑提取出来,使其仅指示状态作为更新的一部分,即新值应该是什么
目前还不清楚您使用的是什么框架,但React有Saga's和Thunks,Angular有NgRX,为您在减速器之外应用副作用提供了一个“安全”的地方
我经常使用它来创建数据模式,很像数据库。然后,我使用
选择器
从我的商店里为我的组件做很多繁重的工作。这使我可以使我的还原程序非常简单,只关心它们处理的道具的更改。旁注:您正在使用对象对状态进行变异。assign
。它应该是Object.assign({},item,{public:!item.public})
。另外,我认为使用[…state.map(---)]
是多余的。您可以删除括号,只需使用state.map(---)
。谢谢!很有帮助