Получение данных из внешнего API перед рендерингом
У меня есть приложение, основанное на React Starter Kit.
Каждая страница имеет функцию извлечения, которая получает данные из API в жизненном цикле componentDidMount.
Я хочу сначала получить данные, а затем отобразить страницу с данными и вернуть ее клиенту. UX в моем случае неважно.
Я знаю, что РСК изоморфен, я готов изменить шаблон или создать свой собственный. Но я не понимаю, как извлечь данные из API перед рендерингом страницы (я имею в виду, как сообщить Express-серверу, какие данные требуются).
Как приложение извлекает данные сейчас:
example_page.js:
import getBooks from 'queries/getAllBooks';
...
class IdTag extends React.Component {
componentDidMount(){
this.getBooks();
}
getBooks() => {
const request = getBooks();
request
.then(...)
}
}
getAllBooks.js:
import doGet from './doGet';
let result = '';
const request = async () => {
const reqUrl = '/api/books/';
result = await doGet(reqUrl);
return result;
};
export default request;
doGet.js:
const request = async reqUrl => {
let requestResult = null;
const doQuery = async () => {
const response = await fetch(reqUrl, {
method: 'GET',
});
const result = await response.json();
result.status = response.status;
return result;
};
requestResult = await doQuery();
return requestResult
}
...
export default request;
server.js:
...
app.get('/api/*', async (req, res) => {
const newUrl = config.gate.URL + req.url.replace('/api', '');
const accessToken = req.cookies.access_token;
const response = await nodeFetch(newUrl, {
headers: {
Authorization: `Bearer ${accessToken}`,
},
});
const result = await response.json();
res.status(response.status);
res.json(result);
});
...
2 ответа
Если на каждой странице есть вызовы API, то лучше использовать Redux и Redux Saga. Цель Redx Saga - обрабатывать вызовы API. Он будет обрабатывать действия в Q. В тот момент, когда вы вызываете api, используя метод fetch, создайте ниже actioncreators
1) InitialLoading(true) 2) Извлечь создателя действия вызова API-интерфейса 3) В случае успеха создатель ошибки создаст действие действия для сохранения выходных данных метода выборки в хранилище 4) InitialLoading(false)
Вы можете просто установить флаг, когда вы начнете извлекать, и пока он извлекает, возвращайте ноль вместо рендеринга. Что-то вроде:
flag = true;
request = getBooks();
request.then(flag = false);
а потом:
render(){
if (flag){
return null;
} else {
return this.view;
}
}