reactjs 如何在创建数据后立即呈现数据

laximzn5  于 2023-05-06  发布在  React
关注(0)|答案(2)|浏览(121)

我创建了一个注解部分,我希望能够创建一个注解,并立即在注解部分显示它,但我不知道如何在状态更改后重新呈现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>
    )
}
relj7zay

relj7zay1#

这取决于你如何创建一个评论,它可以依赖。更新状态时的一个经验法则是,在数组的情况下,就像对象的情况一样,应该将它们视为不可变类型。例如,如果您使用setComments更新注解,请选择setComments([...comments, newComment])-使用spread语法,或者concat是首选,因为它强制返回新对象。由于对象类型的useState是基于引用的,因此这种方法将强制在追加时重新呈现。

41zrol4v

41zrol4v2#

用新的注解更新comments数组,并将Comments设置到这个新对象。组件将自动重新渲染。

相关问题