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

v-model 原理详解

v-model 是 Vue.js 中用于实现双向数据绑定的重要指令,它本质上是一个语法糖,将数据绑定和事件监听结合在一起。

基本实现原理

1. 在表单元素上的实现

对于表单元素,v-model 实际上是 :value 和 @input 的语法糖:

<!-- 使用 v-model -->
<input v-model="message"><!-- 等价于 -->
<input :value="message" @input="message = $event.target.value">

原理分解:

  • :value=“message”:将数据从 Vue 实例绑定到 input 的 value 属性
  • @input=“message = $event.target.value”:监听 input 事件,当输入值时更新数据

2. 不同表单元素的处理

Vue 针对不同类型的表单元素进行了适配:

<!-- 文本框 -->
<input v-model="text" type="text"><!-- 多行文本 -->
<textarea v-model="text"></textarea><!-- 复选框 -->
<input v-model="checked" type="checkbox"><!-- 单选按钮 -->
<input v-model="picked" type="radio" value="one"><!-- 下拉选择 -->
<select v-model="selected"><option value="A">A</option>
</select>

在自定义组件中的实现

1. 默认行为

在自定义组件中使用 v-model 时:

<custom-input v-model="message"></custom-input>

等价于:

<custom-input :value="message" @input="message = $event">
</custom-input>

2. 组件内部实现

自定义组件需要这样实现:

<template><input:value="value"@input="$emit('input', $event.target.value)">
</template><script>
export default {props: ['value'],// 或者使用 model 选项(Vue 2.x)model: {prop: 'value',event: 'input'}
}
</script>

Vue 2 与 Vue 3 的区别

Vue 2 中的 v-model

<!-- 父组件 -->
<child-component v-model="pageTitle"></child-component><!-- 等价于 -->
<child-component :value="pageTitle" @input="pageTitle = $event"></child-component><!-- 子组件 -->
<script>
export default {model: {prop: 'title',event: 'change'},props: {title: String},methods: {updateValue(value) {this.$emit('change', value)}}
}
</script>

Vue 3 中的 v-model:Vue 3 进行了重大改进,支持多个 v-model

<!-- 父组件 -->
<child-component v-model:title="pageTitle" v-model:content="pageContent"></child-component><!-- 等价于 -->
<child-component :title="pageTitle" @update:title="pageTitle = $event":content="pageContent" @update:content="pageContent = $event">
</child-component><!-- 子组件 -->
<script>
export default {props: {title: String,content: String},methods: {updateTitle(title) {this.$emit('update:title', title)},updateContent(content) {this.$emit('update:content', content)}}
}
</script>

修饰符处理

v-model 支持修饰符,如 .lazy、.number、.trim:

<input v-model.lazy="msg">    <!-- 在 change 事件后同步 -->
<input v-model.number="age">  <!-- 自动转为数字 -->
<input v-model.trim="msg">    <!-- 自动去除首尾空格 -->

原理实现:

// 伪代码展示修饰符处理原理
function processModelModifiers(value, modifiers) {if (modifiers.trim) {value = value.trim()}if (modifiers.number) {value = Number(value)}return value
}

源码层面的实现

在 Vue 的编译阶段,v-model 会被转换成相应的代码:

// 编译前的模板
<input v-model="message">// 编译后的渲染函数
function render() {return _c('input', {directives: [{name: "model",value: (message),expression: "message"}],domProps: {"value": (message)},on: {"input": function ($event) {if ($event.target.composing) return;message = $event.target.value}}})
}

总结

v-model 的核心原理可以概括为:

  1. 数据绑定:通过 :value 或相应的属性将数据绑定到表单元素

  2. 事件监听:通过 @input 或相应的事件监听用户输入

  3. 数据更新:在事件处理程序中更新对应的数据

  4. 响应式更新:利用 Vue 的响应式系统自动更新界面

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

相关文章:

  • .net网站电商平台排行榜
  • 四川省建设厅官方网站扣分记录轮网站开发的重要性
  • Python为什么要使用可迭代对象
  • OUC AI Lab 第六章:基于卷积的注意力机制
  • 晋城市 制作网站自助建站系统免费模式
  • Docker安装unoconvert
  • 【ros2】ROS2接口定义指南
  • 网页制作免费网站建设wordpress函数表
  • 建设部房地产网站建设银行支行网站
  • 网站meta 优化建议教育技术专业网站开发课程
  • 网站开发课程的建议网页怎么搜索关键词
  • AngularJS 简介
  • 软考程序员2016年上半年二叉排序树案例题解答
  • LIN总线
  • 彩票走势图网站是用什么程序做的做原型的素材网站
  • 现在建网站还能赚钱吗在线教育网站建设策划
  • 梅州市住房和建设局网站网络广告文案案例
  • C++ 对象布局之padding(填充字节)
  • 做直播的视频在线观看网站成都网站制作报价
  • 现在都用什么软件做网站创建网站有免费的吗
  • MVC 布局:深入解析其原理与实践
  • iis添加网站网站设计就业前景如何
  • 学院网站建设策划书wordpress的功能简介
  • LeetCode 热题 100——滑动窗口——找到字符串中所有字母异位词
  • 土动静扭剪三轴仪技术指标
  • exe文件反编译成C语言 | 反编译技巧与应用分析
  • 指数型枚举
  • 竞价网站策划网站建设在作用是什么原因
  • 遵义住房城乡建设厅网站邯郸网站建设恋家
  • LeetCode 面试经典 150_二叉树_路径总和(75_112_C++_简单)(DFS)