Next.js Server Component中使用useState为什么会报错?
我在用Next.js 13的Server Component写一个搜索框,想用useState控制输入值,但一运行就报错说不能在服务器组件里使用状态钩子。我明明按照文档把组件标记成export default function Search() {...}这种形式,为啥还是不行?
尝试把组件改成客户端组件后能用了,但这样整个组件就全量客户端渲染了。有没有办法只让输入部分用客户端状态,其他部分保持服务端渲染?我试过在服务端组件里包裹suspense但没效果。
// 报错代码示例
export default function Search() {
const [query, setQuery] = useState(''); // 这里报错
return <input value={query} onChange={e => setQuery(e.target.value)} />;
}
如果你希望大部分逻辑保持在服务端渲染,只让输入框这部分用客户端状态,可以试试把输入框单独抽成一个客户端组件。比如这样:
然后在你的Server Component里引入这个客户端组件:
这样做的话,只有输入框部分会变成客户端渲染,其他部分还是服务端渲染,性能和架构上也比较合理。
其实Next.js 13的设计思路就是这样,尽量把不需要交互的部分留在服务端,只把需要状态管理或者事件处理的部分放到客户端。刚开始用可能会觉得有点麻烦,但习惯了就会发现这样分层其实挺清晰的。如果还有问题随时问,咱们一起琢磨!