HTML-表单

发布时间:2026/7/22 16:17:48
HTML-表单 你说得对表单Form绝对是前端交互的“重中之重”因为它是用户与后端服务器通信的唯一HTML原生通道输入框、选择、上传文件全得靠它。但在Vue 3 单页应用SPA的语境下原生表单的很多默认行为会被完全颠覆。作为HTML初学者你必须先分清“原生HTML表单是怎么玩的”和“Vue 3中表单是怎么劫持的”。我把这块内容拆成“原生铁律”和“Vue 实战改造”两大块配合你的TS环境给你讲透。1. 原生 HTML 表单的“三大铁律”必须刻在脑子里哪怕你用Vue浏览器底层依然遵守这3条铁律铁律一form是容器。所有输入类标签input、textarea、select必须放在form里点击提交按钮才会触发表单行为。铁律二提交靠action和method。点击typesubmit的按钮浏览器会立即刷新页面把数据以GET或POST方式发往action指定的URL。!-- 原生点击后页面跳转/刷新URL变成 ?usernamexxx -- form action/api/login methodGET input nameusername button typesubmit提交/button /form铁律三数据传递靠name属性。后端收到的键名就是input nameusername中的name。Vue的v-model不会替代name两者必须共存2. Vue 3 对表单的“颠覆性改造”核心重点在 Vue 项目中我们几乎永远不让页面刷新。所以Vue拦截了表单的默认行为干掉刷新使用submit.prevent阻止默认提交.prevent是event.preventDefault()的语法糖。数据绑定抛弃了原生action改用v-model绑定响应式数据。提交逻辑抛弃了浏览器跳转改用axios或fetch在submit回调中发AJAX请求。3. 五种常用表单控件 Vue 3 TS 实战写法以下是你项目中最常用的5种控件我把原生写法重点和Vue绑定写法并列你对照着看1文本输入框 (text/password)原生关键点value是静态默认值用户修改后value变化但不会存到JS变量里。Vue 写法用v-model实现双向绑定。TS 必加类型。template !-- 原生需要写 value初始值Vue 只用 v-model -- input typetext v-modelformData.username placeholder请输入用户名 / input typepassword v-modelformData.password / /template script setup langts import { reactive } from vue; // TS 强类型定义必须提前声明表单数据结构 interface LoginForm { username: string; password: string; } const formData reactiveLoginForm({ username: , password: }); /script2单选框 (radio)原生关键点同一组单选框必须name相同value不同。选中哪个提交就传哪个value。Vue 写法v-model绑定的变量值会自动等于被选中radio的value。template labelinput typeradio valuemale v-modelformData.gender / 男/label labelinput typeradio valuefemale v-modelformData.gender / 女/label !-- 此时 formData.gender male 或 female -- /template script setup langts interface LoginForm { gender: string; } // 类型为 string /script3复选框 (checkbox)原生关键点选中时浏览器提交on不选中不提交该字段。极其反直觉。Vue 写法重要区分单个布尔值同意协议v-model绑定boolean。多个值爱好v-model绑定数组 (Array)选中自动push进数组。template !-- 单个绑定布尔值 -- input typecheckbox v-modelformData.agree / 我已阅读协议 !-- 多个绑定数组必须写 value 指定往数组里存什么 -- input typecheckbox valueswim v-modelformData.hobbies / 游泳 input typecheckbox valueread v-modelformData.hobbies / 阅读 /template script setup langts interface LoginForm { agree: boolean; // 布尔 hobbies: string[]; // 数组 } /script4下拉选择框 (select)原生关键点option里的value是传给后端的值option包裹的文字是展示给用户看的。Vue 写法v-model绑定到select标签上选中后自动赋值。template select v-modelformData.city option value请选择城市/option option valuesh上海/option option valuebj北京/option /select !-- 选择后 formData.city sh -- /template5文本域 (textarea)原生关键点不是textarea valuexxx而是textareaxxx/textarea插值写法。Vue 写法直接用v-model完全不用管插值。template textarea v-modelformData.desc rows5/textarea /template4. 提交按钮与submit的完整闭环绝对重点在 Vue 中禁止在button上写click去提交表单因为按回车键也能提交会绕过你的click。必须监听form的submit事件。template !-- .prevent 是灵魂阻止页面刷新 -- form submit.preventhandleSubmit !-- ... 各种输入框 ... -- button typesubmit登录/button !-- type 不写默认就是 submit千万别写成 button 否则按回车无效 -- /form /template script setup langts import { reactive } from vue; const formData reactive({ username: , password: }); // TS 定义提交函数异步请求 const handleSubmit async () { try { // 此处用 axios 或 fetchVue 不关心请求库 const response await fetch(/api/login, { method: POST, headers: { Content-Type: application/json }, body: JSON.stringify(formData) // 直接把响应式对象转 JSON 发给后端 }); // ... 处理返回结果 } catch (error) { console.error(error); } }; /script5. 给 HTML 新手的“原生Vue”混合避坑指南场景原生HTML的做法Vue 3 的正确姿势后果如果你做错了提交后不刷新没办法必须刷新form submit.prevent...页面闪白Vue状态丢失给输入框设默认值value老王v-model... 在reactive里赋初值页面渲染了值但修改后Vue数据不变单向绑定bug禁用表单验证加novalidate属性依然保留novalidate原生验证弹窗丑我们用UI库提示浏览器弹出难看的英文提示框上传文件 (file)name 后端multipart/form-data不能用v-model只读必须用ref获取DOM元素取files数据绑不上永远拿不到文件6. 终极心法针对你现在的阶段v-model不是万能的它只管数据绑定。name属性虽然Vue内部不用但如果你要集成第三方原生表单组件或做浏览器自动填充Autofill必须写name。input的type属性极其重要typeemail和typetext在手机端调出的键盘不一样。这是原生HTML给Vue带来的免费加成必须善用。先写静态HTML结构带name再贴v-model。这是最稳妥的开发习惯不要一上来就写v-model。如果你接下来想学表单校验Vue 里怎么用原生required配合自定义校验或者如何封装一个带校验的可复用表单组件直接告诉我我继续带你深入往下拆。