显示Blog实例(useEffect, useState)

显示Blog实例(useEffect, useState)

Content #

某个组件用于显示一篇 Blog 文章,那么这个组件会接收一个参数来表示 Blog 的 ID。而当 ID 发生变化时,组件需要发起请求来获取文章内容并展示:

import React, { useState, useEffect } from "react";

function BlogView({ id }) {
  // 设置一个本地 state 用于保存 blog 内容
  const [blogContent, setBlogContent] = useState(null);

  useEffect(() => {
    // useEffect 的 callback 要避免直接的 async 函数,需要封装一下
    const doAsync = async () => {
      // 当 id 发生变化时,将当前内容清楚以保持一致性
      setBlogContent(null);
      // 发起请求获取数据
      const res = await fetch(`/blog-content/${id}`);
      // 将获取的数据放入 state
      setBlogContent(await res.text());
    };
    doAsync();
  }, [id]); // 使用 id 作为依赖项,变化时则执行副作用

  // 如果没有 blogContent 则认为是在 loading 状态
  const isLoading = !blogContent;
  return <div>{isLoading ? "Loading..." : blogContent}</div>;
}

这样,我们就利用 useEffect 完成了一个简单的数据请求的需求。在这段代码中,我们把 ID 作为依赖项参数,这样就很自然地在 ID 发生变化时,利用 useEffect 执行副作用去获取数据。如果在之前的类组件中要完成类似的需求,我们就需要在 componentDidUpdate 这个方法里,自己去判断两次 ID 是否发生了变化。如果变了,才去发起请求。这样的话,逻辑上就不如 useEffect 来得直观。

From #