- 使用
useEffect
实现功能
- 状态定义:
在React组件中,首先定义购物车状态。例如:
import React, { useState, useEffect } from'react';
const ShoppingCart = () => {
const [cartItems, setCartItems] = useState([]);
const [totalPrice, setTotalPrice] = useState(0);
- 计算总价并更新本地缓存:
useEffect
可以依赖cartItems
数组,每当cartItems
变化时(商品数量变化或商品被移除),重新计算总价并更新本地缓存。
useEffect(() => {
const newTotal = cartItems.reduce((acc, item) => acc + item.price * item.quantity, 0);
setTotalPrice(newTotal);
localStorage.setItem('cartData', JSON.stringify({ cartItems, totalPrice: newTotal }));
}, [cartItems]);
- 从本地缓存读取初始数据:
在组件挂载时,从本地缓存读取购物车数据并初始化状态。
useEffect(() => {
const cartData = localStorage.getItem('cartData');
if (cartData) {
const { cartItems, totalPrice } = JSON.parse(cartData);
setCartItems(cartItems);
setTotalPrice(totalPrice);
}
}, []);
- 处理性能问题
- 减少不必要的渲染:
使用
React.memo
包裹子组件,避免子组件在不必要的时候重新渲染。例如,如果有一个显示购物车商品列表的子组件CartItemList
:
const CartItemList = React.memo(({ items }) => {
return (
<ul>
{items.map(item => (
<li key={item.id}>{item.name} - {item.quantity} x {item.price}</li>
))}
</ul>
);
});
- 优化
useEffect
依赖:
确保useEffect
的依赖数组精确,只包含真正影响副作用的变量。例如,如果某个useEffect
中计算总价的逻辑只依赖cartItems
,就不要在依赖数组中添加其他无关变量,避免不必要的副作用执行。
- 节流与防抖:
如果商品数量变化是通过用户频繁操作(如点击增减按钮)触发的,可以使用节流或防抖技术。例如,使用
lodash
库的debounce
函数来延迟计算总价和更新本地缓存的操作,避免短时间内多次不必要的计算和存储。
import { debounce } from 'lodash';
const calculateAndSave = debounce(() => {
const newTotal = cartItems.reduce((acc, item) => acc + item.price * item.quantity, 0);
setTotalPrice(newTotal);
localStorage.setItem('cartData', JSON.stringify({ cartItems, totalPrice: newTotal }));
}, 300);
// 在商品数量变化或商品移除的事件处理函数中调用 calculateAndSave