用React刻自己的投资Dashboard Day11 - 分离UI元件与抓取数据元件

tags: 2021铁人赛 React

本篇要将call api的功能独立成一个元件,在架构上会更清楚的分工不同档案的功能,之後也有可能是其他元件会呼叫api的功能,因此独立出来会比较方便。

新增call api元件

如下程序码,将原本在Card.js内call api获取资料的那段分离出来,另外写在一个档案。

src/components/Charts/fredAPI.js

const useFredAPI = (series_id) => {
  return fetch(`${process.env.REACT_APP_PROXY_SERVER_URL}/series/observations?series_id=${series_id}&api_key=${process.env.REACT_APP_API_KEY}&file_type=json`, {
    headers: {
      'Target-URL': 'https://api.stlouisfed.org/fred'
    }
  })
    .then((response) => response.json())
    .then((data) => {
      let seriesData = [];
      data.observations.forEach(ob => {
        seriesData.push([new Date(ob.date).getTime(), Number(ob.value)]);
      });
      return seriesData;
    })
};

export default useFredAPI;

引入call api元件

src/components/Charts/Card.js

import styles from './Card.module.css';
import Highcharts from 'highcharts/highstock';
import HighchartsReact from 'highcharts-react-official';
// import api呼叫元件
import fredAPI from './fredAPI';

const Card = (props) => {
  const [chartOption, setChartOption] = useState({
    ...
  });
  
  // 使用async await,确保等待非同步的call api函数获取到资料後才进行state update
  const fetchData = useCallback(async (series_id) => {
    try {
      const seriesData = await fredAPI(series_id);
      setChartOption((prevOption) => {
        return {
          ...prevOption,
          series: [
            {
              name: prevOption.series[0].name,
              data: seriesData
            }
          ]
        }
      })
    } catch (error) {
      console.log(error)
    }
  }, []);

  useEffect(() => {
    fetchData(props.item.series_id);
  }, [fetchData, props]);

  return (
    ...
  )
}

export default Card;

小结

上述程序码将call api功能分离之後,看起来有比较乾净一些,主要把资料处理的流程搬移,就可以很快速地看出整个程序的架构,就是定义state,定义update state的方式,定义effect,回传JSX。

接下来几篇,就开始做下拉式选单功能,就是依照类别去筛选要呈现的图表,以及分页功能,当同一页的图表超过3个的时候,就可以点下一页去看更多图表。


<<:  时间挤一下就有了,我们挤了没?

>>:  Day11 - 如何查询目前期权帐户可用余额

Day08:资料结构 - 堆积(Heap)

谈谈堆积(Heap)吧! 今天来谈谈堆积(Heap)吧!堆积是一种特别的二元树(Binary tre...

Rust-Match控制流运算子

Match是使用枚举的基本工具,类似Golang的Switch语法 Match取值後对每个条件进行比...

Day1 跟着官方文件学习Laravel-前言

为什麽会参加铁人赛 因为工作关系需要从零开始接触php,并学习其框架laravel,当时主管问我有没...

【第4天】资料前处理-图档分类与裁切

现况 以YOLOv4模型框选中文字後,将资料集(约7万张)区分为以下类别: 1.1 word(仅有1...

musl libc 简介与其 porting(四)Nobody speak.

上一篇有提到,我们porting时发生printf()在有format string印不出东西、se...