我创建了一个注解部分,我希望能够创建一个注解,并立即在注解部分显示它,但我不知道如何在状态更改后重新呈现jsx。将状态置于useEffect依赖项中会创建无限循环。希望你能帮忙。
const Post = (props) => {
const [post, setPost] = useState([]);
const [comments, setComments] = useState([]);
const {id} = useParams();
useEffect(() => {
fetchData();
fetchComments();
}, [])
const fetchData = () => {
axios.get(`http://localhost:1234/api/posts/${id}`).then((res) => {
setPost(res.data);
}).catch((err) => {
console.log(err);
})
}
const fetchComments = () => {
axios.get(`http://localhost:1234/api/posts/${id}/comments`).then((res) => {
console.log(res)
setComments(res.data);
}).catch((err) => {
console.log(err);
})
}
console.log(comments)
return (
<div>
<div>thumbnail image</div>
<h1>{post.title}</h1>
<div>this is where body of post will go</div>
<CommentForm postId={post._id}/>
{comments.map((comment) => (
<Comment comment={comment.comment} username={comment.author.username} time={comment.timeStamp}/>
))}
</div>
)
}
2条答案
按热度按时间relj7zay1#
这取决于你如何创建一个评论,它可以依赖。更新状态时的一个经验法则是,在数组的情况下,就像对象的情况一样,应该将它们视为不可变类型。例如,如果您使用
setComments
更新注解,请选择setComments([...comments, newComment])
-使用spread语法,或者concat
是首选,因为它强制返回新对象。由于对象类型的useState
是基于引用的,因此这种方法将强制在追加时重新呈现。41zrol4v2#
用新的注解更新comments数组,并将Comments设置到这个新对象。组件将自动重新渲染。