日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

一个只有十行的精简MVVM框架(下篇)

發布時間:2025/4/9 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 一个只有十行的精简MVVM框架(下篇) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文來自網易云社區

讓我們來加點互動


前面學生信息的身高的單位都是默認m,如果新增一個需求,要求學生的身高的單位可以在m和cm之間切換呢?


首先需要一個變量來保存度量單位,因此這里必須用一個新的Model:

const?tk?=?{'first-name':?'Jessica','last-name':?'Bre','height':?180,'weight':?70, } const?measurement?=?'cm'


為了讓tk更方便的被其他模塊重用,這里選擇增加一個measurement數據源,而不是直接修改tk。


在視圖部分要增加一個radio單選表單,用來切換身高單位。


const?createList?=?function(kvPairs){const?createListItem?=?function?(label,?content)?{const?li?=?document.createElement('li')const?labelSpan?=?document.createElement('span')labelSpan.textContent?=?labelconst?contentSpan?=?document.createElement('span')contentSpan.textContent?=?contentli.appendChild(labelSpan)li.appendChild(contentSpan)return?li}const?root?=?document.createElement('ul')kvPairs.forEach(function?(x)?{root.appendChild(createListItem(x.key,?x.value))})return?root } const?createToggle?=?function?(options)?{const?createRadio?=?function?(name,?opt){const?radio?=?document.createElement('input')radio.name?=?nameradio.value?=?opt.valueradio.type?=?'radio'radio.textContent?=?opt.valueradio.addEventListener('click',?opt.onclick)radio.checked?=?opt.checkedreturn?radio}const?root?=?document.createElement('form')options.opts.forEach(function?(x)?{root.appendChild(createRadio(options.name,?x))root.appendChild(document.createTextNode(x.value))})return?root } const?createToggleableList?=?function(vm){const?listView?=?createList(vm.kvPairs)const?toggle?=?createToggle(vm.options)const?root?=?document.createElement('div')root.appendChild(toggle)root.appendChild(listView)return?root }


接下來是ViewModel部分,createToggleableList函數需要與之前的createList函數不同的參數。因此,對View-Model結構重構是有必要的:

const?createVm?=?function?(model)?{const?calcHeight?=?function?(measurement,?cms)?{if?(measurement?===?'m'){return?cms?/?100?+?'m'}else{return?cms?+?'cm'}}const?options?=?{name:?'measurement',opts:?[{value:?'cm',checked:?model.measurement?===?'cm',onclick:?()?=>?model.measurement?=?'cm'},{value:?'m',checked:?model.measurement?===?'m',onclick:?()?=>?model.measurement?=?'m'}]}const?kvPairs?=?[{key:?'Name:?',value:?model.student['first-name']?+?'?'?+?model.student['last-name']},{key:?'Height:?',value:?calcHeight(model.measurement,?model.student['height'])},{key:?'Weight:?',value:?model.student['weight']?+?'kg'},{key:?'BMI:?',value:??model.student['weight']?/?(model.student['height']?*?model.student['height']?/?10000)}]return?{kvPairs,?options} }


這里為createToggle添加了ops,并且將ops封裝成了一個對象。根據度量單位,使用不同的方式去計算身高。當任何一個radio被點擊,數據的度量單位將會改變。


看上去很完美,但是當你點擊radio標簽的時候,視圖不會有任何改變。因為這里還沒有為視圖做更新算法。有關MVVM如何處理視圖更新,那是一個比較大的課題,需要另辟一個博文來講,由于本文寫的是一個精簡的MVVM框架,這里就不再贅述,并用最簡單的方式實現視圖更新:

const?smvvm?=?function?(root,?{model,?view,?vm})?{let?m?=?{...model}let?m_old?=?{}setInterval(?function?(){if(!_.isEqual(m,?m_old)){const?rendered?=?view(vm(m))root.innerHTML?=?''root.appendChild(rendered)m_old?=?{...m}}},1000) } smvvm(document.body,?{model:?{student:tk,?measurement},?view:?createToggleableList,?vm:?createVm? })


上述代碼引用了一個外部庫lodash的isEqual方法來比較數據模型是否有更新。此段代碼應用了輪詢,每秒都會檢測數據是否發生變化,有變化了再更新視圖。這是最笨的方法,并且在DOM結構比較復雜時,性能也會受到很大的影響。還是同樣的話,本文的主題是一個精簡的MVVM框架,因此略去了很多細節性的東西,只把主要的東西提煉出來,以達到更好的理解MVVM模式的目的。



MVVM框架的誕生


以上便是一個簡短精簡的MVVM風格的學生信息的示例。至此,一個精簡的MVVM框架其實已經出來了:


/** *?@param?{Node}?root *?@param?{Object}?model *?@param?{Function}?view *?@param?{Function}?vm */ const?smvvm?=?function?(root,?{model,?view,?vm})?{let?m?=?{...model}let?m_old?=?{}setInterval(?function?(){if(!_.isEqual(m,?m_old)){const?rendered?=?view(vm(m))root.innerHTML?=?''root.appendChild(rendered)m_old?=?{...m}}},1000) }

什么?你確定不是在開玩笑?一個只有十行的框架?

請記住: 框架是對如何組織代碼和整個項目如何通用運作的抽象。

這并不意味著你應該有一堆代碼或混亂的類,盡管企業可用的API列表經常都很可怕的長。但是如果你研讀一個框架倉庫的核心文件夾,你可能發現它會出乎意料的小(相比于整個項目來說)。其核心代碼包含主要工作進程,而其他部分只是幫助開發人員以更加舒適的方式構建應用程序的附件。有興趣的同學可以去看看cycle.js,這個框架只有124行(包含注釋和空格)。


總結


此時用一張圖來作為總結再好不過了!


本文來自網易云社區,經作者顧靜授權發布。


了解網易云 :
網易云官網:https://www.163yun.com
網易云社區:https://sq.163yun.com/blog
網易云新用戶大禮包:https://www.163yun.com/gift

更多網易研發、產品、運營經驗分享請訪問網易云社區。



轉載于:https://www.cnblogs.com/163yun/p/9506056.html

總結

以上是生活随笔為你收集整理的一个只有十行的精简MVVM框架(下篇)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 亚洲久久久久久 | 懂色av懂色av粉嫩av分享吧 | 福利一二区 | 成人精品毛片 | 国产91看片 | 131美女爱做视频 | 韩国毛片视频 | 国产亚洲精品女人久久久久久 | 无码成人精品区在线观看 | 99久久久久| 探花av在线 | 天堂av亚洲av国产av电影 | 日韩美女做爰高潮免费 | 色婷婷一区 | 亚洲美免无码中文字幕在线 | 向着小小的花蕾绽放 | 大地资源二中文在线影视观看 | 国产精品无码成人片 | 中文字幕亚洲综合 | 国产视频一二三 | 国产粉嫩白浆 | 国产ts人妖系列高潮 | 国产成人免费网站 | 精品成人国产 | 成人影片在线播放 | 日韩资源站| 久久久久香蕉视频 | 日本边添边摸边做边爱 | 中国女人毛片 | 亚洲夜夜夜 | 色婷婷av一区二区三区gif | 不卡影院av | 51av视频| www.com污| 久久亚洲精品国产精品黑人v | 国产日韩免费视频 | 白丝av| 91麻豆精品国产91久久久无需广告 | 欧美亚洲精品在线 | 久久香蕉影视 | 三级理论电影 | 人妻精品一区一区三区蜜桃91 | 亚洲一区二区色图 | www.夜夜| 日本最黄网站 | 亚洲av成人无码一二三在线观看 | 中文无码av一区二区三区 | 日韩欧美aaa | 午夜寂寞影院在线观看 | 日批视频免费在线观看 | 自拍偷拍第 | 国产精品免费看久久久无码 | 中文字幕人妻一区二区三区 | 在线爱情大片免费观看大全 | 国产中文字幕二区 | 在线午夜视频 | 黄毛片在线观看 | 成年人黄色免费网站 | 欧美一级专区免费大片 | 法国空姐电影在线观看 | 国产伦精品一区二区三区视频免费 | 欧美freesex黑人又粗又大 | 国产首页| 国产8区 | 日本伊人网 | 五月天激情小说 | 婷婷激情图片 | 中文字幕一级片 | 日韩精品一区二区三区中文字幕 | 日日草 | 成人动漫视频在线观看 | 正在播放木下凛凛88av | 91影院在线播放 | 亚洲制服丝袜av | 成年人深夜福利 | 色呦呦一区 | 97xxxxx| 欧美人体视频一区二区三区 | 久久国产人妻一区二区免色戒电影 | 亚洲天堂免费 | 亚洲男人在线 | 国产精品欧美激情 | 美女尻逼视频 | 亚洲第三区 | 欧美精品一区二区免费 | 日本成人精品在线 | 中文字幕综合网 | 视频在线观看网站免费 | 日本三级视频在线播放 | 精精国产xxxx视频在线 | 在线观看视频中文字幕 | 国产女人被狂躁到高潮小说 | www.午夜| 精品日日夜夜 | 一级裸体片 | 天天干 夜夜操 | 美女毛毛片 | 亚洲自拍p | 草莓巧克力香氛动漫的观看方法 |