App Router 下做全局 toast,传统的 context + provider 模式套在 root layout 会把整棵树变成 client component,RSC 全废。
现在流行的解法:
- 用 zustand / jotai 这类非 React Context 的全局 store,只在客户端 toast 容器订阅。
- Server Action 返回结果后,通过
router.refresh()+ 客户端 listener 触发 toast。
// client island
useEffect(() => subscribeToast(), []);
我们最后用 sonner + 一个独立的 client island,root layout 保持 server。
大家 toast 都怎么搭的?