gpt4 book ai didi

javascript - 如何防止我的产品列表在父组件更新时重新呈现?

转载 作者:行者123 更新时间:2023-11-30 10:59:20 24 4
gpt4 key购买 nike

我有一个 Main.js 组件,它路由到各种组件,包括 Listing.js

  • Main:它包含添加到购物车的产品数组作为状态。

  • 列表:它是产品列表。它包含数据库中的所有产品状态。

我的问题:当我通过单击 List 组件中的按钮将产品添加到购物车时,它会将产品添加到购物车,更新 cart 的状态主要组件。这样做时,List 组件重新呈现,并且我松开了访问者在列表中设置的所有过滤器。

我想阻止 List 在其父组件的购物车状态发生变化时重新呈现。您知道如何做到这一点吗?

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'))});
}

render() {
return (
<div className='main'>
<Header cart={this.state.cart} />
<Switch>
<Route path='/listing' component={() => <List addToCart={this.addToCart} />} />
</Switch>
</div>
);
}
}

export default withRouter(Main);

List.js,产品列表:

import React from "react";
import {Product} from "./Product";
import Data from '../../Utils/Data';
import {Search} from "./Search/Search";

export class List extends React.Component
{

state = {
serie: '',
products: [],
filteredProducts: [],
};

addToCart = this.props.addToCart;

obtainProducts = (request = {}) => //searches for products in database
{
Data.products.obtain(request).then(products => {
this.setState({products:products, filteredProducts: products});
});
};

displayProducts = () => {
//Only products that has title
const products = this.state.filteredProducts.filter(product => {return product.title;});

//Returns REACT COMPONENT
return products.map(product => {
return <Product
key={product._id}
product={product}
addToCart={this.addToCart}
/>
});
};

searchHandler = (collection, types) =>
{

let filteredProducts = this.state.products;
if(collection.length)
filteredProducts = filteredProducts.filter(product => {return collection.includes(product.series);});
if(types.length)
filteredProducts = filteredProducts.filter(product => {return types.includes(product.type);});

this.setState({filteredProducts: filteredProducts});
};

componentWillMount()
{
//init products collection
this.obtainProducts();
}

render()
{
const productComponents = this.displayProducts();
console.log('test');
return(
<section className='listing'>
<Search searchHandler={this.searchHandler} />
<div className='listing-content grid-4 has-gutter'>
{productComponents}
</div>
</section>
)
}
}

最佳答案

移动 过滤器状态从过滤器组件到主要组件或使用 cookie

关于javascript - 如何防止我的产品列表在父组件更新时重新呈现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58559789/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com