![](/img/trans.png)
[英]React: Uncaught Error: Objects are not valid as a React child
[英]How to debug this error: Uncaught (in promise) Error: Objects are not valid as a React child
控制台中的完整錯誤:
未捕獲(在承諾中)錯誤:對象作為React子對象無效(找到:具有鍵{id,name,description,css,ephemeral,readonly,topPost}的對象)
如果您要渲染子集合,請使用數組,或使用React附加組件中的createFragment(object)包裝對象。 檢查exports
的render方法。(...)
我真的不知道這個錯誤意味着什么,它並沒有指向代碼中的一行,所以我不知道該怎么做。
我正在使用api.jsx從Imgur獲取數據(特別是我在topic-store.jsx中調用它),然后嘗試在topic-list.jsx中呈現數據
main.jsx
var React = require('react');
var Header = require('./header');
var TopicList = require('./topic-list');
module.exports = React.createClass({
render: function () {
return <div>
<Header />
{this.content()}
</div>
},
content: function () {
if (this.props.children) {
return this.props.children
} else {
return <TopicList/>
}
}
});
header.jsx
var React = require('react');
var Router = require('react-router');
var Link = Router.Link; //Router's Link object is a renderable component, that turns into an anchor tag when rendered
//Using Link allows a user to change routes without triggering a full page refresh, the content on the page will change but the browser will not refresh
module.exports = React.createClass({
render: function () {
return <nav className="navbar navbar-default header">
<div className="container-fluid">
<Link to="/" className="navbar-brand">
Imgur Browser
</Link>
<ul className="nav navbar-nav navbar-right">
<li><a>Topic #1</a></li>
</ul>
</div>
</nav>
}
});
話題list.jsx
var React = require('react');
var TopicStore = require('../stores/topic-store');
module.exports = React.createClass({
getInitialState: function () {
return {topics: []}
},
componentWillMount: function () {
TopicStore.getTopics().then(function () {
//We have successfully fetched topics
//Topics are available on TopicStore.topics
this.setState({
topics: TopicStore.topics
});
}.bind(this));
},
render: function () {
return <div className="list-group">
Topic List
{this.renderTopics()}
</div>
},
renderTopics: function () {
return this.state.topics.map(function(topic) {
return <li>
{topic}
</li>
});
}
});
話題store.jsx
var Api = require('../utils/api');
var Reflux = require('reflux');
module.exports = Reflux.createStore({
getTopics: function() {
return Api.get('topics/defaults').then(function(json) {
this.topics = json.data;
}.bind(this));
}
});
api.jsx
var Fetch = require('whatwg-fetch');
var rootUrl = 'https://api.imgur.com/3/';
var apiKey = 'e80dc51eb3f6d56';
module.exports = window.api = {
get: function(url) {
return fetch(rootUrl + url, {
headers: {
'Authorization': 'Client-ID ' + apiKey
}
}).then(function (response) {
return response.json()
});
}
};
該問題依賴於在renderTopics
方法中呈現主題對象的方式。
當你做這樣的事情時:
return <li>{topic}</li>
你基本上是想做:
return <li>{{ id: 1, name: 'One topic' }}</li>
並且React不知道如何渲染原始對象。 要解決您的問題,請指定要渲染的對象的哪些鍵。 例如:
renderTopics: function () {
return this.state.topics.map(function(topic) {
return (<li>{topic.id} {topic.name}</li>)
});
}
您在topic-list.jsx中缺少<ul></ul>
或<ol></ol>
標記
在主題的渲染調用中使用<ul></ul>
標記:
render: function () {
return <div className="list-group">
Topic List
<ul>
{this.renderTopics()}
</ul>
</div>
},
更新:納入Aperçu的評論以確保完整性
您需要從json blob獲取值(不呈現Raw內容):
主題為{id:1, name:Topic1}
renderTopics: function () {
return this.state.topics.map(function(topic) {
return <li>
{topic.id}{topic.name}
</li>
});
}
要完成以前的答案,請在渲染函數中返回的JSX中添加括號
例如main.jsx :
var React = require('react');
var Header = require('./header');
var TopicList = require('./topic-list');
module.exports = React.createClass({
render: function () {
return (
<div>
<Header />
{this.content()}
</div>
);
},
content: function () {
if (this.props.children) {
return this.props.children
} else {
return <TopicList/>
}
}
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.