为了账号安全,请及时绑定邮箱和手机立即绑定

在父组件购物车状态更新时,如何防止我的产品列表重新呈现?

在父组件购物车状态更新时,如何防止我的产品列表重新呈现?

皈依舞 2021-12-12 09:34:47
我有一个Main.js组件,它路由到各种组件,包括Listing.js。Main:它包含添加到购物车的一系列产品作为状态。列表:它是产品的列表。它包含数据库中的所有产品作为状态。我的问题:当我通过点击List组件的按钮将产品添加到购物车,它增加了产品加入购物车,更新状态,车的主要组成部分。这样做后,List组件会重新呈现,并且我会取消访问者在列表中设置的所有过滤器。我想阻止 List 在其父组件的购物车状态更改时重新呈现。你知道如何做到这一点吗?我已经尝试过使用 shouldComponentUpdate,但没有成功。Main.js(父组件)import React from 'react';import {Switch, Route, withRouter, Link} from "react-router-dom";import {List} from "./Listing/List";class Main extends React.Component{    state={        cart:[],    };    removeFromCart = product => //REMOVES PRODUCT FROM CART    {        let cart = this.state.cart;        cart.map(item => {            if(item._id === product._id)            {                item.count--;                return item;            }        });        cart = cart.filter(item => item.count > 0);        this.setState({cart:cart}, () => {sessionStorage.setItem('cart', JSON.stringify(cart));});    };    addToCart = product => //ADD PRODUCT TO CART    {        let cart = this.state.cart;        let productExists = this.state.cart.map(item => {return item._id === product._id}).includes(true);        if(productExists)        {            cart = cart.map(item => {                if(item._id === product._id)                {                    item.count++;                    return item;                }                else                {                    return item;                }            });        }        else        {            product.count = 1;            cart.push(product);        }        this.setState({cart: cart}, () => {sessionStorage.setItem('cart', JSON.stringify(cart));});    };    componentWillMount()    {        if(sessionStorage.getItem('cart')) this.setState({cart:JSON.parse(sessionStorage.getItem('cart'))});    }
查看完整描述

2 回答

?
富国沪深

TA贡献1790条经验 获得超9个赞

如果您将匿名函数传递给componentRoute 中的 prop,它每次都会重新渲染。相反,将您的路线设置为:

<Route path='/listing' render={() => <List addToCart={this.addToCart} />} />

引用反应路由器文档

当您使用组件(而不是渲染或子组件,如下所示)时,路由器使用 React.createElement 从给定组件创建一个新的 React 元素。这意味着如果您为组件 prop 提供内联函数,您将在每次渲染时创建一个新组件。这会导致卸载现有组件并安装新组件,而不仅仅是更新现有组件。使用内联函数进行内联渲染时,请使用 render 或 children 道具


查看完整回答
反对 回复 2021-12-12
?
浮云间

TA贡献1829条经验 获得超4个赞

在 react 的匿名函数中包装元素会导致该元素在每次渲染时重新实例化(在某些情况下)。


我认为问题在于您如何使用该Route组件。使用children道具可能会使这更直观。


<Route path='/listing'>

 <List addToCart={this.addToCart} />

</Route>


查看完整回答
反对 回复 2021-12-12
  • 2 回答
  • 0 关注
  • 312 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号