摘要:引子在前端開(kāi)發(fā)中,常常有這樣的的代碼,先是在中定義了頁(yè)面結(jié)構(gòu)在有交互時(shí),用通過(guò)其來(lái)取到節(jié)點(diǎn),然后將數(shù)據(jù)寫(xiě)進(jìn)去,如。小結(jié)雙向綁定本質(zhì)上是一種的思想,通過(guò)讓頁(yè)面元素聲明自己依賴(lài)的邏輯不依賴(lài)具體達(dá)到了解耦合的目的。
引子
在前端開(kāi)發(fā)中,常常有這樣的naive的代碼,先是在HTML中定義了頁(yè)面結(jié)構(gòu):
100
在有交互時(shí),用js通過(guò)其class來(lái)取到節(jié)點(diǎn),然后將數(shù)據(jù)寫(xiě)進(jìn)去,如$(".order-total").html(300)。
大約在三年前,這種做法在業(yè)界還頗為流行,幾乎所有的書(shū)里,網(wǎng)上教義,都在鼓吹這種分離JS和HTML的行為,認(rèn)為這么做就是天經(jīng)地義。
但是當(dāng)代碼量多了之后,當(dāng)頁(yè)面交互復(fù)雜了之后,我們的代碼常常就成了:
if (exist($(".selector"))) { // do something }
整個(gè)文件中,充斥著這樣或那樣的if,因?yàn)闆](méi)人能確定這個(gè)節(jié)點(diǎn)是否存在。還充斥著另一種東西:
/* note: 這不是標(biāo)準(zhǔn)的jquery代碼 */ var quantity = $(this).parent().parent().find(".quantity-value");
這種連扔垃圾桶都不配的代碼真是寫(xiě)的時(shí)候爽,后面維護(hù)者遭殃的典型范例,你必須不斷地切換js/html來(lái)審視其強(qiáng)依賴(lài)的結(jié)構(gòu)。
那么問(wèn)題來(lái)了,為什么會(huì)寫(xiě)出這樣的代碼呢?
因?yàn)檫@種代碼是最符合直覺(jué)的書(shū)寫(xiě)方式,一個(gè)初級(jí)程序員未經(jīng)任何訓(xùn)練,就能寫(xiě)出這樣的代碼。它的名字叫:命令式編程。
存在的問(wèn)題命令式編程存在的問(wèn)題就是,寫(xiě)的人在寫(xiě)的時(shí)候知道是怎么回事,試圖掌控一切,后果是:
- 不知道代碼中的一系例選擇器對(duì)應(yīng)著什么節(jié)點(diǎn)
- 可維護(hù)性差,你不敢輕易改動(dòng)類(lèi)名或刪除節(jié)點(diǎn),也不清楚節(jié)點(diǎn)的內(nèi)容究竟對(duì)應(yīng)著什么數(shù)據(jù)
- 代碼量多
上面說(shuō)道,命令式編程試圖控制一切,而解決的辦法就是,交出控制權(quán),將控制權(quán)反轉(zhuǎn),即:
不要來(lái)找我,我會(huì)去找你。
原來(lái)的工作流:
用戶(hù)輸入/點(diǎn)擊/Ajax請(qǐng)求
數(shù)據(jù)變化 => order = 100
取節(jié)點(diǎn),將內(nèi)容設(shè)到頁(yè)面 => $(".order-div").html(order) #JS主動(dòng)來(lái)找DOM#
如果頁(yè)面已經(jīng)不需要這個(gè)信息了,將.order-div從html中刪掉,重復(fù)上面的流程,執(zhí)行到第三步時(shí),JS將拋出異常,因?yàn)楣?jié)點(diǎn)找不到。
控制反轉(zhuǎn)的工作流:
元素監(jiān)聽(tīng)數(shù)據(jù)變化,即#我會(huì)去找你#
用戶(hù)輸入/點(diǎn)擊/Ajax請(qǐng)求
數(shù)據(jù)變化 => order = 100
元素的innerHTML將被自動(dòng)設(shè)上100
如果頁(yè)面已經(jīng)不需要這個(gè)信息了,將.order-div從html中刪掉,重復(fù)上面的流程,對(duì)程序沒(méi)有任何影響,因?yàn)槭枪?jié)點(diǎn)自己去取數(shù)據(jù),而不是JS主動(dòng)去取節(jié)點(diǎn),而這種方式就做:聲明式編程。
小結(jié)雙向綁定本質(zhì)上是一種IoC的思想,通過(guò)讓?zhuān)?/p>
頁(yè)面元素聲明自己依賴(lài)的model
JS邏輯不依賴(lài)具體dom
達(dá)到了解耦合的目的。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/85522.html
摘要:模板語(yǔ)法使用了基于的模版語(yǔ)法,允許開(kāi)發(fā)者聲明式地將綁定至底層實(shí)例的數(shù)據(jù)。的核心是一個(gè)允許你采用簡(jiǎn)潔的模板語(yǔ)法來(lái)聲明式的將數(shù)據(jù)渲染進(jìn)的系統(tǒng)。指令用于在表達(dá)式的值改變時(shí),將某些行為應(yīng)用到上。 Vue.js 模板語(yǔ)法 Vue.js 使用了基于 HTML 的模版語(yǔ)法,允許開(kāi)發(fā)者聲明式地將 DOM 綁定至底層 Vue 實(shí)例的數(shù)據(jù)。 Vue.js 的核心是一個(gè)允許你采用簡(jiǎn)潔的模板語(yǔ)法來(lái)聲明式的將數(shù)...
摘要:劃下重點(diǎn),服務(wù)容器是用于管理類(lèi)的依賴(lài)和執(zhí)行依賴(lài)注入的工具。類(lèi)的實(shí)例化及其依賴(lài)的注入,完全由服務(wù)容器自動(dòng)的去完成。 本文首發(fā)于 深入剖析 Laravel 服務(wù)容器,轉(zhuǎn)載請(qǐng)注明出處。喜歡的朋友不要吝嗇你們的贊同,謝謝。 之前在 深度挖掘 Laravel 生命周期 一文中,我們有去探究 Laravel 究竟是如何接收 HTTP 請(qǐng)求,又是如何生成響應(yīng)并最終呈現(xiàn)給用戶(hù)的工作原理。 本章將帶領(lǐng)大...
摘要:控制反轉(zhuǎn)容器控制反轉(zhuǎn)使依賴(lài)注入變得更加便捷。有瑕疵控制反轉(zhuǎn)容器是實(shí)現(xiàn)的控制翻轉(zhuǎn)容器的一種替代方案。容器的獨(dú)立使用即使沒(méi)有使用框架,我們?nèi)匀豢梢栽陧?xiàng)目中使用安裝組件來(lái)使用的控制反轉(zhuǎn)容器。在沒(méi)有給定任何信息的情況下,容器是無(wú)法實(shí)例化相關(guān)依賴(lài)的。 聲明:本文并非博主原創(chuàng),而是來(lái)自對(duì)《Laravel 4 From Apprentice to Artisan》閱讀的翻譯和理解,當(dāng)然也不是原汁原味...
摘要:在模板中放入太多的邏輯會(huì)讓模板過(guò)重且難以維護(hù)。它會(huì)根據(jù)控件類(lèi)型自動(dòng)選取正確的方法來(lái)更新元素。指令需要使用的語(yǔ)法,指的是原數(shù)據(jù)數(shù)組,指的是迭代的數(shù)組元素。 注:本教程所使用的vue版本為 2.5.16 MVC與MVVM MVC(Model-View-Controller): M指的是從后臺(tái)獲取到的數(shù)據(jù), V指的是顯示動(dòng)態(tài)數(shù)據(jù)的html頁(yè)面, C是指響應(yīng)用戶(hù)操作、經(jīng)過(guò)業(yè)務(wù)邏輯處理后去更新...
摘要:方法用來(lái)新增對(duì)象的屬性模版指令不是字符串模版渲染,所以需要用來(lái)渲染菜鳥(niǎo)教程屬性中的值應(yīng)使用指令縮寫(xiě)方式。 最近因?yàn)橐貥?gòu)APP項(xiàng)目,在對(duì)比了react和Vue,加上前期已經(jīng)有了react開(kāi)發(fā)的經(jīng)驗(yàn),還是想嘗試一下VUE,更小更便捷的開(kāi)發(fā)方式。 1.vue 初始化安裝官網(wǎng)提供的NPM方法 $ npm install vue # 全局安裝 vue-cli $ npm install ...
閱讀 821·2023-04-26 00:37
閱讀 706·2021-11-24 09:39
閱讀 2132·2021-11-23 09:51
閱讀 3769·2021-11-22 15:24
閱讀 734·2021-10-19 11:46
閱讀 1868·2019-08-30 13:53
閱讀 2410·2019-08-29 17:28
閱讀 1314·2019-08-29 14:11