【问题标题】:Invalid hook call in work with local Storage与本地存储一起使用的挂钩调用无效
【发布时间】:2021-03-08 11:29:34
【问题描述】:

我有 3 个文件:

  • 主要组件,
  • 具有存储在本地存储中的状态的文件
  • 具有重置功能的文件,用于将这些相同的状态重置为默认值 价值观。

我在主组件中导入带有状态和重置文件的文件,一切正常。但是当我尝试使用重置功能将 localState 值设置为默认值时,我收到错误“错误:无效的挂钩调用。拦截器只能在功能组件的主体内部调用。 "

我阅读了有关 react 的文档,但我不明白错误

第一个文件代码:

import React from "react";
import { LocalStorage } from "./localState";
import { resetLocalStorage } from "./resetLocalState";

function App() {
  const localState = LocalStorage(); // local storage keys
  const resetState = () => resetLocalStorage(); // reset local storate states

  return (
    <div>
      <button onClick={() => resetState()}>Refresh State to default</button>
      <br />
      <button
        onClick={() => localState.setLocalStorageState("State was changed")}
      >
        Change State
      </button>
      <p>{localState.localStorageState}</p>
    </div>
  );
}

export default App;

第二个文件代码:

import { useState, useEffect } from "react";

const useLocalStorageList = (key, defaultValue) => {
  const stored = localStorage.getItem(key);
  const initial = stored ? JSON.parse(stored) : defaultValue;
  const [value, setValue] = useState(initial);

  useEffect(() => {
    localStorage.setItem(key, JSON.stringify(value));
  }, [key, value]);

  return [value, setValue];
};

//local storage keys
export const LocalStorage = () => {
  const [localStorageState, setLocalStorageState] = useLocalStorageList(
    "State",
    "Default Value"
  );

  return { localStorageState, setLocalStorageState };
};

第三个文件代码

import { LocalStorage } from "./localState";

export const resetLocalStorage = () => {
  const localState = LocalStorage(); //local storage keys
  localState.setLocalStorageState("Default Value");
};

Link to SandBox

【问题讨论】:

  • 也将 LocalStorage 转换为自定义钩子
  • 自定义挂钩应以“使用”开头。 reactjs.org/docs/hooks-custom.html
  • 重置函数不是一个有效的钩子。 Hooks 必须在函数组件的主体中,Yours 是组件内部函数的一部分。这是不允许的
  • 你想达到什么目的?对于您的用例而言,这在我看来太复杂了
  • @messerbill,那是代码,例如,我的真实代码更大,因此我想将我的代码分成小部分

标签: javascript reactjs import local-storage


【解决方案1】:

我没有看到任何东西可以重置您的 resetLocalStorage() 中的所有状态。我假设您将跟踪所有“本地存储密钥”并为每个定义重置功能。 This example 修改您的钩子以返回第三个函数来重置状态,因此不需要定义另一个重置函数。

【讨论】:

    【解决方案2】:

    https://codesandbox.io/s/smoosh-sound-0yxvl?file=/src/App.js

    我对您的代码进行了一些更改,以实现您想要实现的用例。 (让我知道我的实现足以满足您的用例)

    resetLocalStorage 不是以use 开头的,这就是您收到上一个错误的原因。 将该函数重命名为useResetLocalStorage 后,它仍然无法工作,因为-

    您正在调用按钮的自定义钩子 onClick。这打破了一个反应钩子规则,即react hooks must not be called conditionallyhttps://reactjs.org/docs/hooks-rules.html#only-call-hooks-at-the-top-level

    【讨论】:

    • 您能否解释在设置和重置按钮都直接使用useLocalStorage 时保留resetLocalState.jsx(您也将其名称更改为useResetLocalStorage)有什么意义?
    • resetLocalState.jsx 可以删除。现在不需要了。 (我从重命名作为第一步开始,正如我在回答中提到的那样,它没有用)
    • 我的代码在这里和沙盒上是例如,我的真实代码更大,因此我想将我的代码分成小部分。您的解决方案会起作用,但它会创建很多不必要的代码,因为我有很多状态,如果您应用您的解决方案,那么每个状态都会有自己的 setState,但我想要所有状态(其中大约有 70 个) ) 一键重置为默认值
    猜你喜欢
    • 2020-08-13
    • 1970-01-01
    • 2021-12-07
    • 1970-01-01
    • 2021-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多