首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何缓存react组件获取?

如何缓存react组件获取?
EN

Stack Overflow用户
提问于 2021-09-19 20:47:20
回答 2查看 115关注 0票数 1

假设你有一个这样的组件:

代码语言:javascript
复制
function MyComponent({ index }) {
  const [data, setData] = useState('');

  useEffect(() => {
    (async function() {
      const result = await fetchData(index);
      setData(result);
    })();
  }, [index]);

  return <h1>{data}</h1>;
}

每当索引发生变化时,我们都会重新获取数据并呈现它。我如何缓存它,这样我们就不需要从之前重新获取相同的索引了?

EN

回答 2

Stack Overflow用户

发布于 2021-09-19 20:52:38

您想要您的结果,如下所示:

代码语言:javascript
复制
const cache = {};

async function memoFetch(index) {
  if (cache[index]) {
    return cache[index];
  }
  const data = fetchData(index);
  cache[index] = data;
  return data;
}


function MyComponent({ index }) {
  const [data, setData] = useState('');

  useEffect(() => {
    (async function() {
      const result = await memoFetch(index);
      setData(result);
    })();
  }, [index]);

  return <h1>{data}</h1>;
}
票数 2
EN

Stack Overflow用户

发布于 2021-09-23 21:24:07

  1. 创建组件缓存上下文:

const MyComponentCacheContext = React.createContext() ;

2.创建组件缓存提供程序,并为缓存提供初始值{}(空对象):

代码语言:javascript
复制
 function MyComponentCacheProvider (props){
                                            //we create this in step 3 
    const [cache,dispatch]= React.useReducer(MyComponentCacheReducer,{})
    const value =[cache,dispatch]
    return <MyComponentCacheContext value={value} {...props}/>

}

3.我们将使缓存看起来像这个=> {{index:data},{index:data},...},因此创建一个返回所需形状的组件缓存Reducer:

代码语言:javascript
复制
function MyComponentCacheReducer (state,action) {
 switch(action.type){
     case 'ADD-TO-CACHE':
         return {...state,[action.index]:action.data}
     default :{
         throw new Error (`unhandled action type ${action.type}`)
     }
 }
}

4.让我们将上面的所有代码放在一个客户钩子中,这样我们就可以使其可重用:

代码语言:javascript
复制
function useMyComponentCache(){
const MyContext = React.useContext(MyComponentCacheContext)
if(!MyContext){
    throw new Error (`useMyComponentCache must be within a MyComponentCacheProvider`)
}
return MyContext
}

5.让我们定制组件函数,这样我们就可以使用上面的代码:

代码语言:javascript
复制
function MyComponent({ index }) {
  const [data, setData] = useState('');
  const [cache ,dispatch]= useMyComponentCache()

  useEffect(() => {
    if(cache[index]){
        return setData(cache[index])
    }else{
        //here we fetch data --then--> we store it into the cache  immedialty
          const dataFetcher=fetchData(index).then(
                                data =>{
                                    dispatch({type:'ADD-TO-CACHE',index,data})
                                    return data
                                }
                             )
        // updating state 
          const PromiseHandler =React.useCallback(
              promise=>{
                  promise.then(
                      data => {
                          setData(data)
                      },
                  )
              }
          ,[setData]) 
          // Execution-Time
         PromiseHandler(dataFetcher)
    }
   
  }, [cache,dispatch,index,PromiseHandler,setData]); // i assume that fetchData is 
  //a stable internal module so i didn t put it to the dependecies list

  return <h1>{data}</h1>;
}

6.呈现步骤:将组件放入CacheProvider!

代码语言:javascript
复制
function App(){

return ( <MyComponentCacheProvider>
            <MyComponent index={0} /> 
         </MyComponentCacheProvider>
       )
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69246976

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档