我有一个使用useState
的迷你购物车应用程序。我现在想重构应用程序的状态,让它由useReducer
管理,并继续使用localStorage
持久化数据。
由于涉及到许多移动的部分,我在弄清楚如何重构方面遇到了麻烦。如何重构addToCartHandler
中的逻辑,以便在ADD_TO_CART
案例中使用?从那里,我相信我能够找出cartReducer
中其他情况的模式。谢谢大家。
https://codesandbox.io/s/goofy-water-pb903?file=/src/App.js
3条答案
按热度按时间m3eecexj1#
使用Context API管理购物车状态
我将首先将您的购物车状态和持久性隔离到react上下文提供程序的本地存储。上下文可以向应用的其余部分提供购物车状态和动作分派器,以及当状态使用效果更新时将状态持久化到localStorage。这将所有状态管理从应用程序中分离出来,应用程序只需要使用上下文来访问购物车状态并调度操作来更新它。
在index.js的
CartProvider
中 Package 应用程序完成应用的其余部分
在
cartReducer
中细化reducer,并导出初始化函数和动作创建器。在
Product.js
中,通过useContext
钩子获取cart上下文并分派addToCart
操作CartItem.js
获取并使用购物车上下文来分派减少数量或删除项目的操作。App.js
通过上下文钩子获取购物车状态和调度器,并更新total items和price逻辑以说明商品数量。vq8itlhq2#
这是我的工作。我添加了cartReducer的所有案例,因为我很喜欢它。
如果您想自己解决这个问题,这里是第一个使用localStorage保存项值的设置的情况。
我正在做的事情的概述是:使用switch case在reducer中设置新的状态,然后在每次通过效果更改购物车时将localStorage状态设置为新值。
产品中的逻辑只是被一个简单的动作调度所取代。因为逻辑反而在减速器中。您可能可以简化
ADD_TO_CART
案例中的逻辑,但它以不可变的方式处理所有事情。使用像immer这样的东西可以将逻辑简化一点。在
App
组件中使用:在
Product
组件中使用:全工作CodeSandbox
envsm3lx3#
下面是我创建的一个简单的useSessionStorage钩子:
这就是你如何使用它:
P.S.将sessionStorage与localStorage交换不会改变钩子的工作方式。