【问题标题】:Invalid hook call - useContext - React Hooks无效的钩子调用 - useContext - React Hooks
【发布时间】:2020-12-06 13:09:54
【问题描述】:

当我在函数中使用 useContext 时,我收到错误无效的挂钩调用。请找到下面的代码。并提出解决方案。

import React from 'react';
import { AddlistContext } from '@contexts';

const asyncCall = (value) => {
  const context = React.useContext(AddlistContext);
  console.log(value, context);
  return '';
};

Here is the code 在validation.js中使用上下文

我急需帮助。

提前致谢

【问题讨论】:

  • 你试过useAsyncCall吗?很确定这只是你的棉绒。如果没有,就是你打电话的地方。请记住,挂钩只能从组件的生命周期内调用
  • 只能在 react 函数组件或其他 hooks 中使用 hooks。这只是一个功能,所以它不起作用。要么将其转换为组件,要么从函数组件中使用 AsyncCall。
  • 钩子只是函数......组件也是
  • 是的,但是它们需要反应上下文 => 所以它们必须在钩子或函数组件中调用。
  • 正是我的观点。此代码没有任何问题,因此可能是 linter 问题(如果只是警告)或调用位置

标签: javascript reactjs react-hooks


【解决方案1】:

您的 ValueRequired 不是组件,或者至少您没有将其用作组件。目前,您将其称为普通函数。

我知道函数和反应函数组件之间存在很多混淆,因为后者似乎只是一个函数。要创建组件,首先需要的是命名函数,匿名函数不能是组件,首字母大写(doc)。但最重要的是,你需要以一种让 React 渲染它的方式调用它,否则你无法使用 React 功能,如钩子或上下文。

要使 ValueRequired 不抛出错误,您需要这样调用它:

// Somewhere in you're render function
<ValueRequired />

但这并不能解决您的问题。在您的情况下,我认为您应该使用钩子模式,因为它们可以访问上下文:

  1. 创建 useValueRequired 函数
  2. 在您的应用或管理表单的组件中调用它

试试这样的:

const useValueRequired = () => {
    const context = React.useContext(AddlistContext);

    isRequired = value => {
        if (!value) {
            return "value is required";
        }
    }
    
    return {
        isRequired,
    };
}

const App = () => {
    // ...
    const { isRequired } = useValueRequired();
   
    // ...
    <Controller
        render={(props) => {
            return (
                <TextField
                    variant="outlined"
                    label="name"
                    fullWidth
                    {...props}
                    error={errors?.name}
                    helperText={errors?.name?.message}
                />
            );
        }}
        control={control}
        name="name"
        rules={{ validate: isRequired }}
    />

   // ...
}

【讨论】:

  • 嗨 Joessel:它似乎适用于一种方法。如何使用上述解决方案通过多种验证方法?
  • 谢谢@P.E. Joessel.上述解决方案完全符合我的要求
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-09
  • 2020-06-22
  • 2019-09-07
  • 2021-05-08
  • 2020-02-08
  • 2020-02-20
  • 1970-01-01
相关资源
最近更新 更多