React報錯之組件不能作為JSX組件使用

  • 2022 年 7 月 28 日
  • 筆記

正文從這開始~

總覽

組件不能作為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<any, any>': 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 world</h2>
};

export default App;

上述程式碼示例返回undefined,因為我們把返回語句放在一行,而把JSX程式碼放在下一行,並且沒有使用括弧。

我們不允許從組件中返回undefined,因此會出現這個錯誤。

為了解決該錯誤,我們必須確保返回的程式碼是可達的。

const App = () => {
  return (
    <div>
      <h2>hello world</h2>
    </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經常出現故障,有時重啟就能解決問題。