news 2026/8/11 3:00:25

表单与双向绑定

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
表单与双向绑定

第6课 表单与双向绑定

  • 理解 v-model 双向绑定的原理(语法糖)
  • 熟练使用 v-model 处理文本框、复选框、单选框、下拉框四类控件
  • 掌握常用修饰符.trim.number
  • 能独立完成一个带校验和反馈的登录表单

1. v-model 双向绑定原理

1.1 什么是双向绑定

  • 单向绑定:value):数据变 → 页面更新
  • 双向绑定v-model):数据变 → 页面更新,同时用户输入 → 数据自动更新

1.2 v-model 是语法糖

下面两行代码完全等价

<inputv-model="message"/><input:value="message"@input="message = $event.target.value"/>

v-model 自动做了两件事:

  1. 将数据的值绑定到控件的value/checked属性
  2. 监听控件的input/change事件,把最新值写回数据

1.3 不同控件的内部机制

控件绑定的属性监听的事件
文本框 / 文本域valueinput
复选框 / 单选框checkedchange
下拉选择框valuechange

不需要背诵,但遇到奇怪表现时可回查此表。


2. 四类控件的 v-model 用法

2.1 文本框 / 密码框 / 文本域(绑定字符串)

<inputv-model="form.username"type="text"placeholder="请输入账号"/><inputv-model="form.password"type="password"/><textareav-model="form.intro"placeholder="介绍一下自己"></textarea>
  • 输入什么,数据就是什么,实时同步。

2.2 复选框

单个复选框(绑定布尔值)
<inputtype="checkbox"v-model="form.agree"/>同意协议<!-- form.agree 为 true / false -->

适用于:记住我、同意条款、开关选项。

多个复选框(绑定数组)
<inputtype="checkbox"value="编程"v-model="form.hobbies"/>编程<inputtype="checkbox"value="音乐"v-model="form.hobbies"/>音乐<inputtype="checkbox"value="运动"v-model="form.hobbies"/>运动<!-- 选中编程和音乐后:form.hobbies = ['编程', '音乐'] -->

每个复选框必须有value属性,选中的 value 会存入数组,取消时自动移除。

2.3 单选框(绑定选中项的 value)

<inputtype="radio"value=""v-model="form.gender"/><inputtype="radio"value=""v-model="form.gender"/><!-- 选中男 → form.gender = '男' -->

关键:同一组的 radio 必须绑定同一个数据,才能实现互斥。

2.4 下拉选择框

<selectv-model="form.city"><optionvalue="">请选择城市</option><optionvalue="北京">北京</option><optionvalue="上海">上海</option></select><!-- 选中上海 → form.city = '上海' -->

v-model绑定的数据会匹配optionvalue;如果没有value,则取标签内的文本。

2.5 控件绑定速查表

控件关键写法绑定数据类型典型场景
文本框/密码框/文本域v-model="data"字符串账号、密码、简介
单个复选框v-model="data"布尔值记住我、同意协议
多个复选框v-model="数组"每个带value数组爱好、权限多选
单选框多个控件绑同一个数据字符串性别、状态选择
下拉框v-model+ option 带value字符串城市、角色选择

3. v-model 修饰符

修饰符可以在同步数据前自动处理输入值

3.1.trim—— 去除首尾空格

<inputv-model.trim="form.username"/>

用户输入" admin "→ 实际存入"admin"只去首尾,中间空格保留。

3.2.number—— 自动转为数字

<inputv-model.number="form.age"type="number"/>

输入18→ 存入数字18,而非字符串"18"
注意:如果输入非数字(如"abc"),则不会转换,仍为字符串。

3.3.lazy—— 失焦后才同步

<inputv-model.lazy="keyword"/>

默认是实时同步(input事件),加.lazy后改为失去焦点或按回车时才同步(change事件)。
适用于:不希望频繁触发计算或请求的大表单。


4. 实战:登录表单(完整案例模式)

4.1 数据组织

使用reactive一个对象集中管理所有表单字段,便于整体操作。

import{reactive,ref}from'vue'constloginForm=reactive({username:'',password:'',remember:false})

4.2 逻辑部分(核心代码)

constloading=ref(false)// 提交中状态constmessage=ref('')// 提示文字constisSuccess=ref(false)// 提示类型asyncfunctionhandleLogin(){// ① 校验if(!loginForm.username||!loginForm.password){message.value='请输入账号和密码'isSuccess.value=falsereturn}// ② 模拟提交loading.value=truemessage.value=''awaitnewPromise(resolve=>setTimeout(resolve,800))// 模拟网络延迟// ③ 模拟验证结果if(loginForm.username==='admin'&&loginForm.password==='123456'){message.value=`登录成功!欢迎回来,${loginForm.username}`isSuccess.value=true}else{message.value='账号或密码错误'isSuccess.value=false}loading.value=false}

4.3 模板关键部分

<form@submit.prevent="handleLogin"><!-- 账号:文本框 + .trim --><inputv-model.trim="loginForm.username"type="text"placeholder="请输入账号"/><!-- 密码:密码框 --><inputv-model="loginForm.password"type="password"placeholder="请输入密码"/><!-- 记住我:单个复选框 --><label><inputtype="checkbox"v-model="loginForm.remember"/>记住我</label><!-- 提交按钮:动态禁用+文案 --><buttontype="submit":disabled="loading">{{ loading ? '登录中…' : '登录' }}</button><!-- 结果提示:v-if 控制显示,动态 class 控制颜色 --><pv-if="message":class="isSuccess ? 'success' : 'error'">{{ message }}</p></form>

4.4 表单提交标准流程(固定套路)

  1. 收集:用reactive对象收集所有控件值
  2. 校验:提交时进行非空、格式等检查,不通过则中断
  3. 提交:进入 loading 状态,禁用按钮,调用接口(或模拟)
  4. 反馈:根据结果显示成功/失败提示

这个模式适用于所有管理系统表单页,后续学习 Element-Plus 表单时同样适用。


5. 常见问题自查表

现象可能原因解决方法
输入框能显示但输入后数据不更新只用了:value未监听@input改用v-model或者手动补全@input更新逻辑
复选框状态不对(不是布尔值)多个复选框用了同一个非数组数据多个复选框必须绑定数组;单个复选框绑布尔值
单选框无法互斥各 radio 的v-model绑定的是不同变量同一组 radio 必须绑定同一个数据
下拉框选中后数据为空<option>缺少value属性给每个<option>加上value
提交后页面刷新、数据丢失<form>未阻止默认提交行为使用@submit.prevent
明明输入了却提示“请输入”输入的是空格,或密码框变量名写错文本框加.trim;检查变量名对应关系
点击按钮无反应方法未绑定或函数名拼写不一致检查@submit@click绑定的函数名
控制台报 xxx is not defined模板中使用了未定义的变量/方法确保<script setup>中已定义且拼写正确

小结

  • v-model=:value+@input(语法糖),自动实现双向绑定
  • 不同控件:文本框绑字符串,单个复选框绑布尔,多选复选框绑数组,radio/select绑选中值
  • 修饰符.trim去首尾空格,.number转数字,.lazy失焦触发
  • 表单套路reactive对象收集 → 校验 → loading 提交 → 结果反馈
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/11 3:00:09

Python处理HighD数据集:超车变道事件识别与邻近车辆提取实战

1. 项目概述&#xff1a;从HighD数据中挖掘驾驶行为密码 如果你正在研究自动驾驶决策规划、驾驶行为分析或者交通流仿真&#xff0c;那么HighD数据集绝对是一个绕不开的宝藏。这个由德国亚琛工业大学汽车工程研究所发布的自然驾驶数据集&#xff0c;包含了在德国高速公路上长达…

作者头像 李华
网站建设 2026/8/11 2:58:00

线段树(进阶?)

线段树动态开点适用于数列长度n很大,但是操作次数有限的情况,而且动态开点所占用的内存更少,开2*n就够// root 表示整棵线段树的根结点&#xff1b;cnt 表示当前结点个数 int n, cnt, root; int sum[n * 2], ls[n * 2], rs[n * 2]; //int sz[n*2],lazy[n*2]////---------------…

作者头像 李华
网站建设 2026/8/11 2:55:02

CTF Web安全入门:F12开发者工具实战技巧

1. 题目背景与解题思路这道来自SWPUCTF 2021新生赛的"gift_F12"题目&#xff0c;是一道典型的Web前端安全挑战题。作为CTF新手入门方向的赛题&#xff0c;它主要考察选手对浏览器开发者工具&#xff08;F12&#xff09;的熟练使用能力&#xff0c;以及基础的代码审计…

作者头像 李华
网站建设 2026/8/11 2:52:24

Vue3 + Three.js 入门教程:从零构建3D可视化应用

1. 前言&#xff1a;为什么选择 Vue3 Three.js&#xff1f;Three.js 是目前最流行的 Web 3D 图形库&#xff0c;而 Vue3 以其优秀的响应式系统和组合式 API 成为现代前端开发的首选框架之一。将两者结合&#xff0c;可以让我们在 Vue 的组件化开发模式下&#xff0c;轻松创建交…

作者头像 李华
网站建设 2026/8/11 2:50:01

图像抠图与分割核心技术解析:从原理、差异到数据集选型指南

1. 从“抠图”到“分割”&#xff1a;图像处理中的两大核心技术 在图像处理与计算机视觉的实际项目中&#xff0c;我们经常听到“Matting”&#xff08;抠图&#xff09;和“Segmentation”&#xff08;分割&#xff09;这两个词。乍一看&#xff0c;它们的目标似乎都是把图像中…

作者头像 李华
网站建设 2026/8/11 2:49:19

Unity UI动态高度自适应:基于Text.preferredHeight的高性能实现方案

1. 项目概述&#xff1a;为什么UI框的动态扩容如此重要&#xff1f;在Unity UI开发中&#xff0c;我们经常会遇到一个看似简单却影响深远的细节问题&#xff1a;一个固定宽度的文本框&#xff0c;当里面的文字内容增加时&#xff0c;如何让它的高度自动、平滑地增长&#xff0c…

作者头像 李华