移除"use server"后,Next.js为何将Home组件视为客户端组件?
为什么移除
use server后Next.js会把Home当成Client Component? 默认情况的判定逻辑
Next.js默认会把没有依赖任何客户端特性的组件判定为Server Component。原来的代码里,create函数标记了"use server",属于专门在服务端执行的Server Action,整个Home组件既没用到useState、useEffect这类客户端专属API,也没传递需要在客户端运行的函数,所以会被当成Server Component。
移除use server后的触发逻辑
当你删掉"use server"后,情况就发生了变化:
create变成了一个普通异步函数,你把它传给了<form>的action属性。而<form>是浏览器端运行的客户端元素,Server Component的代码只在服务端执行,根本没法把普通函数序列化后传递给客户端的元素使用。- Next.js为了尝试兼容这个逻辑,会自动把
Home组件降级为Client Component(只有Client Component里的函数才能在客户端环境被调用)。但问题在于:Client Component里给<form action>传普通函数是不允许的——form的action如果是函数类型,必须是标记了"use server"的Server Action,这就导致了报错。
总结来说:移除use server后,你传递给客户端元素的普通函数触发了Next.js的组件降级逻辑,但这个函数又不符合form action的要求,所以出现了对应的错误提示。
内容的提问来源于stack exchange,提问作者user3357926
相关产品推荐
相关产品推荐

