【发布时间】:2020-03-18 02:36:35
【问题描述】:
所以我有一个使用 Next.js 的 SSR 应用程序。我正在使用利用 WEB API 的 3rd 方组件,因此它需要加载到客户端而不是服务器上。我正在使用“两次”渲染来执行此操作,我在这里读到:https://itnext.io/tips-for-server-side-rendering-with-react-e42b1b7acd57
我试图弄清楚为什么当 next.js 页面状态中的 'ssrDone' 状态发生变化时,整个 <Layout> 组件会不必要地重新渲染,包括页面的页眉、页脚等。
我已经阅读了有关 React.memo() 以及利用 shouldComponentUpdate() 的信息,但我似乎无法阻止它重新渲染 <Layout> 组件。
<Layout> 的 console.log 消息触发两次,但 <ThirdPartyComponent> 控制台消息按预期触发一次。这是一个问题还是 React 足够聪明以至于实际上没有更新 DOM,所以我什至不应该担心这个。让它无缘无故地重新渲染我的页面页眉和页脚似乎很愚蠢。
在控制台中,输出为:
Layout rendered
Layout rendered
3rd party component rendered
index.js(下一个.js 页面)
import React from "react";
import Layout from "../components/Layout";
import ThirdPartyComponent from "../components/ThirdPartyComponent";
class Home extends React.Component {
constructor(props) {
super(props);
this.state = {
ssrDone: false
};
}
componentDidMount() {
this.setState({ ssrDone: true });
}
render() {
return (
<Layout>
{this.state.ssrDone ? <ThirdPartyComponent /> : <div> ...loading</div>}
</Layout>
);
}
}
export default Home;
ThirdPartyComponent.jsx
import React from "react";
export default function ThirdPartyComponent() {
console.log("3rd party component rendered");
return <div>3rd Party Component</div>;
}
布局.jsx
import React from "react";
export default function Layout({ children }) {
return (
<div>
{console.log("Layout rendered")}
NavBar here
<div>Header</div>
{children}
<div>Footer</div>
</div>
);
}
【问题讨论】:
标签: reactjs next.js server-side-rendering