use*_*757 5 javascript architecture reactjs redux react-redux
我同时学习了React和Redux,并全力投入Redux。基本上所有状态都存储在Redux中。我跟着标准allIds,byId状态形状图案为这里详述。
我的应用程序非常以数据为中心,它与API通讯,并且执行许多CRUD类型的操作-fetchAll,fetchById,添加,更新,删除。
API通信被隔离到一个“服务层”模块中,该模块是其自己的npm软件包。对该服务层的所有调用都在redux操作中,使用redux-thunk。
我已经意识到不需要将所有内容都放在Redux中,例如,确实需要在特定组件上使用数据。我想简化这种架构。
因此,我开始重构为自定义钩子。似乎因为我的状态形状更多是对象而不是标量,所以我应该使用useReducer而不是useState...
// reducer
// -------------------------
const initialState = {
adding: false,
updating: false,
deleting: false,
error: null,
items: null
};
const reducer = (state, action) => {
// implementation omitted for brevity. . .
}
const useItemsApi = () => {
const [state, dispatch] = useReducer(reducer, initialState);
// wrapped in useCallback because called in component's useEffect
const fetchItems = useCallback(async (options) => {
try {
const resp = apiService.fetchItems(options);
} catch (err) {
if(err.status === 401)
// send to login screen
else
dispatch({type: 'error', payload: err});
}
}, [options]);
// addItem, updateItem, deleteItem, etc...
const actions = {fetchItems, updateItem, addItem, deleteItem};
return [state, actions];
};
// component
// -------------------------
const component = (props) => {
const [state, actions] = useItemsApi();
const {fetchItems, updateItem, addItem, deleteItem} = actions;
useEffect(() => {
fetchItems()
}, fetchItems);
// omitted for brevity...
}
Run Code Online (Sandbox Code Playgroud)
当我需要在化简器中为更新操作设置状态时,我意识到如果使用“ allIds”和“ byId”模式会更容易。
在这一点上,我想-与使用Redux有什么不同?
最终看起来几乎是完全相同的代码,并且我失去了选择器的某些功能,但消除了redux-thunk的复杂性。而且我当前的redux动作包括特定的用例动作(例如,对于类型X的特殊保存),因此我需要为这些地方找到一个位置。
我的问题是-是否有任何理由使用本地状态将其重构为一个钩子?
在 Redux 中存储状态的优点:
在组件中存储状态的优点:
因此,如果满足以下条件,请使用 Redux:
在其他情况下,您可能更愿意将状态保留在 React 中(钩子或其他方式),因为它们会稍微简化您的代码。
但这并不意味着您需要重构整个代码库。如果你认为你的代码足够简洁并且你喜欢它的组织方式,或者如果你不确定将来是否需要全局状态,你可以将它保留在 Redux 中 - 这没有什么问题!