npm-link 库上的挂钩调用无效

2024-03-13

问题描述:

  • 我目前正在编写一个名为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} />
      )
    }
    

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

  1. 您的 React 和渲染器版本可能不匹配(例如 React DOM)
  2. 你可能违反了 Hooks 规则
  3. 您可能在同一个应用程序中拥有多个 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

  1. 您可能在同一个应用程序中拥有多个 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(使用前将#替换为@)

npm-link 库上的挂钩调用无效 的相关文章

  • 访问 TypeScript 数组的最后一个元素

    TypeScript 中有访问数组最后一个元素的符号吗 在 Ruby 中我可以说 array 1 有类似的东西吗 您可以通过索引访问数组元素 数组中最后一个元素的索引将是数组的长度 1 因为索引是从零开始的 这应该有效 var items
  • Flux + React.js - 操作中的回调是好还是坏?

    让我解释一下我最近遇到的问题 我有 React js Flux 驱动的应用程序 有一个列表显示文章数量 注意 应用程序中有多个不同的列表 和文章详情查看在里面 但每个列表只有一个 API 端点 它返回文章数组 为了显示我需要的详细信息fin
  • 如何访问另一个 mobx 商店中的 mobx 商店?

    假设以下结构 stores RouterStore js UserStore js index js each of Store jsfiles 是一个 mobx 存储类 包含 observable and action index js只
  • Node.js 可读流_read用法

    我了解如何在 Node 的 new 中使用可写流Streams2库 但我不明白如何使用可读流 举个例子 一个流包装器围绕dgram module var dgram require dgram var thumbs twiddle func
  • 装饰器可以更改方法的签名吗?

    考虑一个函数 function handleFoo foo number 我想要一个解析 foo 的装饰器 例如 fetchFromApi foo function handleFoo foo number where fetchFromA
  • Express.js Passport认证自动失败跳过策略

    UPDATE 我已将代码从护照本地注册内部移至单独的处理程序 并且运行良好 问题在于 Passport 和本地注册的使用 但我不知道为什么 我使用 Node js Express Passport 进行身份验证和注册设置 这是以前使用过的标
  • 如何更改订阅值?使用 rxJS

    我正在创建一个计时器 需要你的帮助 我刚刚学习 Angular 和 rxJS 对此我有一些疑问 我正在创建一个具有启动 停止 暂停 重置功能的计时器 并且 btn Reset 必须将我的计时器 暂停 到 300 毫秒 怎么做 D 我的启动定
  • 在 JSPdf 中嵌入二进制文件

    我在用着JsPDF https www npmjs com package jspdf将 html 内容导出到下载的 PDF 考虑以下示例 该示例获取一些 HTML 内容并将其输出到下载的 PDF 文件 使用JsPdf import Rea
  • 如何让 TypeScript 从 node_modules 捆绑第 3 方库?

    我想要使 用 TypeScript 编译器node modules firebase firebase d ts检查我的代码并捆绑node modules firebase firebase js到我从 firebase 导入内容的一些文件
  • 节点:以编程方式检查包的最新版本

    我希望我的节点包 在 npm 上发布 在新版本可用时提醒用户 如何以编程方式检查已发布软件包的最新版本并将其与当前版本进行比较 Thanks 您可以结合npmview https npmjs com package npmview 用于获取
  • 将nodejs Express静态请求重定向到https

    我需要将所有 http 请求重定向到 https 包括对静态文件的请求 My code app use express static dirname public app get function req res if req secure
  • 如何使用 Passport /Facebook 策略/验证 Supertest 请求?

    我使用 Passport js 进行身份验证 Facebook 策略 并使用 Mocha 和 Supertest 进行测试 如何使用 Supertest for Facebook 策略创建会话并发出经过身份验证的请求 这是用户未登录时的示例
  • 如何在 Sequelize 现有模型中添加列?

    我使用此命令添加了模型和迁移文件 node modules bin sequelize model generate name User attributes firstName string lastName string email s
  • 缓存消息discord.js

    我想做一些反应角色 但为此 我必须缓存机器人启动之前发送的消息 我尝试过channel messages fetch 但到目前为止还没有奏效 我当前的代码 client on messageReactionAdd async reactio
  • 等待承诺的 fs.writeFile 与 fs.writeFileSync

    此选项之一有一些优点吗 1 const fs require fs const testFunc1 async gt fs writeFileSync text txt hello world 2 const fs require fs c
  • React:未捕获的引用错误:未定义需求

    我正在阅读 React 教程 http facebook github io react docs animation html http facebook github io react docs animation html 并且我无法
  • React-Router v5 History.push 不触发组件

    很抱歉朋友们又问这个问题了 我找到了解决这个问题的几个方法 但他们让我很困惑 我只是想问一个优雅的方法来做到这一点 正如你通过标题所理解的 我有一个关于反应路由的问题 让我解释 我有一个按钮 其名称是Login 单击按钮后 我执行了一些逻辑
  • 401 未经授权的帖子回复

    我一直在使用 Angular 模板制作 Node js 网站 但我无法在 DB Mongo 上创建数据 这是代码 节点路由 var Property mongoose model Property var jwt require expre
  • 如何在 Visual Studio 中调用“组织导入”TypeScript 功能?

    TypeScript 2 8 中有一个新功能 可以让您 组织进口 https devblogs microsoft com typescript announcing typescript 2 8 2 organize imports ht
  • 带有 'as' 属性的通用 React TypeScript 组件(能够渲染任何有效的 dom 节点)

    我在下面的示例中按预期工作 我的问题是 无论如何我可以重写它 这样我就不必传递通用的T和as支柱 理想情况下我想通过asprop 并让组件的 prop 接口使用它 这在 TypeScript 中可能吗 export type Props l

随机推荐