【问题标题】:How to remove item from array using localStorage.removeItem?如何使用 localStorage.removeItem 从数组中删除项目?
【发布时间】:2019-09-21 09:34:40
【问题描述】:

我使用localStorage.setItem 和localStorage.getItem 来存储来自API 的数据(在我的例子中是设备),以便在页面重置时保持不变。当一个设备被点击时,它会被存储到一个购物袋中。当用户单击包中的设备时,我希望它能够“删除”并从本地存储中删除。 现在它的工作原理是在 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 中删除

【问题讨论】:

  • 在大多数情况下setState 不会立即更新状态,因此您应该在其回调参数中更新localStorage,请参阅reactjs.org/docs/…

标签: javascript arrays reactjs api storage


【解决方案1】:

您正在将项目 list 设置为您的设备阵列。但是如果你删除它,你会尝试删除设备名。

您可以删除一个项目的方法是将其从数组中删除,然后调用localStorage.setItem("list", JSON.stringify(array));,数组中没有您要删除的元素。

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

【讨论】:

  • 哦,好吧,我想我想得太深了。我试过了,这行得通,但由于某种原因并没有删除我点击的最后一个项目。你知道为什么会这样吗?例如我有:Airpods、Macbook、iPhone,然后我删除 iPhone 然后 Macbook,但是当我重置页面时,Macbook 仍然存在。
【解决方案2】:

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

【讨论】:

  • 谢谢!我已经尝试过这种方式,但由于某种原因不允许我移除最后一个设备......你知道为什么会这样吗?如果需要,我已经更新了我的问题以包含更多代码。
【解决方案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));
  };

因为设置项如果存在它会替换它的值检查here

【讨论】:

猜你喜欢
  • 2021-10-19
  • 2016-09-07
  • 1970-01-01
  • 2016-10-30
  • 2021-08-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多