当localStorage
myCart
数组中有任何更改时,如何立即更新购物车页面数据?这是我的下面的代码
const [cart, setCart] = React.useState([])
React.useEffect(() => {
setCart(JSON.parse(localStorage.getItem('myCart')) || [])
}, [])
页面重新加载时cart
会更新,但新项目添加或更新任何现有项目时不会更新!{p>
如何实现这一目标,如果对“ localStorage”进行任何更改,cart
会立即更新吗?
谢谢。
答案 0 :(得分:4)
您可以将eventlistener添加到localstorage
事件
React.useEffect(() => {
window.addEventListener('storage', () => {
// When local storage changes, dump the list to
// the console.
setCart(JSON.parse(localStorage.getItem('myCart')) || [])
});
}, [])
当存储区域出现时,会触发Window界面的存储事件 (localStorage)已被修改。只有在非其本身的窗口进行更改时,才会触发存储事件。
。
答案 1 :(得分:0)
我认为这是处理这种情况的更好方法。我就是这样处理这种情况的。
在您的组件中,
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
存储不是一件好事。每次更改存储时,在您的代码中,您都必须先获取getItems并将其解析,这需要花费几毫秒的时间才能完成,这会导致UI更新变慢。
在做出反应
localstorage
/ database
加载数据并初始化状态。如果您的addItem()
函数是上述组件(购物车组件)的子组件,那么您可以将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 根据用例,假设您的addItem
函数在Product
组件中声明。.
我建议您使用Redux来处理这种情况。
更新
正如@Matt Morgan在评论部分中所述,使用上下文API更适合这种情况。
但是,如果您的应用程序很大(我假设您正在构建一个电子商务系统),则最好使用像Redux这样的状态管理系统。仅在这种情况下,上下文API就足够了