【问题标题】:React.js - Redux Hooks Invalid Hook CallReact.js - Redux Hooks 无效的 Hook 调用
【发布时间】:2020-02-12 04:07:13
【问题描述】:

我正在尝试在组件的渲染函数中使用useDispatch

import { useDispatch } from 'react-redux';

我有一个尝试在onChange 上使用Dispatch 的输入

onChange={() => useDispatch()(update("test"))}

当 onChange 被触发时,我得到这个错误:

无效的挂钩调用。钩子只能在函数组件的主体内部调用。这可能是由于以下原因之一:

  1. 您的 React 和渲染器版本可能不匹配(例如 React DOM)
  2. 您可能违反了 Hooks 规则
  3. 您可能在同一个应用中拥有多个 React 副本
import React, {
    Component
} from 'react';
import {
    useDispatch
} from 'react-redux';
import {
    update
} from '../store/actions';
class Something extends Component {
    render() {
        return (<input onChange={() => useDispatch()(update("test"))}/>)
    }
}

export default Something;

【问题讨论】:

  • useDispatch 是您构建的自定义挂钩还是来自任何其他库?
  • @ArupRakshit - 来自redux 标签,大概是this one
  • 来自 react-redux。
  • @T.J.Crowder 谢谢。我希望我能在我的日常工作中使用这个很棒的 React.. :( 无论如何很高兴知道.. 我现在正在研究它。
  • Hooks can only be called inside of the body of a function component.

标签: reactjs typescript redux react-redux


【解决方案1】:

是的,你没有正确使用它,试试这个:

const dispatch = useDispatch()

...
onChange={() => dispatch(update("test"))}

documentation of useDispatch,有使用示例。

【讨论】:

  • 不起作用。 31 | 32 | render() { &gt; 33 | const dispatch = useDispatch(); | ^ 34 | return (
  • @Hobey823 显示更多代码,可能会对我们有所帮助。 :)
  • 此代码执行 OP 代码所做的事情。唯一的区别是您已将其分成单独的部分。OP 的代码调用useDispatch,然后立即调用它返回的函数。你的代码只是先把它放在dispatch,然后调用它。(你和OP都忽略了文档的注释,你可能希望useCallback在那里避免不必要的渲染......)
  • @T.J.Crowder 是的,(但仅适用于 useDispatch 挂钩,因为它提供了我想只是一个没有任何副作用的函数),但 OP 说,他对 React 警告有问题。他们在那里是因为他的代码违反了钩子规则:reactjs.org/docs/hooks-rules.html 编辑:在我回答的时候,我们不知道 OP 在类组件中使用钩子而不是功能无状态。
【解决方案2】:

问题是您在类组件的render 中使用它。你不能在类组件中使用钩子。这就是错误消息显示的原因

无效的钩子调用。 只能在函数组件的主体内部调用钩子。

(我的重点)。类组件不是函数组件。 (这有点容易错过,如果可能的原因列表特别提到类组件会很好。)

所以你想让它成为一个函数组件:

import React, {
    Component
} from 'react';
import {
    useDispatch
} from 'react-redux';
import {
    update
} from '../store/actions';
function Something() {                                              // ***
    return <input onChange={() => useDispatch()(update("test"))}/>; // ***
}                                                                   // ***

export default Something;

还要注意the documentation中的警告,上面会导致不必要的渲染,你应该使用useCallback

import React, {
    Component,
    useCallback
} from 'react';
import {
    useDispatch
} from 'react-redux';
import {
    update
} from '../store/actions';
function Something() {
    const dispatch = useDispatch();            // ***
    const handleChange = useCallback(          // ***
        () => dispatch(update("test")),        // ***
        [dispatch]                             // ***
    );                                         // ***
    return <input onChange={handleChange}/>;   // ***
}

export default Something;

【讨论】:

  • 是的..就是这样。我不知何故闻到了一些相关的东西,OP 没有向我们展示。所以我要求 OP 显示更多代码,然后打开错误源。 :)
  • 我如何才能在一个简单的函数中使用状态?
猜你喜欢
  • 2021-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-02
  • 2022-01-06
  • 1970-01-01
  • 2021-12-18
  • 2023-02-14
相关资源
最近更新 更多