React报错之组件不能作为JSX组件使用
<p>正文从这开始~</p><h2 id="总览">总览</h2>
<p>组件不能作为JSX组件使用,出现该错误有多个原因:</p>
<ol>
<li>返回JSX元素数组,而不是单个元素。</li>
<li>从组件中返回JSX元素或者<code>null</code>以外的任何值。</li>
<li>使用过时的React类型声明。</li>
</ol>
<h2 id="返回单个jsx元素">返回单个JSX元素</h2>
<p>下面是一个错误如何发生的示例。</p>
<pre><code class="language-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;
</code></pre>
<p>代码示例中的问题是,我们返回的是一个JSX元素数组,而不是单个JSX元素。</p>
<p>为了解决这种情况下的错误,我们必须使用<code>React fragment</code> 或者<code>div</code>元素来包裹数组。</p>
<pre><code class="language-jsx">// App.tsx
const App = () => {
return (
<>
{['a', 'b', 'c'].map(element => {
return <h2 key={element}>{element}</h2>;
})}
</>
);
};
export default App;
</code></pre>
<p>现在我们的组件返回了单个JSX元素,这样错误就解决了。</p>
<blockquote>
<p>当我们需要对子节点列表进行分组而不需要向DOM中添加额外的节点时,就会使用Fragments。</p>
</blockquote>
<p>您可能还会看到使用了更加详细的<code>fragments</code>语法。</p>
<pre><code class="language-jsx">// 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;
</code></pre>
<p>你也可以使用div元素来充当包裹器,从组件中返回单个JSX元素。</p>
<h2 id="不要忘记返回值">不要忘记返回值</h2>
<p>另一个常见原因是,我们从组件中返回JSX元素或者<code>null</code>以外的任意值,或者忘记返回值。</p>
<pre><code class="language-jsx">// ⛔️ '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;
</code></pre>
<p>上述代码示例返回<code>undefined</code>,因为我们把返回语句放在一行,而把JSX代码放在下一行,并且没有使用括号。</p>
<blockquote>
<p>我们不允许从组件中返回<code>undefined</code>,因此会出现这个错误。</p>
</blockquote>
<p>为了解决该错误,我们必须确保返回的代码是可达的。</p>
<pre><code class="language-jsx">const App = () => {
return (
<div>
<h2>hello world</h2>
</div>
);
};
export default App;
</code></pre>
<p>如果你确信从React组件中,返回了单个JSX元素或者<code>null</code> 。但是错误依旧存在,试着更新React类型声明。</p>
<h2 id="更新react类型声明">更新React类型声明</h2>
<p>在项目的根目录下打开终端,运行以下命令:</p>
<pre><code class="language-sh"># 👇️ 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
</code></pre>
<p>该命令将会更新你的react类型声明版本。</p>
<blockquote>
<p>确保重启开发服务器,如有必要请重启IDE。开发服务器不会接收这些更改,直到你停止它并重新运行<code>npm start</code>命令。</p>
</blockquote>
<p>如果错误还没有被解决,尝试删除<code>node_modules</code>和<code>package-lock.json</code>(不是<code>package.json</code>)文件,重新运行<code>npm install</code>,重启IDE。</p>
<pre><code class="language-sh"># 👇️ 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
</code></pre>
<p>如果错误依旧存在,请确保重启了IDE和开发服务器。VSCode经常出现故障,有时重启就能解决问题。</p><br><br>
来源:https://www.cnblogs.com/chuckQu/p/16530551.html
頁:
[1]