Предупреждение. Функции недействительны в качестве дочернего элемента React, используя условный рендеринг
Я пытаюсь отобразить список результатов, полученных из ответа 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
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 return a Component instead of <Component/> from render. Or maybe
you meant to call this function rather than return it.
Где ошибка? Правильно ли я выполняю условное рендеринг?
Спасибо
Ответы
Ответ 1
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 не обязательно должны быть конструкторы/классы, они также могут быть простой функцией, которая получает реквизит в качестве параметра и возвращает JSX. Я думаю, что этот тип компонентов немного ограничен, но он работает.
Ответ 2
вы устанавливаете resultList
для функции, когда objectList === ""
. либо вернуть a <div>
напрямую, либо использовать эту функцию как IIFE:
resultList = (function() {
return (
<div className="item" key={1}>
<p>No results!</p>
</div>
)
})(); // note the parens here, which call the function