【问题标题】:How to setup and use local storage in next js如何在下一个 js 中设置和使用本地存储
【发布时间】:2021-05-09 18:32:37
【问题描述】:

谁能帮我解决 Next JS 和 localstorage 的问题。我正在构建一个电子商务应用程序,当用户将商品放入购物篮时,我希望能够将其保存到本地存储中。我当前的实现不起作用,我收到一条错误消息,提示“无法读取未定义的属性 'basket'”。下面是我的代码 sn-p。

export const StateProvider = ({ children }) => {
  const initialState = () => {
    if (typeof window !== 'undefined') {
      return {
        basket:
          window.localStorage.getItem('basket') === null
            ? []
            : window.localStorage.getItem('basket'),
        viwedItems: [],
        saved: [],
      };
    }
  };

  const [state, dispatch] = useReducer(productReducer, initialState());
  const [durationNotification, setDurationNotification] = useState(true);
  const [showMiniBasket, setMiniBasket] = useState(false);

  useEffect(() => {
    window.localStorage.setItem('basket', state.basket);
  }, [state.basket]);

【问题讨论】:

    标签: reactjs next.js local-storage


    【解决方案1】:

    出现问题是因为state在服务器上运行时是undefined,所以在useEffect的依赖数组[state.basket]上设置值时会抛出错误。

    有几种方法可以解决这个问题,但其中之一是如果typeof window !== 'undefined'false,则从initialState 返回一个空对象。

    export const StateProvider = ({ children }) => {
        const initialState = () => {
            if (typeof window !== 'undefined') {
                return {
                    basket:
                    window.localStorage.getItem('basket') === null
                        ? []
                        : window.localStorage.getItem('basket'),
                    viwedItems: [],
                    saved: [],
                };
            }
            return {
                basket: [],
                viewedItems: [],
                saved: []
            }; // Add this so `state` is not undefined on the server-side
        };
    
        const [state, dispatch] = useReducer(productReducer, initialState());
    
        useEffect(() => {
            window.localStorage.setItem('basket', state.basket);
        }, [state.basket]); // Accessing `state.basket` will no longer throw an error
        //...
    }
    

    【讨论】:

    • 感谢您的建议。我尝试实施该解决方案,但现在出现错误,显示为“TypeError:无法读取未定义的属性“长度””。错误消息是指我试图访问我的一个组件的篮子。有没有其他方法可以解决这个问题?
    • 您可以将basket: [] 添加到我添加的行中的空对象中。检查我更新的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-19
    • 2021-06-28
    • 1970-01-01
    • 2021-11-04
    • 2015-09-24
    • 2021-12-28
    相关资源
    最近更新 更多