【问题标题】:React useContext useReducer state Hooks Error反应 useContext useReducer 状态 Hooks 错误
【发布时间】:2020-09-21 13:32:09
【问题描述】:
import Axios from "axios";
import React, { createContext, useEffect, useReducer, useState } from "react";
import useAsync from "./useAsync";

const [datas, setDatas] = useState(null);

const fatchData = async () => {
  try {
    const response = await Axios.get(
      "https://jsonplaceholder.typicode.com/users"
    );
    setDatas(response.data);
  } catch (e) {
    console.log(e);
  }
};
useEffect(() => {
  fatchData();
  //eslint-disable-next-line
}, deps);
const AppReducer = (state, action) => {
  switch (action.type) {
    default:
      return state;
  }
};
export const GlobalContext = createContext(datas);

export const GlobalProvider = ({ children }) => {
  const [state, dispatch] = useReducer(AppReducer, datas);

  return (
    <GlobalContext.Provider value={{ datas }}>
      {children}
    </GlobalContext.Provider>
  );
};

这是错误。这可能是由于以下原因之一。

  1. 您可能错过了 React 和 Render 的版本(例如 React DOM) 您可能违反了 Hooks 规则 您可能在同一个应用中拥有多个 React 副本。

我想把接收到API的数据作为useReducer的默认值。但是有一个钩子错误。 您不能删除或修改使用 useContext 接收到的数据吗?

如果我使用 Graphql 而不是 restAPI,它会正常工作吗? 有没有使用 useContext 管理从服务器接收到的数据的好方法?

【问题讨论】:

    标签: javascript reactjs react-hooks


    【解决方案1】:

    您需要将每个钩子移动到函数组件的主体中。如果他们在技术上超出了这个范围,他们就违反了钩子规则。进一步了解Rules of Hooks

    不要在循环、条件或嵌套函数中调用 Hooks。相反,请始终在 React 函数的顶层使用 Hooks。通过遵循此规则,您可以确保每次渲染组件时都以相同的顺序调用 Hook。这就是让 React 在多个 useStateuseEffect 调用之间正确保留 Hook 状态的原因。

    尝试如下:

    import Axios from "axios";
    import React, { createContext, useEffect, useReducer, useState } from "react";
    import useAsync from "./useAsync";
    
    export const GlobalContext = createContext(null);
    
    export const GlobalProvider = ({ children }) => {
      const [state, dispatch] = useReducer(AppReducer, datas);
      const [datas, setDatas] = useState(null);
    
      const fatchData = async () => {
        try {
          const response = await Axios.get(
            "https://jsonplaceholder.typicode.com/users"
          );
          setDatas(response.data);
        } catch (e) {
          console.log(e);
        }
      };
    
      useEffect(() => {
        fatchData();
        //eslint-disable-next-line
      }, deps);
    
      const AppReducer = (state, action) => {
        switch (action.type) {
          default:
            return state;
        }
      };
    
      return (
        <GlobalContext.Provider value={{ datas }}>
          {children}
        </GlobalContext.Provider>
      );
    };
    

    【讨论】:

    • export const GlobalContext = createContext(datas);当我需要在其他组件中使用这个变量时,我应该如何定位它?当前位置会导致错误。
    • 这是错误:'datas' 未定义 no-undef !!如果它在里面,你如何在其他组件中使用这个变量?对于其他组件,我们想使用 const { datas } = useContext;
    • 可能我会更改为最初将null 设置为export const GlobalContext = createContext(null),然后提供程序从您的组件中的datas 获取值。
    • @LEE.SANG.MIN 太棒了,乐于助人!如果解决方案有效,请考虑投票或接受作为答案,谢谢!
    猜你喜欢
    • 2019-11-29
    • 1970-01-01
    • 2020-01-27
    • 2021-03-16
    • 2021-01-17
    • 2023-04-04
    • 2021-06-16
    • 2023-01-23
    • 2020-05-16
    相关资源
    最近更新 更多