Как отобразить экран загрузки до тех пор, пока не будут выполнены все действия по использованию и выборке?

#javascript #reactjs #react-redux #react-hooks

Вопрос:

Я знаю, как отобразить экран загрузки для одного вызова api или эффекта использования. Но у меня есть 5 компонентов внутри моего домашнего компонента. И я хочу отображать экран загрузки до тех пор, пока не будут загружены все эффекты использования в каждом компоненте. И я делаю несколько вызовов api.

Таким образом, я не могу заставить экран загрузки исчезнуть в одном компоненте. Если я это сделаю, другие будут загружаться поздно, и это будет видно пользователям.

Как с этим справиться? есть идеи?

Ответ №1:

Самый простой способ — использовать глобальное состояние. Как Переделка. Но вы также можете создать родительское состояние и обратный вызов, например

 const [loadedCount, setLoadedCount] = useState(0);
const handleLoaded = () => setLoadedCount(loadedCount  1);
 

Затем вы передаете загруженный предмет детскому реквизиту и формируете его там, чтобы запустить. Когда loadedCount === 5 все компоненты будут загружены. Но это не очень хорошее решение. Лучше использовать глобальное состояние.

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

1. Есть ли у вас какие-либо примеры, выполненные с помощью redux?

Ответ №2:

Вы могли бы завернуть их в Обещание.все. Что-то вроде этого

     const [loading, setLoading] = useState(true)
    const firstCall = new Promise(() => console.log('foo'));
    const secondCall =new Promise((resolve) => {
        setTimeout(() => {
            resolve(true);
        }, 5000);
    })
    const thirdCall = async () => await fetch(...) // async functions implicitly return a Promise
    const promises = [firstCall, secondCall];
    Promise.all(promises).then(() => setLoading(false));
 

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

1. Как использовать его в нескольких компонентах?

2. Обрабатываются ли запросы API внутри каждого компонента? Конечно, это сделало бы вышеуказанную реализацию невозможной, я предположил, что вы вызвали свои API в одном компоненте и распределили данные по подкомпонентам. Если вы пытаетесь реализовать это таким образом, вы могли бы, если не хотите усложнять процесс с помощью Redux, отслеживать каждое состояние загрузки отдельно в своем основном компоненте и изменять их состояние с помощью обратного вызова, который вы передаете своим дочерним компонентам. Хотя это тоже стало бы довольно сложным.

3. Этот код кажется неправильным. Он будет (повторно)запускать обещания после каждого рендеринга компонента .

4. @edemaine спасибо, я не думал об этом, записывая это 🙂

5. @Braks У меня есть компонент службы для обработки запросов api. И повторно использовать его в нескольких компонентах.