Vue组件上的v-model双向绑定原理是什么
发表于:2025-11-06 作者:千家信息网编辑
千家信息网最后更新 2025年11月06日,本篇内容主要讲解"Vue组件上的v-model双向绑定原理是什么",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"Vue组件上的v-model双向绑定原理是什
千家信息网最后更新 2025年11月06日Vue组件上的v-model双向绑定原理是什么
本篇内容主要讲解"Vue组件上的v-model双向绑定原理是什么",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"Vue组件上的v-model双向绑定原理是什么"吧!
组件上的v-model原理
v-model指令在组件上的编译过程的parse阶段与在表单元素上一样(可以参考),与普通表单元素不同之处在于genCode的阶段,在执行model函数生成代码的时候,会执行genComponentModel函数:
v-model编译阶段
export default function model ( el: ASTElement, dir: ASTDirective, _warn: Function): ?boolean { warn = _warn // 解析指令对象的值、修饰符、标签、类型 const value = dir.value const modifiers = dir.modifiers const tag = el.tag const type = el.attrsMap.type ...... } else if (tag === 'input' || tag === 'textarea') { // 本案例进入这个逻辑,我们分析一下 genDefaultModel(el, value, modifiers) } else if (!config.isReservedTag(tag)) { // 非保留标签,说明是组件节点,执行genComponentModel genComponentModel(el, value, modifiers) // component v-model doesn't need extra runtime return false } ...... return true}export function genComponentModel ( el: ASTElement, value: string, modifiers: ?ASTModifiers): ?boolean { // 解析修饰符 const { number, trim } = modifiers || {} const baseValueExpression = '$$v' let valueExpression = baseValueExpression // 有trim修饰符,进入下面逻辑,生成value表达式 if (trim) { valueExpression = `(typeof ${baseValueExpression} === 'string'` + `? ${baseValueExpression}.trim()` + `: ${baseValueExpression})` } // 有number修饰符,生成下面表达式 if (number) { valueExpression = `_n(${valueExpression})` } // 解析 value,生成解析规范后的表达式 const assignment = genAssignmentCode(value, valueExpression) // AST element上挂载model对象 el.model = { value: `(${value})`, expression: `"${value}"`, callback: `function (${baseValueExpression}) {${assignment}}` }}可以看到组件执行完genDirectives解析model指令后,会在AST element节点上生成model对象,这是与普通表单元素不同的地方。组件的v-model在genCode过程中,执行完genDirectives后还有有一段逻辑,如下:
export function genData (el: ASTElement, state: CodegenState): string { let data = '{' // directives may mutate the el's other properties before they are generated. // 解析model指令 const dirs = genDirectives(el, state) if (dirs) data += dirs + ',' ...... // component v-model // 组件上的v-model,进入该逻辑,拼接生成下面代码字符串 if (el.model) { data += `model:{value:${ el.model.value },callback:${ el.model.callback },expression:${ el.model.expression }},` }到这个时候才生成了最终的代码字符串。
组件生成阶段
export function createComponent ( Ctor: Class| Function | Object | void, data: ?VNodeData, context: Component, children: ?Array , tag?: string): VNode | Array | void { // ... // transform component v-model data into props & events // 如果data上有model属性 if (isDef(data.model)) { // 调用transformModel,传入的参数为组件构造器的options配置项 transformModel(Ctor.options, data) } // ... const vnode = new VNode( `vue-component-${Ctor.cid}${name ? `-${name}` : ''}`, data, undefined, undefined, undefined, context, { Ctor, propsData, listeners, tag, children }, asyncFactory ) return vnode}
在创建组件的时候,有上面这样一段逻辑,当分析到节点上有model对象的时候,会调用transformModel函数,对v-model对象做下转化:
// transform component v-model info (value and callback) into// prop and event handler respectively.function transformModel (options, data: any) { // 找到model上的prop属性 const prop = (options.model && options.model.prop) || 'value' // 找到model上的event事件 const event = (options.model && options.model.event) || 'input' // 在data的props属性对象上添加prop属性值 ;(data.props || (data.props = {}))[prop] = data.model.value // 在data的on属性对象上添加event事件 const on = data.on || (data.on = {}) if (isDef(on[event])) { on[event] = [data.model.callback].concat(on[event]) } else { on[event] = data.model.callback }}可以看到最终是将编译过程中生成的model对象,解析成为value属性和input事件,扩展到组件构造器的options配置项中。
以上可以得知,组件上v-model指令的本质也是生成了value属性和input事件。
到此,相信大家对"Vue组件上的v-model双向绑定原理是什么"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
组件
对象
生成
属性
指令
逻辑
原理
事件
时候
阶段
双向
代码
元素
函数
节点
表单
表达式
过程
编译
不同
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
tv软件开发 tcl
access数据库教程全集
cpws数据库
我的世界服务器 村民
金华云软件开发要求
数据库图标怎么添加
戴尔服务器自动关机设置
远程服务器怎么制作数据库
为什么原神两个服务器不能一起玩
图片批量上传加入数据库
无限飞行导航数据库
数据库网站安全教程
手机号被提示网络安全
济南东忠软件开发有限公司电话
郑州优游网络技术
传奇游戏网关服务器未开启
数据库 密码储存
赵小亮黄金数据库
怎么修改服务器上的源代码
网络安全班会总结大学
网络安全是不是越老越吃香
北京邮电大学网络技术研究院网站
在线软件开发协议
高青应用软件开发
亚洲电视app无法连接服务器
qmc服务器工作报告
浪潮服务器工作站日志收集
软件开发15000
网络安全比较好的上市公司
oracle数据库小组功能