微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

不能在打字稿中使用反应钩子 源代码 (tsx)编译为jstsconfig.json

如何解决不能在打字稿中使用反应钩子 源代码 (tsx)编译为jstsconfig.json

我正在使用打字稿将源 tsx 文件编译为 js

tsx 文件中的源代码正确使用了 react 钩子,编译后的版本似乎也正确使用了它们。

代码 (tsx)

import React,{ useEffect } from "react";

export function CheckBox() : JSX.Element {
    useEffect(function() {
        console.log("Component mounted!");
    });

    return (
        <div>...</div>
    );
}

编译为(js)

"use strict";
Object.defineProperty(exports,"__esModule",{ value: true });
exports.CheckBox = void 0;
var jsx_runtime_1 = require("react/jsx-runtime");
var react_1 = require("react");
function CheckBox() {
    react_1.useEffect(function () {
        console.log("Component mounted!");
    });
    return (jsx_runtime_1.jsx("div",{ children: "..." },void 0));
}
exports.CheckBox = CheckBox;
//# sourceMappingURL=CheckBox.js.map

tsconfig.json

{
    "$schema": "http://json.schemastore.org/tsconfig","compilerOptions": {
        "lib": ["ES2020","dom"],"module": "commonjs","target": "es5","baseUrl": "src/ts","types": ["node","react"],"jsx": "react-jsx","outDir": "src/js","sourceMap": true,"strict": true,"allowJs": true,"esModuleInterop": true,"skipLibCheck": true,"noUnusedParameters": true,"allowUnreachableCode": false,"preserveConstEnums": false,"resolveJsonModule": true
    },"include": ["src/ts/**/*"]
}

我在 Chrome 控制台中收到以下错误,说我违反了钩子规则。

Uncaught Error: Invalid hook call. Hooks can only be called inside of the body of a function component. This Could happen for one of the following reasons:
1. You might have mismatching versions of React and the renderer (such as React DOM)
2. You might be breaking the Rules of Hooks
3. You might have more than one copy of React in the same app
See https://reactjs.org/link/invalid-hook-call for tips about how to debug and fix this problem.
    at resolvedispatcher (react.development.js?52c0:1476)
    at Object.useEffect (react.development.js?52c0:1519)
    at CheckBox (CheckBox.tsx?7b6e:4)
    at renderWithHooks (react-dom.development.js?61bb:14985)
    at mountIndeterminateComponent (react-dom.development.js?61bb:17811)
    at beginWork (react-dom.development.js?61bb:19049)
    at HTMLUnkNownElement.callCallback (react-dom.development.js?61bb:3945)
    at Object.invokeGuardedCallbackDev (react-dom.development.js?61bb:3994)
    at invokeGuardedCallback (react-dom.development.js?61bb:4056)
    at beginWork$1 (react-dom.development.js?61bb:23964)

我已经在谷歌上搜索了几天,但仍然不知道为什么会发生这种情况......

解决方法

我真的很想认为第一个 jsx_runtime 的名称应该是 jsx_runtime_0 甚至可能如果只有一个 jsx_runtime 那么它根本没有后缀打包机!

这不是证据,但它让我推测您是否真的有两个版本的 React 进来,因为您包含在项目中的两个模块中的每一个都将其声明为依赖项(而不是对等依赖项),因此有自己的他们在包中引用的副本。

由于 React 的每个副本都使用不同的闭包来存储顶级内容,这意味着它会注意到例如在 React 的不同副本的上下文中调用 useState。

,

我用你的问题创建了一个 CodeSandBox:Codesandbox

一个简单的方法是这样使用:

TSX 中的源代码

import React,{ useEffect } from "react";

const Checkbox = (props) => {
  useEffect(() => {
    console.log("Component mounted!");
  },[]); // https://reactjs.org/docs/hooks-effect.html

  return <div>Checkbox</div>;
};

export default Checkbox;

函数组件返回一个 JSX.Element。 ![enter image description here

在这个链接中还有关于 JSX 的解释:Introducing JSX

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 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”。这是什么意思?