Я использую localStorage.setItem
и localStorage.getItem
для хранения данных (устройства, в моем случае) из API для сохранения после перезагрузки страницы. Когда на устройство нажимают, оно сохраняется в сумке для покупок. Когда пользователь щелкает устройство в сумке, я хочу, чтобы оно могло «удалить» и быть удаленным из локального хранилища. Сейчас он работает так, что в пользовательском интерфейсе он показывает, что его удаляют, но когда страница обновляется, он возвращается, потому что он все еще находится в localStorage.
Я пытался использовать localStorage.removeItem(deviceTitle)
в своей функции removeDevice
, но, похоже, ничего не происходит. Это потому, что у меня есть localStorage.getItem
в componentDidMount
? Если так, как мне изменить это, чтобы функция removeItem
работала?
addDevice()
вызывается во время с помощью функции onClick (пожалуйста, дайте мне знать, если вам нужно увидеть эту часть кода)
addDevice = (e, deviceTitle) => {
const array = Array.from(this.state.bag);
if (array.indexOf(deviceTitle) === -1) {
array.push(deviceTitle);
} else {
return;
}
localStorage.setItem("list", JSON.stringify(array));
this.setState({
bag: array
});
};
Здесь, где устройство должно быть удалено из локального хранилища
removeDevice = (e, deviceTitle) => {
this.setState(prevState => ({
bag: prevState.bag.filter(d => d !== deviceTitle)
}));
localStorage.removeItem(deviceTitle);
};
И это мой componentDidMount (), где хранятся устройства
componentDidMount() {
this.search("");
const storedList = JSON.parse(localStorage.getItem("list"));
console.log(storedList);
const bag = storedList;
this.setState({ bag });
}
РЕДАКТИРОВАТЬ больше кода, добавленного ниже:
render() {
return (
<div>
<form>
<input
type="text"
placeholder="Search for devices..."
onChange={this.onChange}
/>
{this.state.devices.map(device => (
<ul key={device.title}>
<p>
{device.title}{" "}
<i
className="fas fa-plus"
style={{ cursor: "pointer", color: "green" }}
onClick={e => this.addDevice(e, device.title)}
/>
</p>
</ul>
))}
</form>
{this.state.bag.map(device => (
<p key={device.title}>
{device}
<i
className="fas fa-times"
style={{ cursor: "pointer", color: "red" }}
onClick={e => this.removeDevice(e, device)}
/>
</p>
))}
<button onClick={e => this.removeAll(e)}>Remove all</button>
</div>
);
}
}
Вот скриншоты того, как это выглядит: элементы в локальном хранилище, элементы после удаления в пользовательском интерфейсе но когда я перезагружаю страницу, она возвращается к первому изображению, потому что устройства не были удалены из localStorage
3 ответа
Просто замените массив после удаления самого элемента
removeDevice = (e, deviceTitle) => {
this.setState(prevState => ({
bag: prevState.bag.filter(d => d !== deviceTitle)
}));
// actual localStorage item removing
let devicesArray = JSON.parse(localStorage.getItem("list"))
devicesArray.splice(devicesArray.indexOf(deviceTitle), 1)
localStorage.setItem("list", JSON.stringify(devicesArray));
};
Потому что установка элемента, если он там, заменяет его значение, проверьте здесь а>
Поскольку вы уже фильтруете данные и обновляете состояние, вы можете добавить второй аргумент для setState
, который является обратным вызовом. В вашем обратном вызове вы можете получить обновленную сумку из своего штата и установить ее для замены значения в localStorage.
Вы можете сделать это таким образом
removeDevice = (e, deviceTitle) => {
this.setState(prevState => ({
bag: prevState.bag.filter(d => d !== deviceTitle)
}), () => {
const { bag } = this.state;
localStorage.setItem("list", JSON.stringify(bag))
});
};
Вы устанавливаете элемент list
для вашего массива устройств. Но если вы удалите его, вы попытаетесь удалить имя устройства.
Вы можете удалить элемент из массива, а затем вызвать localStorage.setItem("list", JSON.stringify(array));
с массивом без элемента, который вы хотите удалить.
Подробнее читайте здесь: https://developer.mozilla.org/ EN-US / Docs / Web / API / хранение / RemoveItem
Похожие вопросы
Новые вопросы
javascript
По вопросам программирования на ECMAScript (JavaScript / JS) и его различных диалектах / реализациях (кроме ActionScript). Включите все соответствующие теги в свой вопрос; например, [node.js], [jquery], [json] и т. д.