【发布时间】:2021-04-19 05:13:14
【问题描述】:
我正在利用 Next.JS SSG 来提高我网站的加载速度。关键是我需要在客户端获取一些数据,因为它属于登录用户。
假设我们有一个类似 YouTube 的网站,所以我们将拥有 Video page 和一个侧边栏组件,即 VideoRelated:
我将通过在getStaticProps 使用VideoQuery 来生成Video page 静态。它还将获取(客户端)用户登录的完成状态,所以它会是这样的:
export const VideoRelatedList = ({ videoId, relatedVideos }) => {
const { data } = useViewerVideoStatusQuery({ variables: { videoId } });
const relatedVideosViewerStatus = data?.videos;
const videos = React.useMemo(() => {
if (!relatedVideosViewerStatus) return relatedVideos;
return relatedVideos.map((relatedVideo, index) => {
const viewerHasCompleted = relatedVideosViewerStatus[index]?.id === relatedVideo.id && relatedVideosViewerStatus[index]?.viewerHasCompleted;
return { ...relatedVideo, viewerHasCompleted };
});
}, [relatedVideosViewerStatus, relatedVideos]);
return (
<ol>
{videos.map(({ id, name, viewerHasCompleted }, index) => (
<li key={id}>
{name} - {viewerHasCompleted && 'COMPLETED!'}
</li>
))}
</ol>
);
};
结合这两种数据的最佳方法是什么?
目前,我正在做的是通过使用 React.memo 将两者结合起来,但我不确定这是否是最佳做法,或者是否有更好的方法来实现我想要的。
【问题讨论】:
-
为了更好地理解,VideoList 正在获取相关视频作为道具。那么为什么这个组件里面有查询呢?
-
因为
relatedVideo属性将是页面传递给组件的内容,该组件是静态站点生成的。但是useViewerVideoStatusQuery获取的是访问该页面的用户相关的视频状态,明显是登录状态,建站时取不到。
标签: javascript reactjs graphql next.js apollo