我认为这是处理这种情况的更好方法。这就是我处理这种情况的方式。
在你的组件中,
const [cart, setCart] = useState([]);
React.useEffect(() => {
async function init() {
const data = await localStorage.getItem('myCart');
setCart(JSON.parse(data));
}
init();
}, [])
页面重新加载时会更新购物车,但不会在新项目添加或更新任何现有项目时更新!
我怎样才能做到这一点,如果对“localStorage”进行任何更改,购物车会立即更新?
添加项目时,假设您有一个方法 addItem()
async function addItem(item) {
// Do not update local-storage, instead update state
await setState(cart => cart.push(item));
}
现在添加另一个useEffect()
;
useEffect(() => {
localstorage.setItem('myCart', cart);
}, [cart])
现在,当购物车状态更改时,它将保存到本地存储
addEventListener
在存储上不是一件好事。每次存储更改时,在您的代码中,您都必须获取项目并解析它,这需要几毫秒才能完成,这会导致 UI 更新变慢。
在react中,
- 首先从
localstorage
/加载数据database
并初始化状态。
- 然后根据需要更新代码中的状态。
- 然后监听状态更改以执行任何任务(在这种情况下保存到 localstorage )
如果您的addItem()
函数是上述组件(cart 组件)的子项,那么您可以将setItem
函数作为 prop /传递,或者您可以使用 contex API 或使用 Redux
更新
如果addCart
是另一个组件
- 如果具有
addCart
功能的组件是cart
组件的子组件,请使用props
- https://reactjs.org/docs/components-and-props.html
- 如果具有
addCart
功能的组件不是组件的子cart
组件,则使用上下文 api 在组件之间进行通信 - https://reactjs.org/docs/context.html
- 如果您想以干净和更好的方式管理数据,请使用https://redux.js.org/
根据用例,我假设您addItem
在Product
组件中声明的函数..
我建议您使用 Redux 来处理这种情况。
更新
正如@Matt Morgan 在评论部分所说,使用上下文 API 更适合这种情况。
但是如果你的应用程序很大(我假设你正在构建一个电子商务系统),最好使用像 Redux 这样的状态管理系统。对于这种情况,上下文 API 就足够了