NextJS Router 在页面重新聚焦之前不会重新加载数据
NextJS Router doesn't reload data until page refocus
目前正在使用 NextJS,但正在努力制作各种索引页面。使用路由器,我试图通过这样做来获取页码:
let router = useRouter()
let page = isNaN(router.query.page) ? 1 : parseInt(router.query.page);
因此,当我转到 page=1、page=2 等时,我会获得新的数据集。
这个功能在同一个主要组件中被调用,并且是一个 React 查询函数:
const {data, status} = useQuery(["keycaps", {manu: manuId}, {prof: profileId}, {col: colorId}, {stat: statusId}], getKeycaps)
并且所述函数如下所示:
const getKeycaps = async(key) => {
const manuId = key.queryKey[1].manu
const profileIds = key.queryKey[2].prof.map(id => `profile.id=${id}`)
const colorIds = key.queryKey[3].col.map(id => `filter_colors.id=${id}`)
const statId = key.queryKey[4].stat
const profileQueryString = profileIds.join("&")
const colorQueryString = colorIds.join("&")
let urlParams = new URLSearchParams(document.location.search);
let page = urlParams.get("page") == null ? 1 : parseInt(urlParams.get("page"));
let start = (page * 10) - 10
const data = await axios(`
${process.env.REACT_APP_STRAPI_API}/keycaps?${manuId ? 'manufacturer.id=' + manuId + '&' : ''}${profileQueryString ? profileQueryString + '&' : ''}${colorQueryString ? colorQueryString + '&' : ''}_start=${start}&_limit=10`)
return data.data
}
最初加载页面的时候,比如直接把索引的url粘贴进去(即keycaps?page=2),就可以得到所有的结果。但是,如果我开始使用这样的导航按钮:
<Link href={`/keycaps?page=${page - 1}`}> // next/link
<div className="w-32 rounded-lg cursor-pointer">
Prev
</div>
</Link>
<Link href={`/keycaps?page=${page + 1}`}>
<div className="w-32 rounded-lg cursor-pointer">
Next
</div>
</Link>
整个事情开始崩溃。本质上,在页面未聚焦之前,页面实际上不会重新加载任何数据或结果。所以,如果我按下 Next 按钮转到下一页,它不会加载数据,直到我对新的 window 执行选项卡或检查不同的 Internet 选项卡,然后当我回来时,数据将在一秒钟内神奇地加载。
我也用 next build && next start 尝试过这个,这产生了相同的结果。我只想在按下下一页和上一页按钮时获取页面结果,并且不需要用户切换选项卡来获取内容。
我会注意到我对此也有 getStaticProps
。它执行以下操作:
export async function getStaticProps() {
const allKeycaps = (await getAllKeycaps() || 'Error')
return {
props: { allKeycaps }
}
}
这将调用一个 api 脚本,并且所述脚本执行此操作:
async function fetchAPI(query, {variables} = {}) {
const res = await fetch(`${process.env.REACT_APP_STRAPI_API}/graphql`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
query,
variables,
}),
})
const json = await res.json()
if (json.errors) {
console.error(json.errors)
throw new Error('Failed to fetch API')
}
console.log('json', json.data, variables)
return json.data
}
/* Keycap related grabs */
export async function getAllKeycaps() {
const data = await fetchAPI(
`
{
keycaps {
id
slug
name
published_at
updatedAt
profile {
id
name
}
manufacturer {
id
name
lead
}
status {
id
name
}
colors
filter_colors {
color
}
kits
designer
thumb {
formats
}
}
}
`
)
return data
}
有人知道如何让它工作吗?要在这样的索引之间导航?我一直在尝试寻找使用第 1 页、第 2 页等导航的 Next 教程,但我所能找到的只是带有 slugs 的博客文章示例,没有任何类型的索引搜索。
提前致谢。
找到答案:
使用useQuery设置数据和状态时
const curPage = router.query.page == null ? 1 : router.query.page
const {data, status} = useQuery(["keycaps", {manu: manuId}, {prof: profileId}, {col: colorId}, {stat: statusId}, {page: curPage}], getKeycaps)
然后,在 getKeycaps
const page = key.queryKey[5].page
我猜“urlParams”方法不是一个好方法?或者至少,更新速度不够快。所以通过路由器页码似乎效果更好。
目前正在使用 NextJS,但正在努力制作各种索引页面。使用路由器,我试图通过这样做来获取页码:
let router = useRouter()
let page = isNaN(router.query.page) ? 1 : parseInt(router.query.page);
因此,当我转到 page=1、page=2 等时,我会获得新的数据集。 这个功能在同一个主要组件中被调用,并且是一个 React 查询函数:
const {data, status} = useQuery(["keycaps", {manu: manuId}, {prof: profileId}, {col: colorId}, {stat: statusId}], getKeycaps)
并且所述函数如下所示:
const getKeycaps = async(key) => {
const manuId = key.queryKey[1].manu
const profileIds = key.queryKey[2].prof.map(id => `profile.id=${id}`)
const colorIds = key.queryKey[3].col.map(id => `filter_colors.id=${id}`)
const statId = key.queryKey[4].stat
const profileQueryString = profileIds.join("&")
const colorQueryString = colorIds.join("&")
let urlParams = new URLSearchParams(document.location.search);
let page = urlParams.get("page") == null ? 1 : parseInt(urlParams.get("page"));
let start = (page * 10) - 10
const data = await axios(`
${process.env.REACT_APP_STRAPI_API}/keycaps?${manuId ? 'manufacturer.id=' + manuId + '&' : ''}${profileQueryString ? profileQueryString + '&' : ''}${colorQueryString ? colorQueryString + '&' : ''}_start=${start}&_limit=10`)
return data.data
}
最初加载页面的时候,比如直接把索引的url粘贴进去(即keycaps?page=2),就可以得到所有的结果。但是,如果我开始使用这样的导航按钮:
<Link href={`/keycaps?page=${page - 1}`}> // next/link
<div className="w-32 rounded-lg cursor-pointer">
Prev
</div>
</Link>
<Link href={`/keycaps?page=${page + 1}`}>
<div className="w-32 rounded-lg cursor-pointer">
Next
</div>
</Link>
整个事情开始崩溃。本质上,在页面未聚焦之前,页面实际上不会重新加载任何数据或结果。所以,如果我按下 Next 按钮转到下一页,它不会加载数据,直到我对新的 window 执行选项卡或检查不同的 Internet 选项卡,然后当我回来时,数据将在一秒钟内神奇地加载。 我也用 next build && next start 尝试过这个,这产生了相同的结果。我只想在按下下一页和上一页按钮时获取页面结果,并且不需要用户切换选项卡来获取内容。
我会注意到我对此也有 getStaticProps
。它执行以下操作:
export async function getStaticProps() {
const allKeycaps = (await getAllKeycaps() || 'Error')
return {
props: { allKeycaps }
}
}
这将调用一个 api 脚本,并且所述脚本执行此操作:
async function fetchAPI(query, {variables} = {}) {
const res = await fetch(`${process.env.REACT_APP_STRAPI_API}/graphql`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
query,
variables,
}),
})
const json = await res.json()
if (json.errors) {
console.error(json.errors)
throw new Error('Failed to fetch API')
}
console.log('json', json.data, variables)
return json.data
}
/* Keycap related grabs */
export async function getAllKeycaps() {
const data = await fetchAPI(
`
{
keycaps {
id
slug
name
published_at
updatedAt
profile {
id
name
}
manufacturer {
id
name
lead
}
status {
id
name
}
colors
filter_colors {
color
}
kits
designer
thumb {
formats
}
}
}
`
)
return data
}
有人知道如何让它工作吗?要在这样的索引之间导航?我一直在尝试寻找使用第 1 页、第 2 页等导航的 Next 教程,但我所能找到的只是带有 slugs 的博客文章示例,没有任何类型的索引搜索。 提前致谢。
找到答案:
使用useQuery设置数据和状态时
const curPage = router.query.page == null ? 1 : router.query.page
const {data, status} = useQuery(["keycaps", {manu: manuId}, {prof: profileId}, {col: colorId}, {stat: statusId}, {page: curPage}], getKeycaps)
然后,在 getKeycaps
const page = key.queryKey[5].page
我猜“urlParams”方法不是一个好方法?或者至少,更新速度不够快。所以通过路由器页码似乎效果更好。