繁体   English   中英

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

[英]How to remove item from array using localStorage.removeItem?

我正在使用localStorage.setItemlocalStorage.getItem来存储来自API的数据(在我的情况下为设备)以通过页面重置保持不变。 单击设备后,它将存储在购物袋中。 当用户单击包装袋中的设备时,我希望它能够“删除”并从本地存储中删除。 现在它可以正常工作,以便在UI上显示它已被删除,但是当页面刷新时它又回来了,因为它仍在localStorage中。

我试图在我的removeDevice函数中使用localStorage.removeItem(deviceTitle) ,但是它似乎没有任何作用。 这是因为我在componentDidMountlocalStorage.getItem吗? 如果是这样,我该如何进行更改以使removeItem函数起作用?

在onClick函数中调用addDevice() (请让我知道是否需要查看代码的那一部分)

  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中删除设备,该页面恢复为第一张图像

您正在将项目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));
  };

因为设置项目,如果它在那里替换它的值检查在这里

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM