当前位置: 首页 > 知识库问答 >
问题:

必须返回有效的React元素(或null)

杜正奇
2023-03-14

我有以下简单的代码

var data = [{ email: "bob@gmail.com" },{ email: "toto@gmail.com" }];
var User = React.createClass({
render: function ()
{
    return
    (
        <li>
            {this.props.email}
        </li>
    );
}});

var UserList = React.createClass({        
render: function ()
{            
    var userNodes = this.props.data.map(function (user)
    {
        console.log(user.email);
        return
        (
            <User email={user.email} ></User>
        );
    });            
    return
    (
        <ul>{userNodes}</ul>
    );
}});


ReactDOM.render(<UserList data={data} />, document.getElementById('root'));

我得到了这个错误:

"必须返回有效的React元素(或null)。您可能已返回未定义、数组或其他无效对象。"

共有1个答案

满勇军
2023-03-14

这里,问题就在这一行。

return
(
    <li>
        {this.props.email}
    </li>
);

您已经将起始括号放在下一行,因此当您的代码转换为纯javascript代码时,它将看起来像这样。

render: function () {
    return; // A semicolon has been inserted.
    (React.createElement("li", null, this.props.email)); // unreachable code
}

您可以看到Javascript在解释代码时插入了分号,因此渲染函数不会返回任何值,因此会出现此错误。

为了避免这种情况,您需要将起始括号放在返回语句之后,这样Javascript就不会插入分号,直到找到匹配的结尾括号。像这样,

return (
     <li>
         {this.props.email}
     </li>
);

现在,如果您查看生成的代码,它将类似于

render: function () {
    return (React.createElement("li", null, this.props.email));
}

还有,改变

return
(
   <ul>{userNodes}</ul>
);

return (
    <ul>{userNodes}</ul>
);

这里是工作小提琴。JSFIDLE

我还修正了警告,

数组或迭代器中的每个子级都应该有一个唯一的“键”属性。

通过在用户组件中传递密钥。

 类似资料:
  • 问题内容: 我只是ReactJS的新手,所以有一个问题。我解决不了 似乎一切都很好,但是控制台仍然让我: 必须返回有效的React元素(或null)。您可能返回了undefined,数组或其他无效对象。 这是我的代码: 宠物小精灵 感谢帮助! 问题答案: 问题是您有多个语句,因此需要将其括在内部。请参见以下代码片段。另外,必须与其他项目在同一行上,否则它将被视为仅基本不返回任何内容的行。

  • 问题内容: 我是React的新手,我想知道这里的标准是什么。 想象一下,我有一个像这样的反应路由器: 现在我想删除如果设置为的两条路线,因此一种理智的做法如下所示: 但是有两条路线,React返回错误: 表达式必须具有一个父元素。 我不想在这里使用多个ifs。React首选的处理方式是什么? 问题答案: 将它们放在一个数组中(也分配键): 使用最新的React版本,您也可以这样尝试 :

  • 我带着一个关于硒的问题来到这里。在我的测试中,我需要删除web应用程序中的一些项目,然后我想验证项目列表是否为空。我知道这看起来很琐碎,但我有一些小问题。这就是我要检查我的项目列表是否为空的方式: 简单和工作,但...慢,因为含蓄等待。 由于事实上当我删除项目,然后是0和Selenium总是等待10秒前findElements()返回0大小。 为了避免这10秒钟的等待,我有一个变通方法,在断言之前

  • 我试图弄清楚如何从angular 6/typescript应用程序向firebase数据库编写事务。 下面是我使用的一个工作示例作为指导: 我确定的关键部分如下: 1)创建一个数组来保存事务:const transactions=[]; 2)开始事务:返回db.runtransactions(function(transactions){… 3)使用事务:transaction.set(newPh

  • 我正在添加ReCAPTCHA到一个(引导哲基尔)网站,有多个联系人表单。页脚有一个弹出模式,偶尔有一个“立即联系我们”部分,还有几个页面上有一个“请求更多关于____的信息”。 由于我在一个页面上有多个联系人表单,所以我需要显式呈现每个recaptcha。代码如下: 在我的JavaScript中: 在页脚中(包含在所有页面中) (并在页脚底部) 这在一个有两个单独联系人表单的页面上工作得很好(即我

  • 我有两个组件。 彩虹。jsx 彩虹列表.jsx 雨弓.jsx 是具有数组和雨弓列表.jsx 的主要组件,我用它来用 map() 以 li 格式显示所有彩虹色。 我在控制台日志中得到错误消息ShowRainBow。状态:必须设置为对象或null 我的代码 彩虹. jsx RainBowList.jsx