Vue组件上的v-model双向绑定原理是什么
发表于:2025-01-16 作者:千家信息网编辑
千家信息网最后更新 2025年01月16日,本篇内容主要讲解"Vue组件上的v-model双向绑定原理是什么",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"Vue组件上的v-model双向绑定原理是什
千家信息网最后更新 2025年01月16日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安全错误
数据库的锁怎样保障安全
数据库中对象名SC无效
巨神峰服务器在哪
数据库不能保存中文
福建网络安全协会
软件开发技术工种
服务器主机使用
国际网络安全大赛最高奖金
数据库怎么添加命令按钮下一项
数据库某同学报名男子三级跳项目
小米远程管理 无法与服务器
上海有米互联网科技
2021年网络安全相关法规
网络安全手抄报电脑版
国家信息中心网络安全部杨绍亮
口碑好的软件开发哪家便宜
杨浦区参考数据库厂家价格
数据库应用技术的思维导图
中国未来网络安全会怎么发展
数据库最好不要用哪些操作
服务器上 网站
万得 软件开发待遇
电视芯片软件开发技术
北京易联时代网络技术公司
通辽软件开发有限公司
维普数据库查期刊
地面贴图软件开发
房山区运营网络技术咨询排名靠前
数据库检索精准匹配加什么
计算机软件开发哪个项目好点
数据库表连接分类