代码之家  ›  专栏  ›  技术社区  ›  BeniaminoBaggins

将对象数组保存到javascript本地存储不工作

  •  0
  • BeniaminoBaggins  · 技术社区  · 7 年前

    我正在尝试在本地存储中存储一组对象。我在用 this common method :

    localStorage.setItem( 'products', JSON.stringify(this.state.products) );
    let initialProducts = JSON.parse(localStorage.getItem("products") || "[]")
    

    我得到错误:

    SyntaxError: Unexpected token o in JSON at position 1
    

    我知道这个错误意味着我要分析两次JSON,但是如果我不分析它,当我从本地存储中获得“产品”时,它是:

    [object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
    

    我做错什么了?

    完整代码:

    import React, { Component } from "react";
    import logo from "./logo.svg";
    import "./App.css";
    import ProductList from "../products/ProductList";
    import productData from "../products/model";
    
    class App extends Component {
      constructor(props) {
        super(props);
        let initialProducts = JSON.parse(localStorage.getItem("products") || "[]")
        console.log(initialProducts);
        this.state = {
          newProductName: "",
          newProductPrice: 0,
          products: initialProducts
        };
      }
    
      updateNewProductName = event => {
        this.setState({ newProductName: event.target.value });
      };
    
      updateNewProductPrice = event => {
        this.setState({ newProductPrice: event.target.value });
      };
    
      addProduct = () => {
        this.state.products.push({
          name: this.state.newProductName,
          price: this.state.newProductPrice
        });
        this.setState({
          products: this.state.products
        });
        localStorage.setItem( 'products', JSON.stringify(this.state.products) );
      };
    
      render() {
        return (
          <div className="App">
            <header className="App-header">
              <div className="App-header-container">
                <img
                  src="https://www.ezyvet.com/wp-content/uploads/2016/04/ezyVet-Logo-22-4.png"
                  alt="ezyVet Cloud Veterinary Practice Management Software"
                  id="logo"
                  className="App-logo"
                  data-height-percentage="65"
                  data-actual-width="768"
                  data-actual-height="252"
                />
              </div>
            </header>
            <div className="App-header-container">
              <ProductList products={this.state.products} />
              <input
                type="text"
                id="uname"
                name="uname"
                required
                minLength="2"
                placeholder="name"
                value={this.state.newProductName}
                onChange={this.updateNewProductName}
              />
              <input
                type="number"
                id="uprice"
                name="uprice"
                required
                placeholder="price"
                value={this.state.newProductPrice}
                onChange={this.updateNewProductPrice}
              />
              <button onClick={this.addProduct}>Add Product</button>
            </div>
          </div>
        );
      }
    }
    
    export default App;
    
    1 回复  |  直到 7 年前
        1
  •  0
  •   BeniaminoBaggins    7 年前

    当我在 JSON.parse JSON.stringify

    例如:

    let initialProducts = JSON.parse(JSON.parse(localStorage.getItem("products")));
    localStorage.setItem( 'products', JSON.stringify(JSON.stringify(this.state.products) ));
    

    可能与嵌套在数组中的对象有关。