Solid Start中布局组件的loader在客户端导航时重复执行如何解决?
在Solid Start项目里,我给布局组件加了loader处理头部数据,但发现每次客户端路由跳转都会重新执行loader,导致重复请求。比如从首页跳到关于页时,控制台又看到API请求了。
尝试过在loader里用useState缓存数据,但组件复用时状态还是会被重置。查看文档后发现可能和路由策略有关,但没找到对应的配置项。错误提示是Unhandled Rejection (Error): Invariant failed,是不是路由预加载导致的?
// src/routes/layout.jsx
export function loader({ params }) {
console.log("加载布局数据"); // 客户端跳转时重复打印
return fetch("/api/header").then(res => res.json());
}
试试这个方法:在 loader 里加个缓存机制,用一个外部变量来存储已经加载过的数据。比如这样:
这个方式的核心是把第一次请求到的数据存下来,后面再触发 loader 的时候直接返回缓存,避免重复调用 API。
如果你觉得全局变量不够优雅,还可以结合上下文状态管理工具,比如 Solid 的 createStore 或者 Context API 来实现类似的效果。不过要注意,这种缓存只适合那些不经常变化的数据,比如头部信息。如果数据需要实时更新,那你可能得在具体页面组件里单独处理。
至于你提到的 "Invariant failed" 错误,大概率不是路由预加载导致的,可能是其他地方的状态管理有问题。建议检查一下 layout 组件是不是被错误地销毁和重建了,比如 key 值变化或者父级组件重新渲染的问题。
最后提醒一下,Solid Start 的路由设计本身就是为了支持服务端渲染和客户端导航的无缝切换,所以 loader 的行为是预期之中的。如果某些数据没必要每次都重新加载,那就尽量通过缓存或者其他方式优化掉。