I see from your code:
const cachedCategoryData = useNuxtData(`${route.params.category}${lastId.value ? '-'+lastId.value : ''}`)
const lastId = computed(() => route.query.lastid)
In JavaScript, order matters. Variables should be declared before they are used. Your lastId is computed based on the route query, which is declared after it is used in cachedCategoryData. That is a potential source of the issue you are seeing.
const lastId = computed(() => route.query.lastid)
const cacheKey = computed(() => `${route.params.category}${lastId.value ? '-'+lastId.value : ''}`)
const cachedCategoryData = useNuxtData(cacheKey.value)
And, still from your code:
const { data, error } = await useFetch(`/public/category/${route.params.category}`, {
key: `${route.params.category}${lastId.value ? '-'+lastId.value : ''}`,
watch: [lastId],
query: { lastid: lastId }
})
Plus, Nuxt (v3) automatically watches for route changes, including changes in query parameters. So, If lastId is a route query parameter, you do not need to watch it in your useFetch call
const { data, error } = await useFetch(`/public/category/${route.params.category}`, {
key: cacheKey.value,
query: { lastid: lastId.value }
})
Also, make sure to handle potential errors during fetch calls. That way, you can determine whether the issue is due to a failed API call or some other issue in your code. Here, make sure your API endpoint /public/category/${route.params.category} responds with the correct data and HTTP status code.
Revised code addition:
if (error.value) {
console.error(`Error fetching data: ${error.value}`)
// Handle error appropriately
return
}
Finally, check if you are updating the route query lastid correctly as you paginate. If it is not updated correctly, lastId computed property will not change and hence the watcher will not trigger useFetch.
Here is the revised code, taking into account those remarks:
const categoryData = ref({})
const lastId = computed(() => route.query.lastid)
const cacheKey = computed(() => `${route.params.category}${lastId.value ? '-'+lastId.value : ''}`)
const cachedCategoryData = useNuxtData(cacheKey.value)
// If category is cached, use it, otherwise fetch it
if (cachedCategoryData.data.value) {
categoryData.value = cachedCategoryData.data.value
} else {
const { data, error } = await useFetch(`/public/category/${route.params.category}`, {
key: cacheKey.value,
query: { lastid: lastId.value }
})
if (error.value) {
console.error(`Error fetching data: ${error.value}`)
// Handle error appropriately
return
}
categoryData.value = data.value
}
If the issue still persists, consider debugging each step of your application's flow to find where the data is not being updated as expected.
As noted in "Nuxt2 - watch route change", With Nuxt 3, you can use onBeforeRouteUpdate from vue-router.
The onBeforeRouteUpdate method is a Vue Router lifecycle hook, and it allows you to execute some logic before the current route changes, but while the component instance is being reused (e.g., when route parameters change).
In your case, the main issues in your original code were related to the order of declarations and the unnecessary watching of lastId in useFetch.
Since you are using the useFetch method provided by Nuxt, which already includes reactive features and should trigger a fetch whenever a watched reactive source changes, onBeforeRouteUpdate may not be necessary.