警告:使用条件呈现功能作为React子项无效

时间:2018-01-21 20:51:31

标签: javascript reactjs


我正在尝试显示从维基百科API的响应中获取的结果列表。 如果响应未显示任何列表,则应显示不同的消息。我正在尝试进行条件渲染。

以下是代码:

getData(e) {
        e.preventDefault();
        var search = e.target.search.value;
        var wikipediaEndPoint = "https://en.wikipedia.org/w/api.php?format=json&origin=*&action=query&generator=search&gsrnamespace=0&prop=pageimages|extracts&pilimit=max&exintro&explaintext&exsentences=1&exlimit=max&gsrsearch="+search;
        var wikipediaUrl = "https://en.wikipedia.org/?curid=";

        fetch(wikipediaEndPoint)
        .then(data => {
            return data.json();
        }).then(data => {
            var objectList = (data.hasOwnProperty("query")) ? data.query.pages : "";
            let resultList;

            if(objectList !== ""){
                resultList = Object.keys(objectList).map(function(key, index) {
                    return (
                        <div className="item" key={objectList[key].pageid}>
                            <a href={wikipediaUrl+objectList[key].pageid}>
                                <h1>{objectList[key].title}</h1>
                                <p>{objectList[key].extract}</p>
                            </a>
                        </div>
                    )
                });
            } else {
                resultList = (function() {
                    return (
                        <div className="item" key={1}>
                            <p>No results!</p>
                        </div>
                    )
                });
            }

            this.setState({search: resultList});
        })
    }

结果如下所示:<div className="items">{this.state.search}</div>

当搜索字段关键字找到某些结果时,它可以正常工作,但是,相反的情况下,控制台会返回错误(或警告):

  

Warning: Functions are not valid as a React child. This may happen if   you return a Component instead of <Component /> from render. Or maybe   you meant to call this function rather than return it.

错误在哪里?我正在以正确的方式进行条件渲染吗?

由于

2 个答案:

答案 0 :(得分:12)

            resultList = (function() {
                return (
                    <div className="item" key={1}>
                        <p>No results!</p>
                    </div>
                )
            });

为什么要设置功能?只需设置<div... -

即可
            resultList = (
                    <div className="item">
                        <p>No results!</p>
                    </div>
                )

修改

为了真正使用一个函数(不知道为什么),代码必须有点不同 -

            const Foo = (function() {
                return (
                    <div className="item" key={1}>
                        <p>No results!</p>
                    </div>
                )
            });
            resultList = (<Foo />)

编辑2 -

上面的编辑有效,因为React组件不必是构造函数/类,它们也可以是一个简单的函数,它将props作为参数并返回JSX。我认为这种类型的组件有点受限,但它可以工作。

答案 1 :(得分:4)

您在resultList时将objectList === ""设置为某个功能。要么直接返回<div>,要么将该函数用作IIFE

resultList = (function() {
  return (
    <div className="item" key={1}>
      <p>No results!</p>
    </div>
  )
})(); // note the parens here, which call the function