#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. И повторно использовать его в нескольких компонентах.