我对ReactJS比较陌生。
我无法更新组件状态。 当我在控制台上记录我的api提取的结果时,该对象在那里并且没有未定义。
这是我正在使用的代码:
class Article extends Component {
state = { post: {} };
componentDidMount() {
const id = this.props.match.params.id;
fetch(`/posts/${id}/`)
.then(res => res.json())
.then(post => {
this.setState(post);
console.log(post);
});
}
renderContent() {
if (
Object.entries(this.state.post).length === 0 &&
this.state.post.constructor === Object
) {
return <p>Blog does not exist sadly</p>;
} else {
return (
<div>
{" "}
{Object.keys(this.state.post).map(p => (
<div
style={{ maxWidth: "auto", textAlign: "centre" }}
key={this.state.post[p].title}
>
<Header heading={this.state.post[p].title} />
<div
style={{ padding: "40px" }}
dangerouslySetInnerHTML={{ __html: this.state.post[p].content }}
/>
</div>
))}
</div>
);
}
}
render() {
return (
<div>
{this.renderContent()}
<Footer />
</div>
);
}
}
export default Article;
这是api提取的结果:
{"_id":"5ce1ae8fc915dc48d13d7c1c","title":"example title","content":"example content"}
返回MongoDB查询结果的快速代码:
router.get("/posts/:id", function(req, res, next) {
MongoClient.connect("mongodb://localhost:27017/express", function(
err,
client
) {
if (err) throw err;
var db = client.db("express");
var id = parseInt(req.params["id"]);
db.collection("posts")
.find()
.sort({ _id: 1 })
.toArray(function(err, result) {
if (err) throw err;
if (result.length > 0) {
res.send(result[id]);
} else {
res.status(403);
}
});
});
});
这似乎仅在使用单个结果获取时发生,而不是在获取对象数组时发生。
更新:
尝试调用console.log(this.state)而不是调用console.log(this.state.post)并将其取回:
{post: {}, _id: "5ce1ae8fc915dc48d13d7c1c", title: "example title", content: "example content"}
似乎在那里,但我将状态更新为错误?
答案 0 :(得分:1)
您能否再次检查是否使用了正确的功能来设置状态?
应该为this.setState({ post })
,而不是this.setState(post)
class Article extends Component {
state = { post: null };
componentDidMount() {
const id = this.props.match.params.id;
fetch(`/posts/${id}/`)
.then(res => res.json())
.then(post => {
this.setState({ post }, console.log(this.state.post));
});
}
renderContent() {
const { post } = this.state
if (!post) {
return <p>Blog does not exist sadly</p>;
} else {
return (
<div>
{" "}
<div
style={{ maxWidth: "auto", textAlign: "centre" }}
key={post.title}
>
<Header heading={post.title} />
<div
style={{ padding: "40px" }}
dangerouslySetInnerHTML={{ __html: post.content }}
/>
</div>
</div>
);
}
}
render() {
return (
<div>
{this.renderContent()}
<Footer />
</div>
);
}
}
export default Article;
答案 1 :(得分:0)
正如我的评论中所述,您的renderContent函数需要一个数组。您可以将单个结果包装到数组中,也可以直接访问对象,而无需使用map()函数来解决问题。