• React报错之组件不能作为JSX组件使用


    正文从这开始~

    总览

    组件不能作为JSX组件使用,出现该错误有多个原因:

    1. 返回JSX元素数组,而不是单个元素。
    2. 从组件中返回JSX元素或者null以外的任何值。
    3. 使用过时的React类型声明。

    返回单个JSX元素

    下面是一个错误如何发生的示例。

    // App.tsx
    
    // ⛔️ 'App' cannot be used as a JSX component.
    // Its return type 'Element[]' is not a valid JSX element.
    // Type 'Element[]' is missing the following properties from type 'ReactElement': type, props, key
    const App = () => {
      return ['a', 'b', 'c'].map(element => {
        return <h2 key={element}>{element}h2>;
      });
    };
    
    export default App;
    

    代码示例中的问题是,我们返回的是一个JSX元素数组,而不是单个JSX元素。

    为了解决这种情况下的错误,我们必须使用React fragment 或者div元素来包裹数组。

    // App.tsx
    
    const App = () => {
      return (
        <>
          {['a', 'b', 'c'].map(element => {
            return <h2 key={element}>{element}h2>;
          })}
        
      );
    };
    
    export default App;
    

    现在我们的组件返回了单个JSX元素,这样错误就解决了。

    当我们需要对子节点列表进行分组而不需要向DOM中添加额外的节点时,就会使用Fragments。

    您可能还会看到使用了更加详细的fragments语法。

    // App.tsx
    
    import React from 'react';
    
    const App = () => {
      return (
        <React.Fragment>
          {['a', 'b', 'c'].map(element => {
            return <h2 key={element}>{element}h2>;
          })}
        React.Fragment>
      );
    };
    
    export default App;
    

    你也可以使用div元素来充当包裹器,从组件中返回单个JSX元素。

    不要忘记返回值

    另一个常见原因是,我们从组件中返回JSX元素或者null以外的任意值,或者忘记返回值。

    // ⛔️ 'App' cannot be used as a JSX component.
    // Its return type 'undefined' is not a valid JSX element.
    const App = () => {
      // 👇️ this returns undefined
      return
      <h2>hello worldh2>
    };
    
    export default App;
    

    上述代码示例返回undefined,因为我们把返回语句放在一行,而把JSX代码放在下一行,并且没有使用括号。

    我们不允许从组件中返回undefined,因此会出现这个错误。

    为了解决该错误,我们必须确保返回的代码是可达的。

    const App = () => {
      return (
        <div>
          <h2>hello worldh2>
        div>
      );
    };
    
    export default App;
    

    如果你确信从React组件中,返回了单个JSX元素或者null 。但是错误依旧存在,试着更新React类型声明。

    更新React类型声明

    在项目的根目录下打开终端,运行以下命令:

    # 👇️ with NPM
    npm install --save-dev @types/react@latest @types/react-dom@latest
    
    # 👇️ if you also want to update react and react-dom
    npm install react@latest react-dom@latest
    
    # ------------------------------
    
    # 👇️ with YARN
    yarn add @types/react@latest @types/react-dom@latest --dev
    
    # 👇️ if you also want to update react and react-dom
    yarn add react@latest react-dom@latest
    

    该命令将会更新你的react类型声明版本。

    确保重启开发服务器,如有必要请重启IDE。开发服务器不会接收这些更改,直到你停止它并重新运行npm start命令。

    如果错误还没有被解决,尝试删除node_modulespackage-lock.json(不是package.json)文件,重新运行npm install,重启IDE。

    # 👇️ delete node_modules and package-lock.json
    rm -rf node_modules
    rm -f package-lock.json
    rm -f yarn.lock
    
    # 👇️ clean npm cache
    npm cache clean --force
    
    npm install
    

    如果错误依旧存在,请确保重启了IDE和开发服务器。VSCode经常出现故障,有时重启就能解决问题。

  • 相关阅读:
    基于jsp+mysql+Spring+mybatis+Springboot的Springboot实现一个在线家庭记账管理平台
    java计算机毕业设计ssm贫困区教育资源捐赠平台element vue前后端分离
    【Vue】vuex mapActions和mapMutations
    [python从入门到实践]绘图显示不出中文字
    常见的损失函数
    【知识点随笔分析 | 第八篇】什么是布谷鸟过滤器(缓解Redis穿透)
    NodeJs 实践之他说
    Dextran-PEG-HSA 葡聚糖-聚乙二醇-人血清白蛋白简介
    免费的内网穿透(钉钉)
    Canvas实现网页协同画板
  • 原文地址:https://www.cnblogs.com/chuckQu/p/16530551.html