Is there any way to signal a Server Component to refetch?

I'm learning about the Server Components and I came across a scenario that I'm not entirely sure how to fix. It's from this repository: https://github.com/vercel-labs/ai-chatbot, but the bottom line is that there's a Server Component that calls the server action getChats once the page loads, but I need to make this behavior happen again, like trigger a refetch once at least a message has been sent. My question is: is it possible to trigger a Server Component to refetch/revalidate? I saw the revalidating docs, but I couldn't find an answer to make an specific component to do it, only the whole page.
Solution:
So what I'm guessing is that the only way to do it is to revalidatePath after sending the message, is that correct?
So, to sum up, this is the correct way to fix this, right?...
Jump to solution
28 Replies
Brendonovich
Brendonovich15mo ago
I'm pretty sure you have to invalidate the whole route/route segment. It may seem weird but the way I understand it is that the fetched data isn't just linked to that component, but rather its position in the whole component tree. If you were to try and revalidate that component, what would happen if you rendered multiple of them? How would you indicate which version of the component should revalidate? In my head, the route segments act as 'markers' in the component tree, marking specific locations that are wrapped in suspense/error boundaries and can be refetched.
choco
choco15mo ago
i have not been using next.js for a while, so i just havent fully understand server components, but can you use web sockets?
deforestor
deforestor15mo ago
I cannot wrap my head around it yet. So I do have to revalidate the whole "page" if I want to update the component? It's, like, a sidebar component
In my head, the route segments act as 'markers' in the component tree, marking specific locations that are wrapped in suspense/error boundaries and can be refetched.
I'm not sure I understand this. When you say "specific locations", are those "locations" pages? If you're asking in my case, no. It's a request X that happens after Y only once. If this was trpc, I'd only need to invalidate the getChats request inside the onSuccess of the chat initiation
Brendonovich
Brendonovich15mo ago
Yeah you'll need to invalidate the route segment, whether that's a page or a layout
deforestor
deforestor15mo ago
How would I invalidate a layout? I couldn't understand that from the docs
Brendonovich
Brendonovich15mo ago
pages/layouts, just places in the vdom tree. it's a weird way of thinking about it but it works for me
deforestor
deforestor15mo ago
Whaaat
Brendonovich
Brendonovich15mo ago
I don't think u can invalidate a layout that's alongside a page separately, only layouts for parent route segments
deforestor
deforestor15mo ago
So.. I should have it inside /layouts instead of /components?
Brendonovich
Brendonovich15mo ago
No /app is the only thing that matters I think you can revalidate a layout and everything under it with revalidatePath Another way to think about this is that data is cached according to the route segment it was fetched in When you use a server component inside a page.tsx or layout.tsx, you're essentially just copy-pasting the component from where you defined it into that specific route segment And so that specific instance of the server component will have its data tied to that route segment
deforestor
deforestor15mo ago
Right, so they are always tied to the route Unless it's not a server component
Brendonovich
Brendonovich15mo ago
Yeah data fetched in a server component is tied to the route in next
deforestor
deforestor15mo ago
That's what I thought was the case. But then I feel like vercel's implementation of the side bar with a server component was a terrible idea
Brendonovich
Brendonovich15mo ago
Why's that?
deforestor
deforestor15mo ago
You've used chatgpt, right?
Want results from more Discord servers?
Add your server