React.Children.only 期望接收带有 <Link > 组件的单个 React 元素子元素

Posted

技术标签:

【中文标题】React.Children.only 期望接收带有 <Link > 组件的单个 React 元素子元素【英文标题】:React.Children.only expected to receive a single React element child with <Link > component 【发布时间】:2018-10-19 05:01:51 【问题描述】:

我正在学习自己做出反应。在我的渲染循环中,我尝试在其中添加元素,以便我可以为每个数据创建超链接。但是我遇到了这个问题:React.Children.only 预计会收到一个 React 元素子级。有人能知道为什么会这样吗?这是我的代码的一部分。希望它更容易理解我的问题。我跳过了编码的某些部分,因为问题似乎发生在渲染部分。

app.js

render() 
return (
  <Router className="App">
    <div>
      <nav className="navbar navbar-default">
        <div className="container-fluid">
          <Link to="/coding-fun">Coding Fun</Link>
        </div>
      </nav>
      <Switch>
        // import condingFun.js file as Coding  
        <Route exact path="/coding-fun" component=Coding />
        <Route path="/coding-fun/:title" component=singleArticle />

      </Switch>
    </div>
  </Router>
);

codingFun.js ps:posts是json数据,我没有在这里添加太多数据。

 class Coding extends Component 
   render() 
      return (
         <div className="nav-text">
            <h1>Coding fun page</h1>
            // posts is data from api, and it renders listPage.js as 
              ListPage 
            <ListPage items=posts />
         </div>
       );
  


 export default Coding;

listPage.js

import React,  Component  from "react";
import  BrowserRouter as Link  from "react-router-dom";

class Listing extends Component 
   constructor(props) 
     super(props);
     this.state =  data: this.props.items ;
    

   render() 
     return (
  <table>
    <tbody>
      // loop "post" data from parent component (items) codingFun.js  
      this.state.data.map(post => (
        <tr key=post.id>
          <td>
            <Link to="coding-fun/" + post.title>post.title</Link>
          </td>
          <td>post.content</td>
        </tr>
      ))
    </tbody>
  </table>
  );

如果我只是添加&lt;Link to="coding-fun/" + post.title&gt;post.title&lt;/Link&gt; 这一行,它得到“React.Children.only 预计会收到一个 React 元素子元素。”问题。如果我只在标签中添加 post.title,则没有任何问题。所以我试图将标题作为每一行中的链接。但是不知道怎么弄。

非常感谢

【问题讨论】:

【参考方案1】:

BrowserRouter 中不存在属性 to。将BrowserRouterLink 混为一谈也会让您有些困惑,因为在react-router 中存在一个名为Link 的实际组件。这就是你使用它的方式:

import  Link  from 'react-router-dom'

<Link to="coding-fun/" + post.title>post.title</Link>

【讨论】:

我遇到了同样的问题,我从某处复制了import BrowserRouter as Router, Link from "react-router-dom",然后删除了as Router,因为我不需要它。现在似乎很明显,应该自己解决这个问题。谢谢!【参考方案2】:

我猜这是因为你做错了导入。导入语句应该是import Link from 'react-router-dom'

【讨论】:

【参考方案3】:

您混淆了RouterLinkRoute。所以基本上,

Router 用于包装你的整个应用程序,使其fullstack-alike,即可以更改地址栏中的URL,并分别渲染特定的视图 Link&lt;a&gt; 标记的使用方式相同,这意味着单击时它将带您到该 URL 另一方面,Route 用于决定在特定链接下应该呈现什么。这是您应该用来传递子组件的方法

在您的情况下,您应该将 import 语句更改为:

import Link from 'react-router-dom'

希望这有助于解决您的问题:)

【讨论】:

以上是关于React.Children.only 期望接收带有 <Link > 组件的单个 React 元素子元素的主要内容,如果未能解决你的问题,请参考以下文章

React.children.only 期望接收单个反应元素子导航器

如何修复 React.Children.only 期望在 react.js 中接收单个 React 元素子项?

React.Children.only 期望接收带有 <Link > 组件的单个 React 元素子元素

Next.js:错误:React.Children.only 预期接收单个 React 元素子项

React.Children.only 预计会收到单个 React 元素子错误

我收到“错误:React.Children.only 预计会收到一个 React 元素子项。”带有 TouchableWithoutFeedback