Я пытаюсь изменить состояние флажка при изменении, но оно не меняется. Похоже на эта картинка. Вот мой InitialState
const initialState = {
isLoading: false,
showAlert: false,
products: [],
totalProducts: 0,
numOfPages: 1,
select: false,
};
Вот мой контекстный код
const toggleProduct = (e) => {
const id = e.target.id;
dispatch({ type: TOGGLE_PRODUCT, payload: { id } });
};
Редуктор
if (action.type === TOGGLE_PRODUCT) {
return {
...state,
products: state.products.map((product) => {
if (product._id === action.payload.id) {
return { ...product, select: !state.select };
} else {
return product;
}
}),
};
}
И как посмотреть ввод
<input
type='checkbox'
name={name}
defaultChecked={select}
id={_id}
onChange={toggleProduct}
/>
Если ввод просто проверен, он не работает, ввод не выбран, но если defaultChecked, я могу выбрать ввод, но состояние не меняется (пожалуйста, посмотрите на скриншот). заранее спасибо
@ jsN00b правильно указано в комментарии, состояние проверки всех четырех продуктов контролируется одним контролируемым элементом, а именно select key
, но обычно каждый продукт должен иметь свой собственный атрибут select, например:
const initialState = {
isLoading: false,
showAlert: false,
products: [
// hard code the data for now
{_id: 1, productName: "productOne", select: false},
{_id: 2, productName: "productTwo", select: false},
{_id: 3, productName: "productThree", select: false},
],
totalProducts: 0,
numOfPages: 1
// select: false, ⬅ we don't need select in here now
};
// reducer
if (action.type === TOGGLE_PRODUCT) {
return {
...state,
products: state.products.map((product) => {
if (product._id === action.payload.id) {
return { ...product, select: !product.select }; // only toggle select for THE product
} else {
return product;
}
}),
};
}
Итак, для каждого продукта в массиве
products
есть один флажок. Итак, если товаров 4, то и флажков будет 4. И, тем не менее, есть только одна переменнаяselect
логического флага, которая будет определять, отмечены или сняты все 4 флажка. Правильно ли я понимаю?