首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >响应钩子和异步操作

响应钩子和异步操作
EN

Stack Overflow用户
提问于 2020-03-29 11:21:40
回答 1查看 208关注 0票数 0

我是新来的反应和JS。我需要帮助解决我创建的两个钩子:useSaveStorageuseGetStorage

我的应用程序接收数据,必须将其写入我的AsyncStorage,但我的“@存储”中有空。useRequest工作正常。

我认为这是因为它是异步操作,但我不知道如何修复它。这是我的钩子useSaveStorage

代码语言:javascript
复制
import React, {useState, useEffect} from 'react';
import AsyncStorage from '@react-native-community/async-storage';

export const useSaveStorage = (data, storage) => {
  const [error, setError] = useState(null);
  useEffect(() => {
    if (data) {
      AsyncStorage.setItem(storage, JSON.stringify(data))
        .then(res => {})
        .catch(err => {
          console.log(storage, setError(err));
        });
    }
  }, []);

  return {error};
};

现在useGetStorage

代码语言:javascript
复制
import {useState, useEffect} from 'react';
import AsyncStorage from '@react-native-community/async-storage';

export const useGetStorage = storage => {
  const [store, setStore] = useState(null);
  useEffect(() => {
    console.log('useGetStorage: run');
    AsyncStorage.getItem(storage).then(res => {
      setStore(JSON.parse(res));
      console.log('store', store);
    });
  }, []);
  return {store};
};

这里是我使用它的地方:

代码语言:javascript
复制
import React from 'react';
import {Text} from 'react-native';
import Loading from './screens/Loading';
import {useRequest} from '@umijs/hooks';
import {useSaveStorage} from './components/useSaveStorage';
import {useGetStorage} from './components/useGetStorage';

const Context = React.createContext(null);

export const AppContextProvider = ({children}) => {
  const {data, error, loading} = useRequest('http://10.0.2.2:3000/data', {
    initialData: {},
    loadingDelay: 5,
  });

  useSaveStorage(data, '@storage');
  const {store} = useGetStorage('@storage');

  const anyData = data || store;

  if (loading) {
    return <Loading />;
  }

  if (error) {
    <Text>Not a network</Text>;
  }

  return <Context.Provider value={anyData}>{children}</Context.Provider>;
};

export const useContextData = () => {
  return React.useContext(Context);
};
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-29 13:44:02

因为useSaveStorage是一个React,所以不能将它放入if条件中。

我建议将useSaveStorageuseGetStorage相结合,公开store值和setStore函数。

useStorage.js

代码语言:javascript
复制
/* imports */
export const useStorage = (storage) => {
  const [error, setError] = useState(null)
  const [loading, setLoading] = useState(false)
  const [data, setData] = useState(null)

  /*
  this will load data from storage once, when component is mounting,
  after that we will use internal state
  */
  useEffect(() => {
    setLoading(true)
    /* async logic to get data from store */
    asyncGetStorage(storage).then(value => {
      setData(value)
      setLoading(false)
    }).catch(setError)
  }, [])

  const setStore = (value) => {
    setLoading(true)
    /* Logic to set data,  */
    asyncSetStorage(storage, value).then(() => {
      setData(value)
      setLoading(false)
    }).catch(setError)

  }

  return { error, loading, store: data, setStore }
}

当你使用它时

代码语言:javascript
复制
  const {data, error, loading} = useRequest('http://10.0.2.2:3000/data', {
    initialData: {},
    loadingDelay: 5,
  });
  const {error: storeError, loading: storeLoading, store, setStore } = useStorage('@storage')

  useEffect(() => {
    if (!error && !loading) {
      setStore(data)
    }

  }, [data, error, loading])

  const anyData = data || store
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60913456

复制
相关文章

相似问题

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