问题描述:
-
我目前正在编写一个名为eformless
-
我用过CRA https://github.com/facebook/create-react-app创建一个名为的目录sandbox
,我链接包的地方。
-
当尝试使用我尝试测试的链接包启动沙盒反应应用程序时,我不断收到以下错误:
// inside my 'sandbox' App.tsx
import React from 'react'
import { useField } from 'eformless'
const App = () => {
const [test, handleChange] = useField('testing')
return (
<input type="text" value={test.value} onChange={handleChange} />
)
}
错误:无效的挂钩调用。钩子只能在函数组件的主体内部调用。发生这种情况可能是由于以下原因之一:
- 您的 React 和渲染器版本可能不匹配(例如 React DOM)
- 你可能违反了 Hooks 规则
- 您可能在同一个应用程序中拥有多个 React 副本
看由于 stackoverflow ToS 更改了链接 https://reactjs.org/warnings/invalid-hook-call-warning.html有关如何调试和解决此问题的提示。
问题发生的地方:
这个问题似乎指向我的库,我在其中编写了一个自定义钩子,该钩子使用从 React 导入的钩子。
这是我的代码中有问题的摘录:
export const useField = <T>(
input: T
...checkFunctions: Array<(...args: unknown[]) => unknown>
): [FieldType<T>, FieldHandlerFunction<T>, FieldHandlerFunction<T>] => {
const [value, setValue] = useState(input)
const [name, setName] = useState('')
// Issue seems to be here ^
}
我的设置相当正常,并且在其他项目中似乎运行良好:
- 首先我通过捆绑我的库
rollup -c
- 在我的内部创建了一个链接
eformless
库文件夹通过npm link
- 并在我的内部创建了符号链接
sandbox
文件夹通过npm link eformless
我尝试过的:
我自然地尝试通过错误消息中提供的链接来解决问题。链接您自己的库时这似乎是一个问题,如此处所述
当您使用 npm link 或等效项时,也会出现此问题。在这种情况下,您的捆绑器可能会“看到”两个 React - 一个在应用程序文件夹中,一个在库文件夹中。假设 myapp 和 mylib 是同级文件夹,一种可能的修复方法是从 mylib 运行 npm link ../myapp/node_modules/react。这应该使库使用应用程序的 React 副本。
我确实运行了npm link ../sandbox/node_modules/react
in my eformless
文件夹,但是,即使在关闭节点服务器并重新编译之后,这似乎也没有帮助。
不管怎样,这对我来说真的很困惑,因为跑步npm ls react
仅显示 React 的单个版本,并且它应该是有效的,因为useState
在自定义挂钩内的顶层使用。
重现问题
两个存储库都是公共的
- eformless图书馆回购协议 https://github.com/samuelhulla/eformless
- sandbox repo https://github.com/samuelhulla/sandbox
- 您可能在同一个应用程序中拥有多个 React 副本,请参阅由于 stackoverflow ToS 而更改的链接,了解有关如何调试和解决此问题的提示。
这是因为你的反应devDependencies
对于无形式。这会导致您的应用程序运行两个 React 实例。
相反,将反应转移到 eformless 中的对等依赖关系package.json
,删除你的node_modules
目录并运行npm install
.
通过将 React 添加到对等依赖项,您将通知模块捆绑器不要包含 React,而是期望依赖应用程序可以使用 React。
"peerDependencies": {
"react": "^16.13.1"
}
另外,我注意到您已经签入了您的node_modules
目录进入 eformless。你不应该那样做。相反,添加node_modules
给你的.gitignore
file.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)