v-model原理(简易源码版)

server/2024/10/18 14:18:40/

说明

最近对v-model的源码分析一会,现在分享一下自己的见解,由于对源码可能不太熟悉,可能分析的太片面了,如果有大佬看见了也可以补充,我会及时的修改

作用与机制的分析

  1. 双向数据绑定机制
    v-model 是 Vue.js 中用于实现双向数据绑定的关键指令,它使得表单输入元素(如 input、textarea、select 等)的值能够与 Vue 实例的数据属性自动保持同步。双向数据绑定意味着当用户在表单元素上进行交互(如输入文本、选择选项等)时,Vue 实例对应的 data 属性会立即更新;反之,如果 data 属性的值发生变化,表单元素的显示值也会相应更新。
  2. v-model 的语法糖解析
    v-model 在底层实际上是以下两部分行为的封装:
    数据绑定(v-bind:value):将 Vue 实例中指定的数据属性(如 msg)绑定到表单元素的 value 属性(对于 checkbox 和 radio 类型,可能绑定的是 checked 属性)。这样,初始时表单元素会显示对应数据属性的值。

分析

  1. 由于v-model是指令,所以我们可以使用Vue给我们提供的自定义指令的方法Vue.directive()
  2. 使用自定义指令里面提供的bind方法,在这里主要是对绑定的元素进行绑定事件
    由于一般只有表单元素会和用户进行交互,所以这里就只对表单元素进行绑定,初次绑定之后,

比如:文本框绑定的input事件,select绑定的是change事件

3.先使用 el.value = vm[binding.expression]将一开始在data绑定的值给表单的初始值(value)
4.然后给相对应的表单添加对应的响应事件
5.在响应事件函数回调中修改绑定的变量值,值为当前的表单的值,现在初始化
完成了,也做到了页面的值和data的值一样了,但是还有一个问题没解决,就是在改变data里面的值的时候怎么做到让页面的值更改
6.使用update监听该指令绑定的值是否改变,改变的时候 **el.value = vnode.context[binding.expression];**将页面的值替换为data的值

javascript">// 定义一个名为 "my-model" 的自定义指令,实现类似 v-model 的双向绑定功能
Vue.directive('my-model', {// 指令的 "bind" 钩子,在元素首次绑定指令时执行bind(el, binding, vnode) {// 获取当前指令绑定的 Vue 实例上下文const vm = vnode.context;// 初始化时设置元素值,将数据模型的值赋给元素的 value 属性el.value = vm[binding.expression];// 监听 input 事件,当元素值发生改变时,更新数据模型el.addEventListener('input', function (event) {// 使用 $set 方法确保数据模型的属性变更能够触发视图更新vm.$set(vm, binding.expression, event.target.value);});},// 指令的 "update" 钩子,在指令绑定的值发生变化时执行// 优化:使用 "update" 钩子替代内嵌 Vue 实例,避免内存泄漏update(el, binding, vnode) {// 当数据模型的值变化时,同步更新元素的 value 属性el.value = vnode.context[binding.expression];},});// 创建主 Vue 实例new Vue({el: '#app',data: {inputValue: '', // 数据模型,用于双向绑定的值},methods: {showValue() {alert(this.inputValue); // 显示当前数据模型的值},},});

http://www.ppmy.cn/server/16204.html

相关文章

梳理 Pytorch 19个方面,70个核心操作全总结!

最新写了很多关于 Pytorch 的文章,喜欢可以从0开始学习: 小白学 PyTorch 系列:这一次,我准备了 20节 PyTorch 中文课程小白学 PyTorch 系列:54个超强 pytorch 操作小白学 PyTorch 系列:9个技巧让你的 PyTo…

Ribbon饥饿加载

Ribbon默认开启的是懒加载,在第一次访问的时候才会进行创建LoadBalanceClient,请求时间会很长。而饥饿模式会在项目启动的是后就创建,降低第一次访问时的功耗, 开启Ribbon饥饿加载 ribbon:eager-load:enbled: true#配置单个clients: userse…

vue项目的Husky、env、editorconfig、eslintrc、tsconfig.json配置文件小聊

一、Git配置文件 1、Husky Husky 是一款管理 git hooks 的工具,可以帮助我们触发git提交的各个阶段:pre-commit、commit-msg、pre-push, 有助于我们在项目开发中的git规范和团队协作。 .husky文件通常包含以下内容: pre-commi…

WPF —— lCommand命令实例

首先在标签页面设置一个Button按钮 <Button Width"100" Height"40" Content"测试" ></Button> 1 创建一个类 继承于ICommand这个接口&#xff0c; 这个接口一般包含三部分&#xff1a; 俩个方法&#xff1a;一个判断指令是不是…

clickhouse数据去重函数介绍(count distinct)

非精确去重函数&#xff1a;uniq、uniqHLL12、uniqCombined 精确去重函数&#xff1a;uniqExact、groupBitmap 测试数据量&#xff1a;2000w 结论&#xff1a; 1.整形值精确去重场景&#xff0c;groupBitmap 比 uniqExact至少快 2x 2.groupBitmap仅支持无符号整形值去重&#x…

【MySQL 数据宝典】【磁盘结构】- 001 表空间介绍优化建议

一、表空间介绍 InnoDB 其实是使用 页 为基本单位来管理存储空间的&#xff0c;默认的 页 大小为 16KB 。 对于 InnoDB 存储引擎来说&#xff0c;每个索引都对应着一棵 B 树&#xff0c;该 B 树的每个节点都是一个数据页&#xff0c;数据页之 间不必要是物理连续的&#xff0c…

java可盈保险合同管理系统的设计与实现(springboot+mysql源码+文档)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的可盈保险合同管理系统。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 基于Spring Boot的…

【STM32HAL库】外部中断

目录 一、中断简介 二、NVIC 1.寄存器 2.工作原理 3.优先级 4.使用NVIC 三、EXTI 1.简介 2.AFIO&#xff1a;复用功能IO&#xff0c;主要用于重映射和外部中断映射配置​编辑 3. 中断使用 4.HAL库配置使用 一、中断简介 中断的意义&#xff1a;高效处理紧急程序&#xff0c;不会…