Как отображать индикатор активности до тех пор, пока все элементы не будут сопоставлены

#reactjs #react-native

Вопрос:

У меня есть этот экран, на котором я хочу видеть ActivityIndicator , пока все устройства не будут сопоставлены (не извлечены):

 const MyScreen = () => {
    const [devices, setDevices] = useState();
    const [isLoading, setIsLoading] = useState(true);

    useEffect(() => {
        getDevices();
    }, []);

    const getDevices = async () => {
        const pulledDevices = await fetchDevices();        
        setDevices(pulledDevices)
        setIsLoading(false)
    };

    if (isLoading)
        return (
            <ActivityIndicator />
        );
    return (
        <View >
            {devices?.map((device) => {
                return (
                    <View>
                        <Text>{device.name}</Text>
                    </View>
                );
            })}
        </View>
    );
};
 

Сопоставление этих устройств занимает некоторое время.

Как я мог бы реализовать здесь ActivityIndicator , пока все devices не будут сопоставлены.

Комментарии:

1. Как выглядит ваша логика, чтобы управлять флагом загрузки и выборкой?

2. Я обновил свой вопрос.

Ответ №1:

Я предлагаю вам использовать немного более сложный асинхронный крюк ожидания, чтобы справиться с этим.

useAsyncHook.js

 const useAsync = asyncFunction => {
  const [loading, setLoading] = useState(false);
  const [result, setResult] = useState(null);
  const [error, setError] = useState(null);

  const execute = useCallback(async () => {
    setLoading(true);
    setResult(null);
    setError(null);
    try {
      const response = await asyncFunction();
      setResult(response);
      setLoading(false);
    } catch (error) {
      setError(error);
      setLoading(false);
    }
  }, [asyncFunction]);


  useEffect(() => {
    execute();
  }, [execute]);

  return { loading, result, error };
};

 

Это необработанный асинхронный хук, который может быть улучшен многими способами, но он правильно обрабатывает состояние загрузки в этом состоянии.

Использование:

 const { loading, result, error } = useAsync(yourFunction);

if (loading) return null;
return <Component />;