事件处理程序抛出无效的钩子调用错误

如何解决事件处理程序抛出无效的钩子调用错误

我正在学习 React 并试图在子组件中实现一个简单的 onClick 按钮,只是为了得到一个“无效的钩子调用”。我已经删除了很多程序来隔离问题。

父组件:

import React,{ useState } from "react";
import Menubar from '../Menubar/Menubar'

function SortingVisualizer() {
    const [arr,setArr] = useState([]);

    function newArray() {
        const tempArr = [];
        for(let i = 0; i < 100; i++) {
            tempArr.push(Math.floor(Math.random() * 100) + 5)
        }
        setArr(tempArr);
    }

    return (
        <div id="main-container">

            <Menubar
                data={arr}
            />

        </div>
    )
}

export default SortingVisualizer;

一个模块中的子组件:

import React from "react";

import newArray from '../SortingVisualizer/SortingVisualizer'
import bubbleSort from '../algorithms/bubbleSort'

function Menubar(props) {
return(
    <div id="menubar-container">
        <button id="new-array-button" onClick={() => newArray()}>New Array</button> // Invalid hook error
        <button id="bubble-sort-button" onClick={() => bubbleSort(props.data)}>Bubble Sort</button> // Works fine
    </div>
    )
}

export default Menubar;

当我运行“npm ls react-dom”时,我只返回一个版本,这应该意味着我没有版本不匹配的问题:

`-- react-dom@17.0.2 

我怀疑我违反了一些钩子规则,但不确定是哪一个。如果我不得不猜测,基于我看到的另一个问题,我认为这与钩子只能在顶层使用这一事实有关。我认为我的 onClick for newArray 以某种方式滥用了该钩子规则。

但我不明白的另一件事是……“导入 newArray……”不应该足以使用另一个模块中的函数吗?这不是在普通 javascript 中的工作方式,其中一个模块可以通过导入/导出来使用另一个模块的功能

解决方法

你不能导入这样的函数。您必须将函数传递给子组件。

在父组件中

// SortingVisualizer.js

export const SortingVisualizer = () => {
    const [arr,setArr] = useState([]);
    const newArray = () => {
      // ...
    }

    return (
      <div id="main-container">
        <Menubar data={arr} newArray={newArray} />
      </div>
    )
}

在子组件中

// import newArray from '../SortingVisualizer/SortingVisualizer'; Remove that line
import bubbleSort from '../algorithms/bubbleSort'

const Menubar = ({ newArray }) => {
return(
    <div id="menubar-container">
        <button id="new-array-button" onClick={() => newArray()}>New Array</button>
        <button id="bubble-sort-button" onClick={() => bubbleSort(props.data)}>Bubble Sort</button> // Works fine
    </div>
    )
}
,

要将函数传递给子组件,可以将其作为 props 传递

<Menubar
  data={arr}
  newArray={newArray}
/>

然后在子组件中,从 props 调用函数

const { newArray } = props;
return (
    <div id="menubar-container">
    <button id="new-array-button" onClick={newArray}>New Array</button>
,

我不确定这是否是最好的解决方案,但您也可以创建一个钩子

// useArray.js

import {useState} from "react"

const useArray = () => {
  const [arr,setArray] = useState([])

  function newArray() {
    const tempArr = [];
    for(let i = 0; i < 100; i++) {
      tempArr.push(Math.floor(Math.random() * 100) + 5)
    }
    setArr(tempArr);
  }

  return {
   newArray,arr
  }
}

export default useArray

即使在你的例子中我不明白为什么不把你的状态放在你的子组件中,因为你的父母不使用它

//Child component
import React from "react";

import bubbleSort from '../algorithms/bubbleSort'

function Menubar() {

const [arr,setArr] = useState([]);

const newArray = () => {
   // ...
}

return(
    <div id="menubar-container">
        <button id="new-array-button" onClick={newArray}>New Array</button>
        <button id="bubble-sort-button" onClick={() => bubbleSort(arr)}>Bubble Sort</button>
    </div>
    )
}

export default Menubar;

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?