SvelteKit技术问题:如何通过use:enhance动态修改表单action路径?
问题根源
你代码里只是重新赋值了handleSubmit函数内的局部action变量,但这个修改不会被use:enhance识别——因为函数参数是传入的副本,局部变量的变更不会影响外部提交逻辑,所以use:enhance还是会沿用表单上的原始action(也就是?/error)。
修复代码
要动态修改提交路径,你需要在handleSubmit里返回包含action属性的对象,让use:enhance使用你指定的新路径:
<script> import { enhance } from "$app/forms"; /** @type {import("./$types").SubmitFunction} */ const handleSubmit = ({ formData, action }) => { let targetAction = action; switch(formData.get("type")) { case "a": targetAction = new URL("?/a", action); console.log(targetAction); break; // 其他类型的处理逻辑... } // 返回自定义配置,覆盖默认提交路径 return { action: targetAction }; } </script> <form action="?/error" use:enhance={handleSubmit}> <button name="type" value="a">Submit</button> </form>
原理说明
Svelte的SubmitFunction允许返回一个SubmitResult对象,其中的action字段会覆盖表单的默认提交目标。当你返回这个对象时,use:enhance就会优先使用你指定的路径发起请求,而不是表单上的原始action。
另外用URL构造函数拼接路径是正确的做法,它会基于原始action的基础URL生成合法的相对路径,避免出现路径错误。
内容的提问来源于stack exchange,提问作者27 D
相关产品推荐
相关产品推荐

