如何使用localStorage.removeItem从数组中删除项目?

3
我使用localStorage.setItemlocalStorage.getItem 存储API中的数据(在我的情况下是设备),以便在页面重置时保持持久化。当点击设备时,它会被存储到购物袋中。 当用户在购物袋中单击设备时,我希望它能够“删除”并从本地存储中移除。
目前,在用户界面上,它显示正在被删除,但当页面刷新后,它还会重新出现,因为它仍然存在于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>
    );
  }
}

以下是翻译的结果:

这是它的屏幕截图: 本地存储中的项目, 在 UI 中删除后的项目 但是当我重置页面时,它会恢复到第一张图片,因为设备没有从localStorage中删除。


在大多数情况下,setState 不会立即更新状态,因此您应该在其回调参数中更新 localStorage,请参见 https://reactjs.org/docs/react-component.html?utm_source=caibaojian.com#setstate - Oblosys
3个回答

1

只需在删除该项后替换数组即可。

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));
  };

因为如果设置项存在,它将替换其值。检查此处


非常感谢,这个方法行得通!您能告诉我.splice函数具体是做什么的吗? - Emily
它从数组中删除一个元素。https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/splice - mooga

0

由于您已经在过滤数据和更新状态,因此可以为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))
  });
};

谢谢!我已经尝试了这种方法,但不知道为什么无法删除最后一个设备...你知道可能是什么原因吗?如果需要,我已经更新了我的问题并包含更多的代码。 - Emily

0

你正在将项目list设置为设备数组。但是如果你删除它,你会尝试删除设备名称。

你可以删除一个项目的方法是从数组中删除它,然后使用不包含要删除元素的数组调用localStorage.setItem("list", JSON.stringify(array));

在这里阅读更多信息:https://developer.mozilla.org/en-US/docs/Web/API/Storage/removeItem


哦,好的,我想我对此想得太深了。我尝试了一下,这个方法可以用,但是不知道为什么最后一个我点击的项目没有被删除。你知道可能是为什么吗?例如,我有:Airpods、Macbook、iPhone,我先删除了iPhone再删除Macbook,但是当我重新加载页面时,Macbook仍然在那里。 - Emily

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接