如何使用 localStorage.removeItem 从数组中删除项目?
How to remove item from array using localStorage.removeItem?
我正在使用 localStorage.setItem
和 localStorage.getItem
来存储来自 API 的数据(在我的例子中是设备),以便在页面重置时保持不变。单击设备时,它会存储在购物袋中。当用户单击包中的设备时,我希望它能够 "delete" 并从本地存储中删除。
现在它可以工作,因此在 UI 上它显示它正在被删除,但是当页面刷新时它又回来了,因为它仍在 localStorage 中。
我尝试在我的 removeDevice
函数中使用 localStorage.removeItem(deviceTitle)
,但它似乎没有任何作用。这是因为我在 componentDidMount
中有 localStorage.getItem
吗?如果是这样,我该如何改变它以便 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>
);
}
}
以下是它的外观截图:
items in local storage,
items after being removed in the UI
但是当我重置页面时,它会恢复到第一张图片,因为设备没有从 localStorage
中删除
您正在将项目 list
设置到您的设备阵列。但是如果你删除它,你尝试删除设备名称。
您可以删除一个项目的方法是将其从数组中删除,然后调用 localStorage.setItem("list", JSON.stringify(array));
数组没有您要删除的元素。
在此处阅读更多内容:https://developer.mozilla.org/en-US/docs/Web/API/Storage/removeItem
因为您已经在过滤数据和更新状态,所以您可以为 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))
});
};
删除项目本身后简单地替换数组
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));
};
因为设置项(如果存在)会替换它的值检查 here
我正在使用 localStorage.setItem
和 localStorage.getItem
来存储来自 API 的数据(在我的例子中是设备),以便在页面重置时保持不变。单击设备时,它会存储在购物袋中。当用户单击包中的设备时,我希望它能够 "delete" 并从本地存储中删除。
现在它可以工作,因此在 UI 上它显示它正在被删除,但是当页面刷新时它又回来了,因为它仍在 localStorage 中。
我尝试在我的 removeDevice
函数中使用 localStorage.removeItem(deviceTitle)
,但它似乎没有任何作用。这是因为我在 componentDidMount
中有 localStorage.getItem
吗?如果是这样,我该如何改变它以便 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>
);
}
}
以下是它的外观截图: items in local storage, items after being removed in the UI 但是当我重置页面时,它会恢复到第一张图片,因为设备没有从 localStorage
中删除您正在将项目 list
设置到您的设备阵列。但是如果你删除它,你尝试删除设备名称。
您可以删除一个项目的方法是将其从数组中删除,然后调用 localStorage.setItem("list", JSON.stringify(array));
数组没有您要删除的元素。
在此处阅读更多内容:https://developer.mozilla.org/en-US/docs/Web/API/Storage/removeItem
因为您已经在过滤数据和更新状态,所以您可以为 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))
});
};
删除项目本身后简单地替换数组
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));
};
因为设置项(如果存在)会替换它的值检查 here