#javascript #reactjs
#javascript #reactjs
Вопрос:
Я хотел бы попросить о помощи. Я новичок в react и застрял при создании обработчика проверки. Мне нужно получить элемент из состояния и выполнить этот обработчик только для выбранного элемента. Я думаю, что при установке / снятии флажка обработчик должен установить состояние — проверено: истина / ложь только для выбранного элемента. Я застрял, как установить состояние для выбранного элемента. Мой обработчик выполняется для всех элементов.
import React, { Component, createContext } from "react";
import uuid from "react-uuid";
import { warehouseProducts } from "./data";
const ProductContext = createContext();
class ProductProvider extends Component {
state = {
products: [],
detailProduct: "",
editItem: "",
isDisabled: true,
checked: true,
};
[...]
checkHandler = (id) => {
const product = this.state.products.filter(item => item.id === id);
this.setState(() => {
return { checked:!this.state.checked };
});
}
Другой компонент, в котором я применяю этот контрольный обработчик:
[...]
<ProductConsumer>
{(value) => (
<>
<td style={{ width: "60px" }}>
<input
type="checkbox"
onChange={()=>value.checkHandler(id)}
defaultChecked={value.checked}
/>
</td>
<td style={{ width: "250px" }}>
<Link to="/products/{id}">
{value.checked ? (
<button
className="View"
onClick={() => value.productDetailHandler(id)}
>
View
</button>
) : (
value.isDisabled
)}
</Link>
Комментарии:
1. Вы намерены для каждого
product
вproducts
иметьchecked
свойство, указывающее, выбрано ли оно или нет?2. ДА. Каждый продукт имеет свойство checked.
Ответ №1:
Чего-то подобного было бы достаточно. Фильтруйте в соответствии с выбранным идентификатором и установите флажок true.
checkHandler = (id) => {
const updatedProducts = this.state.products.map(product => {
if (product.id === id) return { ...product, checked: true };
return { ...product, checked: false};
})
this.setState({ products: updatedProducts });
}
Комментарии:
1. Спасибо. К сожалению, этот обработчик применяется ко всем продуктам.
2. Это просто нужно немного обновить до просто
return { ...product };
, а затемif (product.id === id) return { ...product, checked: !product.checked };
3. Вы имеете в виду: checkHandler = (id) => { const updatedProducts = this.state.products.map((product) => { return { … продукт }; если (product.id === идентификатор) возвращает { … продукт, проверено: !product.checked}; }); this.setState({ products: updatedProducts }); };