我正在try 使用react.js制作Electron 商务购物车,我遇到了以下问题.

const [item, setItems] = useState([]);
const [price, setPrice] = useState(0);


....

const CartItem = (props) => {
        const { img, title, id, price, obj, product1 } = props;
        // obj is counter for the initial number of the item that is 
        // being passed from the parent component
        const [counter, setCounter] = useState(obj);

        

        

        function increment() {
            setPrice(price);
            setCounter((prev) => prev + 1);
            let arr = JSON.parse(localStorage.getItem("cart"));
            arr.push(product1);
            localStorage.setItem("cart", JSON.stringify(arr));
        }

        function decrement() {
            let arr = JSON.parse(localStorage.getItem("cart"));
            let index = -1;
            for (var i = 0; i < arr.length; i++) {
                if (arr[i].title === title) {
                    index = i;
                    break;
                }
            }
            if (index != -1) {
                arr.splice(index, 1);
                setCounter((prev) => prev - 1);
                setPrice((pre) => pre - price);

                localStorage.setItem("cart", JSON.stringify(arr));
            }
        }

        return (
            <div className="p">
                <div className="cartr">
                    {" "}
                    <Link to={`/e-commerce-project/products/${id}`}>
                        <img src={img} alt="" className=" cart-img" />
                    </Link>
                </div>
                <div className="titlee"> {title}</div>
                <div className="cart-price">price : ${price}</div>
                <button className="add-button" onClick={increment}>
                    +
                </button>
                <div className="quantity"> quantity : {counter}</div>
                <button className="remove-button" onClick={decrement}>
                    -
                </button>
            </div>
        );
    };

此代码块用于增加和减少添加到购物车中的商品,然后更改价格,但仅当我使用它时 更新项目编号也在更新但在刷新后显示的价格.

有没有解决这个问题的好办法?

我仍然不熟悉react 钩子,所以请原谅我的错误.

我试着寻找解决方案,结果发现两个状态在一个渲染中被更新.

推荐答案

根据我从您的问题中可以理解的是,父组件中的item状态没有正确更新,并且您正在使用localstorage从子组件(购物车)中更新item.

如果上面的内容确实是您的意思,那么您可以通过props将setItems函数从父组件传递到Cart组件,而不是使用localstorage来更新Cart组件中的item.现在,在你的incrementdecrement函数中,你可以直接使用这个setItems函数,这将直接影响你的父组件,并触发你的父组件的重新渲染.

此外,如果将值localstorage用于其他目的,则可以使用一个效果将item状态变量的更改同步到其localstorage计数器部分,该效果将在item状态的值更改时运行(通过使用[Item]作为依赖项数组)

Reactjs相关问答推荐

如何将图像(在代码中称为自己)定位在蓝色圈内的点上?我正在使用material UI和Reaction

为什么登录错误和密码在创建Reaction-Hook-Form后立即被删除?

导致useState中断的中断模式

NextJS如何正确保存添加到购物车中的产品会话

Reaction-路由-DOM v6与v5

shadcn输入+窗体+Zod;一个部件正在改变要被控制的不受控制的输入;

如何在React组件中自动更新图表数据?

无法通过 fetch 获取数据到上下文中

我发送的 prop 的值不会改变.如果成功登录,导航栏中的 prop 必须为 true.我从后端得到 200 ok

在 CrafterCMS Studio 中拖动字段

使用 map 循环浏览列表列表中的列表并显示它们

损坏的图像 React useState

在react 中从外部 api 渲染列表

我正在try 将一组加载程序函数发送到我的路由,它抛出一个错误 Handler is not a funtion in a reactJs application

docker:来 automorphic 护进程的错误响应:未指定命令.的原因是什么?

React CSSTransition 两次创建新页面并在这两个相同的页面上运行转换

react 事件顺序

如何定制 React 热 toastr ?

如何从 extrareducer redux 更改对象中元素的值

运行开发服务器时如何为 Vite 指定运行时目录