Javascript Redux vs定制钩子
我同时学习了react和Redux,并在Redux上“全力以赴”;基本上所有的状态都存储在。我遵循标准的Javascript Redux vs定制钩子,javascript,reactjs,redux,architecture,react-redux,Javascript,Reactjs,Redux,Architecture,React Redux,我同时学习了react和Redux,并在Redux上“全力以赴”;基本上所有的状态都存储在。我遵循标准的allid,byId状态形状模式 我的应用程序非常以数据为中心,它与API对话,并执行许多CRUD类型的操作—fetchAll、fetchById、add、update和delete API通信被隔离到“服务层”模块中,该模块是其自己的npm包。对该服务层的所有调用都在Redux操作中,使用 我意识到没有必要将大部分内容都放在Redux中,例如,数据确实需要放在特定组件上。我很想简化这个架构
allid
,byId
状态形状模式
我的应用程序非常以数据为中心,它与API对话,并执行许多CRUD类型的操作—fetchAll、fetchById、add、update和delete
API通信被隔离到“服务层”模块中,该模块是其自己的npm包。对该服务层的所有调用都在Redux操作中,使用
我意识到没有必要将大部分内容都放在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...
}
当我开始在reducer中设置更新操作的状态时,我意识到如果使用“allid”和“byId”模式会更容易
在这一点上,我想-这和使用Redux有什么不同
它最终看起来几乎是完全相同的代码,我失去了一些选择器的功能,但消除了redux thunks的复杂性。我当前的redux操作包括特定的用例操作(例如,为项目类型X进行特殊保存),所以我需要为这些操作找到一个位置
我的问题是-是否有任何理由使用本地状态将其重构为一个钩子 在Redux中存储状态的优点:
- 您可以全局访问和修改它
- 即使在卸载组件后,它仍然存在
在组件中存储状态的优点:
- 在状态中可以有多个具有不同值的组件,这可能是您想要的
- …或者您甚至可以在一个组件中有多个相同类型的挂钩李>
- 您不需要在文件之间切换。根据代码的组织方式,对于使用它的组件,Redux可以分为3个文件+1个文件-虽然这有助于保持代码的良好结构以适应复杂的用例,但对于跟踪简单的状态来说,这可能是一种过分的做法。必须在多个文件之间切换才能处理一个组件会降低您的工作效率(我不喜欢在IDE中为我处理的每个功能跟踪4个选项卡)
- (此外,挂钩是新的和酷的。)
- 您需要在多个组件之间共享状态(或计划在将来共享)
- 即使使用状态的组件已卸载,也需要保持状态
但这并不意味着您需要重构整个代码库。如果您认为您的代码足够简洁,并且喜欢它的组织方式,或者如果您不确定将来是否需要全局状态,您可以将其保留在Redux中—这没有什么错 对我来说,这真的归结为三件事:
将上下文处理卸载到Redux是我展望未来的一大优势。
如果您的应用程序非常以数据为中心,我不会忽略redux devtools和其他中间件(我个人喜欢redux observable)。
当你的应用程序变得越来越复杂时,你会想了解损坏的状态更新和意外触发多次的状态。
但话说回来,只有你才能评估你自己的应用程序的复杂性,以及它在未来的发展方向 这篇文章的其余部分是“个人品味”,但我会补充一下 就我个人而言,我喜欢使用Redux的原因与前面提到的不同。
不久前,我使用Redux时根本没有使用React,而且还使用了一个可能没有人听说过的框架,即Salesforce的Lightning web components框架。
关键在于它将状态管理和视图逻辑保存在单独的库中。
我个人并不赞成成为瑞士军刀 React对我来说的核心优势是它是一个具有虚拟DOM的视图库,目的明确,而现在。。。那么,这两者之间的界限在哪里才刚刚成为一个固执己见的框架呢?
使用React钩子并不是强制的,但同样是强制的。
如果你使用React,你将使用它的全部,这个问题为这个结论带来了敬意 在这一点上,我想-这和使用Redux有什么不同 所以你重构Redux到
useReducer
hook,然后想知道,为什么我需要这个?
如果你问,那么你可能没有问。也许这就是你问题的答案。
Reducer功能刚刚从状态管理库移动到视图库(或者是吗?)。酷(我想) 不,你不必。 在我看来,如果只是作为一个状态管理库,Redux可以被hook(
useReducers
ect)+本地/共享状态所取代
Redux先于hooks,我们的应用程序已经由Redux实现,您肯定不需要替换它
我们可以计划在新项目中使用hooks+共享状态作为替代方案
我确实遇到了三种情况,分别是:
- 仅限Redux李>
- 仅挂钩李>
- Redux+挂钩李>
希望有帮助。这是相同的模式,但在本地使用。所以这是不同的