亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在父組件購物車狀態更新時,如何防止我的產品列表重新呈現?

在父組件購物車狀態更新時,如何防止我的產品列表重新呈現?

皈依舞 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 關注
  • 232 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號