#reactjs #typescript
#reactjs #typescript
Вопрос:
Я новичок в программировании, пока только младший. У меня есть список флажков. И когда я снимаю флажок, я хочу, чтобы флажок был сохранен в моем локальном хранилище. Вот мой сокращенный код, что я делаю не так? Не могу полностью понять, что я написал. Спасибо
export default () => {
const [isDefaultChecked, setDefaultChecked] = useState(true);
const [isChecked, setChecked] = useState();
const [isColumn, setColumn] = useState(true);
const [hiddenColumns, setHiddenColumns] = useState([]);
const [Checked, setIsChecked] = useState([]);
const onCheckboxChange = (key: string, value: boolean) => {
const array = JSON.parse(localStorage.getItem("hiddenColumns"));
// here im trying to check if value = to
if (value) {
const column = hiddenColumns.find((item) => item.value == key);
const filtered = hiddenColumns.filter(
(item) => item.key !== column.key
)
setHiddenColumns(filtered);
if (!value) {
setHiddenColumns([...hiddenColumns, { 'label': key } ]);
}
localStorage.setItem("hiddenColumns", JSON.stringify(key));
}
};
return(
<div>
<Checkbox
defaultChecked={isDefaultChecked}
label="Delivery Methods"
onChange={(value) => onCheckboxChange("delieveryMethods", value)}
/>
</div>
)
Комментарии:
1. Похоже, вы считываете из localStorage массив скрытых значений столбцов (as
array
) и никогда не ссылаетесь на него снова, затем проверяетеvalue
и выполняете некоторые действия, основываясь на его правдивости / ложности, а затем сохраняете в localStorage значение ключа"deliveryMethods"
. Не совсем ясно, какую роль вы ожидаете, что localStorage будет играть здесь. Похоже, вам также не хватает закрытия}
для первогоif
оператора, поэтому также неясно, какова для него условная область.2. понял, спасибо за ваш комментарий 🙂
Ответ №1:
if (!value) {
setHiddenColumns([...hiddenColumns, { 'label': key } ]);
}
localStorage.setItem("hiddenColumns", JSON.stringify(key));
Вы сохраняете один ключ в localStorage, чтобы соответствовать вашему коду, вы должны снова сохранить весь массив.
Теперь вы скрыли массив COLUMNS, который, по-видимому, представляет собой набор { label }, где label является ключом. Кроме того, в нем хранятся только скрытые значения. Итак, в вашем onCheckboxChange, если значение равно true, это означает, что вы должны добавить ключ флажка в массив, а если значение равно false, вы должны его удалить. Следующие коды достигают этого
const onCheckboxChange = (key: string, value: boolean) => {
if (value) setHiddenColumns(hiddenColumns => [...hiddenColumns, { label: key }]);
else setHiddenColumns(hiddenColumns.filter(x => x.label !== key));
};
после этого вы можете добавить перехват useEffect, который будет срабатывать при изменении массива hiddenColumns, который будет поддерживать синхронизацию вашего localStorage с массивом hiddenColumns
React.useEffect(() => {
localStorage.setItem("hiddenColumns", JSON.stringify(hiddenColumns));
}, [hiddenColumns]);
Комментарии:
1. Я объединил ваш код (с некоторыми изменениями) со своим собственным, и это как-то сработало. Спасибо! : D