reactjs - fetchMore 导致页面意外重新渲染
问题描述
我有一个无限滚动列表。我最近更新到最新的 Apollo 客户端,发现无限滚动不再有效。
经过深入调查。我注意到当我使用递增的跳过调用 fetchmore 时,它会导致整个页面重新呈现。有任何想法吗?
询问:
const {
data,
loading: queryLoading,
fetchMore,
error,
networkStatus
} = useQuery(SEARCH_PROFILES, {
variables: { ...searchParams, skip: skip.current },
fetchPolicy: "cache-first",
notifyOnNetworkStatusChange: true
});
获取更多
const fetchData = () => {
ErrorHandler.setBreadcrumb("Fetch more profiles");
skip.current =
skip.current + parseInt(process.env.REACT_APP_SEARCHPROS_LIMIT);
const intLimit = parseInt(process.env.REACT_APP_SEARCHPROS_LIMIT);
if (hasMore.current) {
fetchMore({
variables: {
searchType,
long,
lat,
distance,
ageRange,
interestedIn,
skip: skip.current,
limit: intLimit,
isMobile: sessionStorage.getItem("isMobile")
},
updateQuery: (previousResult, { fetchMoreResult }) => {
if (!fetchMoreResult) {
hasMore.current = false;
return previousResult;
} else if (
fetchMoreResult.searchProfiles.profiles.length < intLimit
) {
hasMore.current = false;
}
const newData = produce(previousResult, (draftState) => {
if (draftState.searchProfiles.profiles) {
draftState.searchProfiles.profiles.push(
...fetchMoreResult.searchProfiles.profiles
);
} else {
draftState.searchProfiles.profiles =
fetchMoreResult.searchProfiles.profiles;
}
});
return newData;
}
});
}
};
解决方案
好吧,根据您的解释,重新渲染是必要的,因为您在滚动时正在加载新内容,但是我们在这里关心的是不重新渲染整个页面......下面的提示可能会有所帮助。
- 将需要在滚动时获取数据的页面部分提取到单独的组件中,因为它将是唯一需要重新渲染的组件
- 包装您提取的组件,
React.memo()
以便在数据没有更改时不会重新渲染。 - 充分利用生命周期钩子方法,它们是管理在何处或如何重新渲染的工具
推荐阅读
- python - 如何在 QTreeWidget 中设置小列宽?
- java - Android java - 尝试使用模拟器手机摄像头
- laravel - laravel 背包 postgis 几何领域
- python - 如何修复“致命的 Python 错误:_enter_buffered_busy: could not aquire lock for <_io.BufferedWriter name=”
'> 在解释器关闭时' 错误? - javascript - 如何在 chrome 开发工具中运行 javascript 应用程序并将 JSON 文件作为参数?
- google-bigquery - 在 bigquery 脚本中将数组的列设置为变量值
- uwp - UWP APP可以在不同的显示器上共享一个子窗口吗?
- postgresql - 如何使用 knex 迁移?
- docker - 如何设置 Docker 容器以使用具有固定 MAC 地址的预先存在的(辅助)网络?
- bash - 如何将参数传递给 bash 命令