【发布时间】:2021-01-24 18:10:54
【问题描述】:
问题描述:
-
我目前正在创作一个名为
eformless的包 -
我使用CRA 创建了一个名为
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 副本 有关如何调试和修复此问题的提示,请参阅 altered link due to stackoverflow ToS。
问题发生的地方:
问题似乎指向我的库,我在其中编写了一个自定义挂钩,该挂钩使用从 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捆绑了我的库 - 通过
npm link在我的eformless库文件夹中创建了一个链接 - 并通过
npm link eformless在我的sandbox文件夹中创建了符号链接
我尝试了什么:
我自然而然地尝试通过错误消息中提供的链接来解决问题。链接您自己的库时,这似乎是一个问题,如此处所述
当您使用 npm link 或等效项时,也会出现此问题。在这种情况下,你的打包器可能会“看到”两个 React——一个在应用程序文件夹中,一个在你的库文件夹中。假设 myapp 和 mylib 是同级文件夹,一种可能的解决方法是从 mylib 运行 npm link ../myapp/node_modules/react。这应该使库使用应用程序的 React 副本。
我确实在我的eformless 文件夹中运行了npm link ../sandbox/node_modules/react,但这似乎没有帮助,即使在关闭节点服务器并重新编译之后也是如此。
无论哪种方式,我都觉得很困惑,因为 runnign npm ls react 只显示一个版本的 react 并且它应该是有效的,因为 useState 是在自定义钩子中使用的顶级。
重现问题
两个仓库都是公开的
【问题讨论】:
标签: node.js reactjs typescript npm npm-link