亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何從自定義反應鉤子豐富數據

如何從自定義反應鉤子豐富數據

心有法竹 2023-07-06 14:42:08
在我的 React 應用程序中,我創建了一個自定義鉤子,它在使用時返回一組數據。它的用法就像const projects = useProjects();它是一個對象數組,我們可以假設它看起來像這樣: [{project_id : 123 , name : 'p1'} , {project_id : 1234 , name : 'p2'} ]現在我需要使用 API 中的數據來豐富這些數據。所以我必須遍歷項目并基本上為每個對象添加一個新字段,因此新的對象數組將如下所示:[{project_id : 123 , name : 'p1' field3: 'api data'} , {project_id : 1234 , name : 'p2' , field3: 'api data1' } ]我怎樣才能做到這一點?我所做的是循環訪問項目數據并直接在循環內添加字段。但我不知道我是否應該像這樣改變這些數據?我希望看看這是否是好的做法。
查看完整描述

1 回答

?
萬千封印

TA貢獻1891條經驗 獲得超3個贊

有幾種方法可以解決這個問題 - 這完全取決于您如何從 API 獲取數據。如果你想將其注入到鉤子中,你可以這樣做 -


const DEFAULT_PROJECTS = [

    { project_id : 123, name: 'p1' }, 

    { project_id : 1234, name: 'p2' },

];


const useProjects = (dataFromApi) => {

    // Assuming that dataFromApi is what you got back from your API call, 

    // and it's a dictionary keyed on the project_id.

    return useMemo(() => {

        return DEFAULT_PROJECTS.map(proj => {

            const extraData = dataFromApi.get(proj.project_id) || {};

            

            return {

                ...proj,

                ...extraData,

            };

        });

    }, [dataFromApi]);

};

如果總是在變化,那么這里useMemo并不是很有幫助dataFromApi- 它每次都會重建返回的對象。


如果你想獲取數據作為你的鉤子的一部分,你可以這樣做 -


import { useEffect, useMemo, useState } from 'react';


const DEFAULT_PROJECTS = [

  { project_id : 123, name: 'p1' },

  { project_id : 1234, name: 'p2' },

];


const useProjects = () => {

  const [dataFromApi, setDataFromApi] = useState(null);


  useEffect(() => {

    if (!!dataFromApi) return;


    // Simulate the data fetch

    const fetchData = async () => {

      return new Promise(resolve => {

        setTimeout(() => {

          const map = new Map();

          map.set(123, { 

            field3: 'api data',

            field4: 'other data',

          });


          setDataFromApi(map);

        }, 2000);

      });

    };


    fetchData();

  }, [dataFromApi]);


  return useMemo(() => {

    let extraData = dataFromApi || new Map();


    return DEFAULT_PROJECTS.map(proj => {

      const extraFields = extraData.get(proj.project_id) || {};


      return {

          ...proj,

          ...extraFields,

      };

    });

  }, [dataFromApi]);

}


export default useProjects;

這是一個代碼沙箱,顯示了它的實際效果。


查看完整回答
反對 回復 2023-07-06
  • 1 回答
  • 0 關注
  • 160 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號