Я делаю приложение для рендеринга на стороне сервера, используя Next Js (React SSR).
Index. js (просто вызывая компоновку другого компонента в индексе)
import Layout from "./layout";
import React from "react";
class Home extends React.Component {
render() {
return (
<div>
<Layout />
</div>
);
}
}
export default Home;
Компоновка. js
import React from "react";
import Product from "./product";
class Layout extends React.Component {
static async getInitialProps() {
const res = await fetch("https://api.github.com/repos/developit/preact");
console.log(res);
const json = await res.json();
return { stars: json.stargazers_count };
}
componentDidMount() {
if (localStorage.getItem("userLoggedIn")) {
//Get products details for logged in user api
//For now let us consider the same api
// const res = fetch("https://api.github.com/repos/developit/preact");
// const json = res.json(); // better use it inside try .. catch
// return { stars: json.stargazers_count };
} else {
// Get product details for guest user api
//For now let us consider the same api
// const res = fetch("https://api.github.com/repos/developit/preact");
// const json = res.json();
// return { stars: json.stargazers_count };
}
}
render() {
return (
<div>
This is layout page
<Product stars={this.props.stars} />
</div>
);
}
}
export default Layout;
Полный простой пример применения приведен здесь : https://codesandbox.io/s/nextjs-getinitialprops-748d5
Моя проблема здесь в том, что я пытаюсь передать реквизиты на страницу product
со страницы layout
, а реквизиты принимаются от getInitialProps
(SSR). Но вы можете увидеть в В приведенном примере реквизит не работает, и он по-прежнему выдает undefined для this.props.stars
.
Если переместить этот код в componentDidMount
и использовать setState
и передать состояние в качестве реквизита будет работать, но это не будет отображать данные, извлеченные из API в исходной странице просмотра.
Примечание: Пожалуйста, не перемещайте этот лог c в индексный файл. js файл, где он работает, но в моем реальном приложении это динамическая c страница маршрутизации, и я получу API в соответствии с параметром запроса, полученным на этой странице.
Если вы получите по этой ссылке https://748d5.sse.codesandbox.io/ и нажмите ctrl + u
, тогда вы увидите источник, где я также нуждаюсь в динамическом c содержимом, полученном из API.
Для достижения этой динамически c содержимое (количество звездочек здесь в этом примере) отображается только в виде источника. Я делаю все это, что предназначено для целей SEO.