当前位置: 首页 > news >正文

v-model 入门教程

一、核心概念

v-model 是 Vue.js 中实现双向数据绑定的指令,主要用于表单输入元素或自定义组件中。它本质上是语法糖,将 v-bind(单向绑定)和 v-on(事件监听)结合使用。

1.1 基本原理

  • 单向绑定v-bind:value="message" 将数据从组件传递到 DOM。
  • 事件监听v-on:input="message = $event.target.value" 将 DOM 的变化同步回数据。
  • v-model 的等价写法
    <input v-model="message">
    <!-- 等价于 -->
    <input :value="message" @input="message = $event.target.value">
    

二、基础用法

2.1 绑定到表单输入

文本输入
<template><input v-model="message" placeholder="输入内容"><p>输入的内容:{{ message }}</p>
</template><script>
export default {data() {return {message: ''}}
}
</script>
多行文本(textarea)
<textarea v-model="description"></textarea>
复选框(Checkbox)
  • 单个复选框(绑定布尔值):
    <input type="checkbox" v-model="isChecked">
    <label>{{ isChecked ? '已选中' : '未选中' }}</label>
    
  • 多个复选框(绑定数组):
    <input type="checkbox" v-model="hobbies" value="读书">
    <input type="checkbox" v-model="hobbies" value="运动">
    <input type="checkbox" v-model="hobbies" value="音乐">
    <p>爱好:{{ hobbies.join(', ') }}</p>
    
单选按钮(Radio)
<input type="radio" v-model="gender" value="">
<input type="radio" v-model="gender" value="">
<p>性别:{{ gender }}</p>
选择框(Select)
  • 单选
    <select v-model="selectedFruit"><option value="苹果">苹果</option><option value="香蕉">香蕉</option>
    </select>
    
  • 多选(绑定数组):
    <select v-model="selectedFruits" multiple><option value="苹果">苹果</option><option value="香蕉">香蕉</option>
    </select>
    

三、高级用法

3.1 修饰符(Modifiers)

Vue 提供了多个修饰符来简化常见操作:

.lazy
  • 默认在 input 事件时同步数据,使用 .lazy 修饰符改为在 change 事件后同步:
    <input v-model.lazy="message">
    
.number
  • 自动将输入值转换为数字类型:
    <input v-model.number="age">
    
.trim
  • 自动过滤输入的首尾空格:
    <input v-model.trim="username">
    

3.2 自定义组件中的 v-model

在自定义组件中使用 v-model 时,需要明确组件如何接收和触发更新。

Vue 2 的用法
  • 组件内部通过 value prop 接收数据,通过 input 事件触发更新:
    <!-- 父组件 -->
    <custom-input v-model="searchText"></custom-input>
    
    <!-- 子组件 CustomInput.vue -->
    <template><input :value="value" @input="$emit('input', $event.target.value)">
    </template>
    <script>
    export default {props: ['value']
    }
    </script>
    
Vue 3 的用法
  • Vue 3 支持多个 v-model 绑定,且默认使用 modelValue 作为 prop,update:modelValue 作为事件:
    <!-- 父组件 -->
    <custom-input v-model="searchText"></custom-input>
    
    <!-- 子组件 CustomInput.vue -->
    <template><input :value="modelValue" @input="$emit('update:modelValue', $event.target.value)">
    </template>
    <script>
    export default {props: ['modelValue']
    }
    </script>
    
多个 v-model 绑定(Vue 3)
<!-- 父组件 -->
<custom-user v-model:name="userName" v-model:age="userAge"></custom-user>
<!-- 子组件 CustomUser.vue -->
<template><input :value="name" @input="$emit('update:name', $event.target.value)"><input :value="age" @input="$emit('update:age', $event.target.value)">
</template>
<script>
export default {props: ['name', 'age']
}
</script>

四、常见问题

4.1 为什么数据未同步?

  • 原因:未正确声明 v-model 的 prop 或未触发事件。
  • 解决方案
    • 检查子组件是否通过 props 接收数据。
    • 确保通过 $emit 触发 update:modelValue 事件(Vue 3)或 input 事件(Vue 2)。

4.2 如何绑定非表单元素?

  • 场景:需要手动控制 v-model 的更新逻辑。
  • 解决方案:使用计算属性或手动监听事件:
    <template><div @click="handleClick">{{ customValue }}</div>
    </template>
    <script>
    export default {props: ['modelValue'],methods: {handleClick() {this.$emit('update:modelValue', '点击后的值')}}
    }
    </script>
    

五、最佳实践

  1. 优先使用原生表单元素:v-model 在表单元素上的表现最直观。
  2. 自定义组件时明确约定:通过 props$emit 定义清晰的接口。
  3. 合理使用修饰符:避免手动处理类型转换或空格过滤。
  4. Vue 2 与 Vue 3 的差异:注意 Vue 3 中 v-model 的默认 prop 和事件名称变化。

六、总结

v-model 是 Vue.js 中实现双向数据绑定的核心工具,通过简单的语法糖大幅简化了表单处理的逻辑。无论是绑定原生表单元素还是自定义组件,掌握 v-model 的用法都能显著提升开发效率。

http://www.dtcms.com/a/338620.html

相关文章:

  • 构建现代化的Web UI自动化测试框架:从图片上传测试实践说起
  • 【网络运维】Ansible roles:角色管理
  • 前端多环境变量配置全攻略:开发 / 测试 / 生产自动切换实战
  • 时间差值工具Date.now()和performance.now()
  • 【实时Linux实战系列】实时大数据处理与分析
  • 【STM32】HAL库中的实现(五):ADC (模数转换)
  • 服务器经常宕机的原因及解决办法
  • Xftp8传输文件与 Linux 系统 Anaconda 安装
  • 腾讯混元3D系列开源模型:从工业级到移动端的本地部署
  • 游戏相机震动与武器后坐力实现指南
  • 禾赛激光雷达AT128P/海康相机(2):基于欧几里德聚类的激光雷达障碍物检测
  • VScode ROS文件相关配置
  • 知识篇 | 中间件会话保持和会话共享有啥区别?
  • 在Windows高效使用OpenCode的方案
  • Rust 入门 返回值和错误处理 (二十)
  • Docker 快速下载Neo4j 方法记录
  • 管道魔法再现:卡巴斯基发现与CVE-2025-29824漏洞利用相关的进化版后门程序
  • Rust学习笔记(七)|错误处理
  • 人工智能驱动的开发变革
  • 安全多方计算(MPC)技术解析及NssMPClib开源项目实践
  • 驱动开发系列65 - NVIDIA 开源GPU驱动open-gpu-kernel-modules 目录结构
  • ubuntu24 编译安装php-7.4.33
  • Python入门第11课:Python网络请求入门,使用requests库轻松获取网页数据
  • 什么是大数据平台?大数据平台和数据中台有什么关系?
  • RNN如何将文本压缩为256维向量
  • ubuntu下编译c程序报错“ubuntu error: unknown type name ‘uint16_t’”
  • 【保姆级教程~】如何在Ubuntu中装miniconda,并创建conda虚拟环境
  • ubuntu20.04 上 flathub summary exceeded maximum size of 10485760 bytes 的处理
  • 边缘智能体:Go编译在医疗IoT设备端运行轻量AI模型(上)
  • 分布式机器学习之流水线并行GPipe:借助数据并行来实现模型并行计算