【发布时间】:2015-11-23 05:22:27
【问题描述】:
我正在使用 Redux 和 React 开发一个大型应用程序,我决定制作一些可重用的组件,例如自定义复选框和单选按钮。
由于我想将此信息存储到 Redux 存储中以便能够轻松地调试应用程序的状态,并且相同的组件在任何地方都具有相同的功能,因此为每个组件创建 reducer 和操作似乎是个好主意。
然而 Redux reducer 返回一个新状态并将其保存在 store 中,并使用 reducer 的名称作为键,这禁止在同一页面中使用相同的 action 和 reducer 但保持不同的相同类型的多个组件州。
我认为这个问题有两种解决方案:
为我使用的每个组件创建不同的操作和减速器,即使组件和它的功能是相同的。这种解决方案似乎不是一个好的解决方案,因为会有很多冗余代码。
创建具有足够参数的操作,以便能够区分 reducer 中的每个操作,这样只会更改指定的状态部分。
我选择了第二个选项。
CheckBox 组件的操作文件:
import {createAction} from 'redux-actions';
/****** Actions ******/
export const CHANGE_CHECKBOX_STATE = "CHANGE_CHECKBOX_STATE";
/****** Action creators ******/
export const changeCheckboxState = createAction(CHANGE_CHECKBOX_STATE, (block, name, state) => {
return {
block,
name,
state: {
checked: state,
}
};
});
CheckBox 组件的 reducers 文件:
import {handleActions} from 'redux-actions';
import {CHANGE_CHECKBOX_STATE} from './CheckBox.actions';
export const checkBoxComponent = handleActions({
CHANGE_CHECKBOX_STATE: (state, action) => ({
[action.payload.block]: {
[action.payload.name]: action.payload.state
}
})
}, {});
我使用block 指定页面,name 指定特定组件的名称(例如性别)和状态,以及具有新状态的对象。
但是这个解决方案也有一些问题:
- 无法指定每个组件的初始状态,因为状态的键是动态的。
- 具有大量嵌套状态的存储结构非常复杂。
- 按组件而不是按表单聚合数据,这会使调试复杂化,并且在逻辑上不正确。
我没有足够的使用 Redux 和 React 的经验来想出一个更好的解决方案来解决这个问题。但在我看来,我遗漏了一些关于 React-Redux 关系的重要内容,这引发了一些问题:
将这个可重用组件的状态存储到 Redux 存储中是个好主意吗?
将 React 组件与 Redux 操作和 reducer 绑定在一起是不是错了?
【问题讨论】:
-
我不明白您为什么需要像这样存储控件的状态?没有实际数据支持吗?而且这些数据并没有给出关于它是如何渲染的废话?对我来说似乎很臃肿。
-
@ChrisMartin 我试图在这里解释我是如何做出这个决定的,但我也说我知道我做错了什么,我只是不明白它是什么。你能解释一下你会如何设计它吗?也许这样我会看到我的方法有什么问题。感谢您的回复!
标签: javascript reactjs redux