在获取 slug 的 id 之前,如何防止子反应组件呈现?

How can I prevent a child react component from rendering until I fetched id for slug?

此处数据以空数组 属性 posts 开头。当它被分配一个新的 属性 一旦我得到 slug 时,我的 Comments 组件会使用新的 prop 值再次重新渲染,这意味着它会重新渲染两次,我怎样才能阻止子组件渲染直到我获取slug 的 id

export const SinglePost = () => {

const { Content } = Layout;
const { Title, Paragraph, Text } = Typography;

const { slug } = useParams();


const [post, setPost] = useState({ posts: [] });

useEffect(() => {
axios.get(slug).then((res) => {
    setPost({ posts: res.data });
    console.log('a single post', res.data);
      });
}, [slug]);

let AuthorBlog = data.posts.author
let comment = data.posts.id


return (
      <>
<div className="container-fluid">
    <div className="row">
        <div className="col-12 col-md-8 col-lg-9">
            <SimpleBar style={{ maxHeight: '90%'}}>
                <Layout style={{ textAlign: 'center' }}>
                    <Content style={{ padding: '10rem 5% 2rem' }}>
                        <Image
                            className={ArticleCSS.Img}
                            src={data.posts.image}
                            preview={false}/>
                    <Layout>
                        <Typography className={ArticleCSS.info} >
                            <Title level={2} className={ArticleCSS.mainTitle}>{data.posts.title}</Title>
                            <Text>Created By: <Text strong className='writer'>{data.posts.author}</Text></Text>
                                <div className='dateDiv'><ClockCircleOutlined style={{color: 'rgb(59, 110, 145)',
                                        fontSize: '1.2rem', paddingRight: '0.6rem' }} />
                                <Text className='date'>On{" "}{moment(new Date(data.posts.published)).format("YYYY-MM-DD")}</Text></div>
                        </Typography>
                    </Layout>
                    <Layout className={ArticleCSS.ArticleContent}>
                        <Typography>
                            <Paragraph className={ArticleCSS.cardText}>{data.posts.content}</Paragraph>
                        </Typography>
                    </Layout>
                </Content>
            </Layout>
        <CommentComp id = {comment}/>
        <Comments id={comment} />
        </SimpleBar>
    </div>
    <div className={`col-12 col-md-4 col-lg-3 ${ArticleCSS.cold}`}>
        <RelatedBlog AuthorBlog = {AuthorBlog}/>
       </div>
     </div>
   </div> 
   </>
        );
        };

comments.js

export const Comments = (props) => {

console.log("Id post is:", props.id);

const [fetchComments, setFetchComments] = useState(true);
const [commentsList, setCommentsList] = useState([]);



useEffect(() => {
     axios.get(`comment/list/?blog_id=${props.id}`).then(
            (res)=> {
                setFetchComments(false);
                setCommentsList(res.data);
                console.log("from filter Commenst",res.data);
            },
            (err) => {
                console.error(err.response.data);
            }
        );

},[props.id]);


return (
  <div className='container'>
      <h5>Comments</h5>
      {fetchComments && <i>Loading...</i>}
      {!fetchComments && commentsList.length < 1 ? (
           <h5>No Comments for this Blog</h5> 
        ):(
            commentsList.map((item, key) => {
                return <CommentCard data={item} key={key} />
            })
        )}
    </div>

 )
 };

This image shows what I'm talking about. I don't want the child to render for the first time since I don't want to get with an undefined ID.

我相信您需要将 axios 调用包装在匿名异步函数中,以使其按照您的预期运行。您可以通过以下方式完成它:

useEffect(() => {
  (async () => {
    await axios.get(slug).then((res) => {
      setPost({ posts: res.data });
      console.log('a single post', res.data);
    });
  })()
}, [slug]);

试一试,如果有效请告诉我!

从我目前收集到的信息来看,您似乎不想在定义 id 值之前呈现 Comments 组件。为此,您可以使用 conditional rendering.

示例:

export const SinglePost = () => {
  const { slug } = useParams();
  const [post, setPost] = useState({ posts: {} });

  useEffect(() => {
    axios.get(slug).then((res) => {
      setPost({ posts: res.data });
      console.log('a single post', res.data);
    });
  }, [slug]);

  return (
    ...
    {!!post.posts.id && <Comments id={post.posts.id} />}
    ...
  );
};