You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

软件开发学习需求:请求提供带分步示例与样例文档的V-model详解

分步理解Vue中v-model的工作机制与实战案例

一、v-model的核心本质

v-model本质是Vue提供的语法糖,它等价于同时绑定v-bind:value(从数据到视图的单向传递)和v-on:input(监听视图变化更新数据)。对于不同表单元素,Vue会自动适配对应的事件和属性(比如复选框用change事件和checked属性),但核心逻辑一致。


二、实战案例:用户信息收集表单

我们从零开始搭建一个简单的用户信息表单,逐步拆解v-model的应用流程。

步骤1:基础文本输入框绑定

先创建一个最基础的Vue实例,实现输入框与数据的双向绑定:

<div id="app">
  <label>用户名:</label>
  <input type="text" v-model="username">
  <p>你输入的用户名是:{{ username }}</p>
</div>

<script>
new Vue({
  el: '#app',
  data() {
    return {
      username: ''
    }
  }
})
</script>

拆解逻辑:

  • v-model="username" 等价于 :value="username" @input="username = $event.target.value"
  • 当你在输入框输入内容时,input事件触发,自动把输入框的值同步到username变量;同时username变量变化时,输入框的value也会自动更新。

步骤2:绑定多种表单元素

扩展表单,加入密码框、性别单选组、兴趣复选框、城市下拉选择器,覆盖v-model的常见场景:

<div id="app">
  <h3>用户信息收集</h3>
  
  <!-- 文本输入框 -->
  <div>
    <label>用户名:</label>
    <input type="text" v-model="userInfo.username">
  </div>

  <!-- 密码框 -->
  <div>
    <label>密码:</label>
    <input type="password" v-model="userInfo.password">
  </div>

  <!-- 单选组 -->
  <div>
    <label>性别:</label>
    <input type="radio" value="male" v-model="userInfo.gender"> 男
    <input type="radio" value="female" v-model="userInfo.gender"> 女
  </div>

  <!-- 复选框组 -->
  <div>
    <label>兴趣:</label>
    <input type="checkbox" value="reading" v-model="userInfo.hobbies"> 阅读
    <input type="checkbox" value="coding" v-model="userInfo.hobbies"> 编程
    <input type="checkbox" value="travel" v-model="userInfo.hobbies"> 旅行
  </div>

  <!-- 下拉选择器 -->
  <div>
    <label>城市:</label>
    <select v-model="userInfo.city">
      <option value="">请选择</option>
      <option value="beijing">北京</option>
      <option value="shanghai">上海</option>
      <option value="guangzhou">广州</option>
    </select>
  </div>

  <!-- 预览数据 -->
  <div class="preview">
    <h4>已填写信息:</h4>
    <pre>{{ userInfo }}</pre>
  </div>
</div>

<script>
new Vue({
  el: '#app',
  data() {
    return {
      userInfo: {
        username: '',
        password: '',
        gender: '',
        hobbies: [], // 复选框组绑定数组
        city: ''
      }
    }
  }
})
</script>

关键细节:

  • 单选组的v-model绑定的是单个值,选中的单选框value会自动同步到绑定变量
  • 复选框组需要绑定数组,每个选中的复选框value会被加入数组
  • 下拉选择器的v-model绑定的是选中项的value值

步骤3:自定义组件中使用v-model

要彻底理解v-model,必须掌握在自定义组件中如何实现双向绑定。我们封装一个自定义的输入组件CustomInput:

<div id="app">
  <label>自定义输入组件:</label>
  <custom-input v-model="message"></custom-input>
  <p>绑定的值:{{ message }}</p>
</div>

<script>
// 注册自定义组件
Vue.component('CustomInput', {
  props: ['value'], // 必须接收value属性
  template: `
    <input 
      type="text" 
      :value="value" 
      @input="$emit('input', $event.target.value)"
    >
  `
})

new Vue({
  el: '#app',
  data() {
    return {
      message: ''
    }
  }
})
</script>

核心逻辑:

  1. 自定义组件必须声明value作为props,接收父组件传递的值
  2. 组件内部的输入框通过:value="value"绑定props的值
  3. 监听输入框的input事件,通过$emit('input', 新值)把数据传递回父组件
  4. 父组件的v-model="message"会自动接收input事件传递的值,完成双向绑定

如果是Vue 3,自定义组件的v-model语法略有调整(用modelValue代替value,update:modelValue代替input事件),逻辑一致:

<!-- Vue 3 自定义组件示例 -->
<template>
  <input 
    type="text" 
    :value="modelValue" 
    @input="$emit('update:modelValue', $event.target.value)"
  >
</template>

<script setup>
defineProps(['modelValue'])
defineEmits(['update:modelValue'])
</script>

三、总结

v-model的核心就是数据→视图和视图→数据的双向同步:

  • 从数据到视图:通过v-bind绑定属性
  • 从视图到数据:通过监听对应事件(input/change等)更新数据
  • 不同表单元素和自定义组件的适配,本质都是围绕这个核心逻辑展开

内容的提问来源于stack exchange,提问作者web216

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 10:49:54