Реагировать. Как обновить состояние щелкнутого элемента

#reactjs

Вопрос:

У меня есть некоторые элементы внутри массива, которые находятся в одном и том же состоянии. Мне нужно обновить только тот, на который я нажал, чтобы добавить еще один товар в свою корзину покупок. Как я могу сделать это, не меняя других?

Мое начальное состояние выглядит так:

 class ShoppingCart extends Component {  constructor() {  super();  this.state = {  isEmpty: true,  cartItems: [],  count: 0,  };  this.getStoredProducts = this.getStoredProducts.bind(this);  this.handleButtonIncrease = this.handleButtonIncrease.bind(this);  }   componentDidMount() {  this.getStoredProducts();  }   handleButtonIncrease() {  this.setState((prevState) =gt; ({  count: prevState.count   1,  }));  }   getStoredProducts() {  const getFromStorage = JSON.parse(localStorage.getItem('cartItem'));  if (getFromStorage !== null) {  this.setState({  cartItems: getFromStorage,  }, () =gt; {  const { cartItems } = this.state;  if (cartItems.length) {  this.setState({ isEmpty: false });  }  });  }  }   render() {  const { isEmpty, cartItems, count } = this.state;  const emptyMsg = (  lt;p data-testid="shopping-cart-empty-message"gt;Seu carrinho está vaziolt;/pgt;  );  return (  lt;divgt;  { isEmpty ? (emptyMsg) : (cartItems.map((item) =gt; (  lt;ShoppingCartProduct  key={ item.id }  id={ item.id }  count={ count }  cartItems={ item }  handleButtonIncrease={ this.handleButtonIncrease }  /gt;  )))}  lt;/divgt;  );  } }   

Ответ №1:

Похоже, это должно быть ShoppingCartProduct его обязанностью. Если вы удалите это count и setCount логику из своего ShoppingCart компонента и создадите их внутри ShoppingCartProducts компонента, каждый из элементов будет иметь свое собственное count состояние, которое можно обновлять независимо.

Еще один способ увидеть это-напрямую изменить каждый cartItem из них , но поскольку вы не указали их формат, невозможно узнать, хранят ли они какую-либо информацию о количестве, поэтому я бы выбрал первый подход.

Ответ №2:

handleButtonIncrease может принять item.id в качестве параметра, чтобы он мог обновить state.cartItems .

 handleButtonIncrease(itemId) {   const cartItems = this.state.cartItems.map(item =gt; {  return item.id === itemId   ? {   // apply changes here for the item with itemId  }  : item  });   this.setState((prevState) =gt; ({  cartItems,  count: prevState.count   1,  }));  }  

После этого также обновите свой обратный вызов:

 handleButtonIncrease={ () =gt; this.handleButtonIncrease(item.id) }