电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

詳解vue v-model

瀏覽:136日期:2022-12-02 09:44:35

1. v-model原理

vue中v-model是一個語法糖,所謂的語法糖就是對其他基礎功能的二次封裝而產生的功能。簡單點說,v-model本身就是父組件對子組件狀態以及狀態改變事件的封裝。其實現原理上分為兩個部分:

通過props設置子組件的狀態通過監聽子組件發出的事件改變父組件的狀態,從而影響子組件的props值通過以上兩個部分,實現了父組件的狀態和子組件狀態進行了綁定的效果。

1.1 demo

v-model使用示例

<!DOCTYPE html><html> <head> <meta charset='utf-8' /> <title>v-model示例</title> <script type='text/javascript' src='http://www.hdgsjgj.cn/bcjs/vue.js'></script> </head> <body> <div id='app'> <div>這里是父組件的狀態:</div> <div style='margin-bottom: 15px;'>{{content}}</div> <Child v-model='content'></Child> </div> <template id='input'> <div> <div>這里是子組件的輸入區域:</div> <input :value='value' @input='contentChange' /> </div> </template> <script type='text/javascript'> var Child = { template: '#input', props: { value: { type: String, required: true } }, methods: { contentChange(value){ this.$emit('input', value.target.value); } } }; var vueInstance = new Vue({ el: '#app', components: {Child}, data: { content: '' } }) </script> </body></html>

在瀏覽器中打開上述html頁面,可以看到實時效果:在子組件中的input框中輸入內容可以在父組件區域實時顯示,達到了子組件中狀態和父組件狀態實時綁定的效果。

2. 修改v-model默認監聽的事件和設置prop的名稱

v-model指令默認是在子組件上設置的prop名稱是value,默認監聽子組件上的input事件,在上面的demo上,如果我們修改子組件contentChange函數中發出的事件名稱,在父組件中就無法實時獲取到子組件的輸入。

Vue中提供了通過在子組件上定義model屬性來修改這兩個參數名稱的功能,不過該功能需要在版本2.2以上才能使用,如下demo所示:

2.1 demo

<!DOCTYPE html><html> <head> <meta charset='utf-8' /> <title>v-model示例</title> <script type='text/javascript' src='http://www.hdgsjgj.cn/bcjs/vue.js'></script> </head> <body> <div id='app'> <div>這里是父組件的狀態:</div> <div style='margin-bottom: 15px;'>{{content}}</div> <Child v-model='content'></Child> </div> <template id='input'> <div> <div>這里是子組件的輸入區域:</div> <input :value='content' @input='contentChange' /> </div> </template> <script type='text/javascript'> var Child = { template: '#input', model: { prop: 'content', event: 'contentChanged' }, props: { content: { type: String, required: true } }, methods: { contentChange(value){ this.$emit('contentChanged', value.target.value); } } }; var vueInstance = new Vue({ el: '#app', components: {Child}, data: { content: '' } }) </script> </body></html>

3. Vue中對v-model指令處理分析

基于Vue2.0版本,分析我們在標簽上寫上v-model屬性到vue組件實現響應的流程。

3.1 解析部分

3.1.1 在將HTML解析稱AST時,會解析HTML中標簽的屬性

function processAttrs(el){ ... name = name.replace(dirRE, ’’) // parse arg const argMatch = name.match(argRE) if (argMatch && (arg = argMatch[1])) { name = name.slice(0, -(arg.length + 1)) } addDirective(el, name, value, arg, modifiers) ...}

提取指令的名稱,v-model的指令名稱name為model,然后添加到實例的指令中

3.1.2 將指令相關內容添加到實例指令中

export function addDirective ( el: ASTElement, name: string, value: string, arg: ?string, modifiers: ?{ [key: string]: true }) { (el.directives || (el.directives = [])).push({ name, value, arg, modifiers })}

在實例的指令屬性中添加相應的指令,這樣就實現了從html上的屬性到Vue實例上指令格式的轉換

3.2 指令設置部分

在將html解析稱AST之后,實例對應的directives屬性上就有了我們設置的v-model相關的值,包括參數值value,name是model

3.2.1 調用指令的構造函數

function genDirectives (el: ASTElement): string | void { const dirs = el.directives if (!dirs) return let res = ’directives:[’ let hasRuntime = false let i, l, dir, needRuntime for (i = 0, l = dirs.length; i < l; i++) { dir = dirs[i] needRuntime = true const gen = platformDirectives[dir.name] || baseDirectives[dir.name] if (gen) { // compile-time directive that manipulates AST. // returns true if it also needs a runtime counterpart. needRuntime = !!gen(el, dir, warn) } ...}

在v-model指令的構造函數中會根據tag的種類進行不同的創建函數進行創建,如果我們自定義指令需要在子組件上添加屬性,也需要在這個函數里面進行操作

3.2.2 普通tag下的v-model指令構造過程

function genDefaultModel el: ASTElement, value: string, modifiers: ?Object): ?boolean { ... addProp(el, ’value’, isNative ? `_s(${value})` : `(${value})`) addHandler(el, event, code, null, true) ...} addProp在el上設置一個名稱為value的prop,同時設置其值 addHandler在el上設置事件處理函數

3.3 指令響應變化部分

3.3.1 createPatchFunction統一處理指令的鉤子函數createPatchFunction函數返回一個patch函數,在patch處理過程中,會調用指令的鉤子函數,包括:

bind inserted update componentUpdated unbind

4. 總結

4.1 編譯過程

從html上解析所設置的指令 通過gen*函數將指令設置到AST上 調用指令的構造函數,設置指令需要在編譯時期處理的事情

4.2 初始化過程

通過在patch函數中,調用統一的鉤子函數,觸發指令的鉤子函數,實現相應的功能

以上就是詳解vue v-model的詳細內容,更多關于vue v-model的資料請關注好吧啦網其它相關文章!

標簽: Vue
相關文章:
主站蜘蛛池模板: 仓储笼_仓储货架_南京货架_仓储货架厂家_南京货架价格低-南京一品仓储设备制造公司 | 茅茅虫AI论文写作助手-免费AIGC论文查重_写毕业论文降重 | 镀锌方管,无缝方管,伸缩套管,方矩管_山东重鑫致胜金属制品有限公司 | 石牌坊价格石牌坊雕刻制作_石雕牌坊牌楼石栏杆厂家_山东嘉祥石雕有限公司 | 一礼通 (www.yilitong.com)-企业礼品解决方案一站式服务平台 | 澳门精准正版免费大全,2025新澳门全年免费,新澳天天开奖免费资料大全最新,新澳2025今晚开奖资料,新澳马今天最快最新图库 | 股指期货-期货开户-交易手续费佣金加1分-保证金低-期货公司排名靠前-万利信息开户 | 武汉印刷厂-不干胶标签印刷厂-武汉不干胶印刷-武汉标签印刷厂-武汉标签制作 - 善进特种标签印刷厂 | 面粉仓_储酒罐_不锈钢储酒罐厂家-泰安鑫佳机械制造有限公司 | 合肥通道闸-安徽车牌识别-人脸识别系统厂家-安徽熵控智能技术有限公司 | 智能终端_RTU_dcm_北斗星空自动化科技 | 石英砂矿石色选机_履带辣椒色选机_X光异物检测机-合肥幼狮光电科技 | 电子厂招聘_工厂招聘_普工招聘_小时工招聘信息平台-众立方招工网 | 算命免费_生辰八字_免费在线算命 - 卜算子算命网 | 西点培训学校_法式西点培训班_西点师培训_西点蛋糕培训-广州烘趣西点烘焙培训学院 | 氧化铝球_高铝球_氧化铝研磨球-淄博誉洁陶瓷新材料有限公司 | 间苯二酚,间苯二酚厂家-淄博双和化工| 大米加工设备|大米加工机械|碾米成套设备|大米加工成套设备-河南成立粮油机械有限公司 | 集装箱展厅-住人集装箱住宿|建筑|房屋|集装箱售楼处-山东锐嘉科技工程有限公司 | 光伏家 - 太阳能光伏发电_分布式光伏发电_太阳能光伏网 | 「阿尔法设计官网」工业设计_产品设计_产品外观设计 深圳工业设计公司 | 广东风淋室_广东风淋室厂家_广东风淋室价格_广州开源_传递窗_FFU-广州开源净化科技有限公司 | 危废处理系统,水泥厂DCS集散控制系统,石灰窑设备自动化控制系统-淄博正展工控设备 | 工业胀紧套_万向节联轴器_链条-规格齐全-型号选购-非标订做-厂家批发价格-上海乙谛精密机械有限公司 | 回转炉,外热式回转窑,回转窑炉-淄博圣元窑炉工程有限公司 | 耳模扫描仪-定制耳机设计软件-DLP打印机-asiga打印机-fitshape「飞特西普」 | 电缆隧道在线监测-智慧配电站房-升压站在线监测-江苏久创电气科技有限公司 | 拼装地板,悬浮地板厂家,悬浮式拼装运动地板-石家庄博超地板科技有限公司 | 工业冷却塔维修厂家_方形不锈钢工业凉水塔维修改造方案-广东康明节能空调有限公司 | 洛阳永磁工业大吊扇研发生产-工厂通风降温解决方案提供商-中实洛阳环境科技有限公司 | 进口便携式天平,外校_十万分之一分析天平,奥豪斯工业台秤,V2000防水秤-重庆珂偌德科技有限公司(www.crdkj.com) | 活性炭厂家-蜂窝活性炭-粉状/柱状/果壳/椰壳活性炭-大千净化-活性炭 | 专业的新乡振动筛厂家-振动筛品质保障-环保振动筛价格—新乡市德科筛分机械有限公司 | 仪器仪表网 - 永久免费的b2b电子商务平台 | 工业废水处理|污水处理厂|废水治理设备工程技术公司-苏州瑞美迪 今日娱乐圈——影视剧集_八卦娱乐_明星八卦_最新娱乐八卦新闻 | 开业庆典_舞龙舞狮_乔迁奠基仪式_开工仪式-神挚龙狮鼓乐文化传媒 | 玻纤土工格栅_钢塑格栅_PP焊接_单双向塑料土工格栅_复合防裂布厂家_山东大庚工程材料科技有限公司 | 食品无尘净化车间,食品罐装净化车间,净化车间配套风淋室-青岛旭恒洁净技术有限公司 | 电竞学校_电子竞技培训学校学院-梦竞未来电竞学校官网 | 进口便携式天平,外校_十万分之一分析天平,奥豪斯工业台秤,V2000防水秤-重庆珂偌德科技有限公司(www.crdkj.com) | 今日热点_实时热点_奇闻异事_趣闻趣事_灵异事件 - 奇闻事件 |