成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

前端開發(fā)思維轉(zhuǎn)變——從事件驅(qū)動到數(shù)據(jù)驅(qū)動

learning / 1034人閱讀

摘要:趁熱打鐵,梳理下這段時間學習和使用以后,給自己最大的收獲開發(fā)思維轉(zhuǎn)變。事件驅(qū)動先說說以前前端發(fā)開的思維方式。分開設計頁面結(jié)構(gòu)和數(shù)據(jù)結(jié)構(gòu),然后將與數(shù)據(jù)結(jié)構(gòu)做關聯(lián),之后所有的事件觸發(fā)的都只是數(shù)據(jù)的變化,會自動根據(jù)數(shù)據(jù)的變化做相應改變。

加班加點連續(xù)一個多月,總算是快把一個開始時心里完全沒有底的項目收工了。新項目基于舊系統(tǒng)開發(fā),在保留原有老架構(gòu)jade + knockout + jquery + gulp的同時,新頁面完全采用vue + vue-route + vuex + webpack。兩套框架都沒正兒八經(jīng)做過,jade和knockout第一次接觸,vue和webpack以前只是寫寫demo,vue-route和vuex也沒用過,又恰巧另外一個前端同事離職,所以當時決定新頁面完全用新框架的時候,還是鼓了不少勇氣的。

趁熱打鐵,梳理下這段時間學習和使用vue以后,給自己最大的收獲:開發(fā)思維轉(zhuǎn)變。

事件驅(qū)動

先說說以前前端發(fā)開的思維方式。
比如說,要實現(xiàn)ajax方式提交一個表單,那么就要監(jiān)聽一個提交按鈕的事件。在觸發(fā)點擊事件后,從頁面的DOM元素中一個個收集數(shù)據(jù),然后在做數(shù)據(jù)處理,最后調(diào)用接口提交。收集數(shù)據(jù)是個特別繁瑣的事情,各種選擇器各種變量。

再比如說,在固定區(qū)域內(nèi),事件觸發(fā)展示不同組件,那就要監(jiān)聽事件傳遞來的條件,來判斷哪個組件要display:block,其他組件要display:none,甚至可能大量用到DOM操作,各種appendChild,insertBefore,removeChild。

其他類似根據(jù)條件addClass, removeClass調(diào)整組件樣式;通過getAttribute、dataset等等獲取DOM綁定的數(shù)據(jù);通過setAttribute、innerHtml等等直接修改DOM的操作也是數(shù)不勝數(shù)。

個人感覺這種方式的好處就是直觀,頁面做任何改變?nèi)挥蒵s處理,先干什么后干什么都由自己一手代碼操控全場,有種掌控一切的感覺。

但是,大型項目里,代碼編寫的成本和維護的成本都很高。對代碼規(guī)范的要求高,對抽象的要求高,尤其是抽象程度,全賴個人編程水平,抽象程度低的話,冗長的代碼根本不想多看一眼。這大概就是為啥項目里有一個代碼寫的爛的人在,代碼就會越來越爛的原因。

數(shù)據(jù)驅(qū)動

網(wǎng)上已經(jīng)很多關于數(shù)據(jù)驅(qū)動的文章了,但光看文章,體會遠不如自己實踐一遍來的印象深刻。在基于vue開發(fā)的新頁面中,用js直接處理DOM的代碼極少(剛開始上手的時候一般都會不太習慣數(shù)據(jù)驅(qū)動編程,寫些操作DOM的代碼,后來慢慢會替換掉的)。

數(shù)據(jù)驅(qū)動的前提是事先將DOM與數(shù)據(jù)綁定,像vue這種就是依賴defineProperties, setter, getter將一個vue對象與一個DOM節(jié)點模板關聯(lián)起來,這個DOM節(jié)點里所有子節(jié)點、所有節(jié)點屬性,全都可以和vue對象中的data綁定,做到data中某個屬性值變化時,相應DOM節(jié)點中對應的某個屬性就變化。

如此一來,關注點完全分離。分開設計頁面DOM結(jié)構(gòu)和數(shù)據(jù)結(jié)構(gòu),然后將DOM與數(shù)據(jù)結(jié)構(gòu)做關聯(lián),之后所有的事件觸發(fā)的都只是數(shù)據(jù)的變化,DOM會自動根據(jù)數(shù)據(jù)的變化做相應改變。

前面例子中的表單提交,交由v-model屬性將input雙向綁定到data中去,在觸發(fā)表單提交時,直接把data傳給后端完事兒了;不同組件之間的切換,vue官網(wǎng)就有個動態(tài)組件的例子:

var vm = new Vue({
  el: "#example",
  data: {
    currentView: "home"
  },
  components: {
    home,
    posts,
    archive
  }
})


  

只需關心currentView的指向便可輕易切換組件,或者通過v-if或v-show來實現(xiàn)根據(jù)value的真假值來控制相應DOM節(jié)點是否顯示;其他DOM屬性變化都可以用v-bind與data做綁定,比如v-bind:class="dataClass",只要dataClass一變化,DOM的class就會改變。

vue的這些動態(tài)綁定的功能很容易上手,相對上手比較慢的是vue提供的組件功能,涉及父子組件通訊,以及用vuex實現(xiàn)全局state管理等等,先掌握數(shù)據(jù)驅(qū)動的思想,再接觸這些會容易得多。

當然即使vue也會遇到不得不直接操作DOM的情況。記錄一個目前遇到實際問題:

有一個table組件,展示從后臺傳過來的數(shù)據(jù)。數(shù)據(jù)中會有"http://xxx.xxx/xxx.png"需要渲染成標簽。一般表格組件會提供formatter方法來處理單元格特殊處理邏輯,這里我就不得不直接生成DOM節(jié)點

formatter: function({picUrl}){
    this.$createElement("img", {
        attrs: {
            src: picUrl
        },
    }
}

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/84047.html

相關文章

  • js學習之異步處理

    摘要:學習開發(fā),無論是前端開發(fā)還是都避免不了要接觸異步編程這個問題就和其它大多數(shù)以多線程同步為主的編程語言不同的主要設計是單線程異步模型。由于異步編程可以實現(xiàn)非阻塞的調(diào)用效果,引入異步編程自然就是順理成章的事情了。 學習js開發(fā),無論是前端開發(fā)還是node.js,都避免不了要接觸異步編程這個問題,就和其它大多數(shù)以多線程同步為主的編程語言不同,js的主要設計是單線程異步模型。正因為js天生的與...

    VioletJack 評論0 收藏0
  • 重磅:前端 MVVM 與 FRP 的升階實踐 —— ReRest 可視化編程

    摘要:是前端開發(fā)領域新興的方法論體系,它繼承了與編程理念,在技術上有不少創(chuàng)新。但專利與開源協(xié)議是平行的兩個世界,改底層也不大容易解決問題。此外,要求在中結(jié)合各屬性的是否變化,判斷是否該觸發(fā)更新。 ReRest (Reactive Resource State Transfer) 是前端開發(fā)領域新興的方法論體系,它繼承了 MVVM 與 FRP 編程理念,在技術上有不少創(chuàng)新。本文從專利稿修改而來...

    Cciradih 評論0 收藏0
  • 不談業(yè)務運維的IT主管早晚被淘汰 這里是10條干貨

    摘要:由此可見,一旦從傳統(tǒng)的技術運維上升到業(yè)務運維,發(fā)揮的作用出乎意料,而這正是的未來所在。這不是由廠商驅(qū)動的,而是業(yè)內(nèi)趨勢有關。業(yè)務運維關注的是業(yè)務,是從用戶的視角出發(fā),關注點不同。業(yè)務運維有三個方面。業(yè)務運維已經(jīng)進入應用階段。 大數(shù)網(wǎng) 吳玉征 先說個真實的故事。 前...

    Kahn 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<