日韩性视频-久久久蜜桃-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框架(下篇)的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 久久亚洲欧美 | 涩涩网站免费 | 男人天堂中文字幕 | 亚洲天堂视频在线播放 | 性欧美熟妇videofreesex | 天堂久久久久 | 亚洲视频在线播放免费 | а√在线中文网新版地址在线 | 欧美一级一区二区三区 | 欧美福利视频导航 | 中文字幕亚洲视频 | 亚洲精品无 | 亚欧在线观看 | caoporn超碰97| 日韩三级一区 | 国产三级91 | 久久天天躁狠狠躁夜夜躁 | 日本不卡网站 | 天堂在线8 | 亚洲美女视频在线观看 | 人妻换人妻a片爽麻豆 | 亚洲热在线观看 | 精品一区二区久久久 | 国产一级二级三级 | 在线免费观看视频你懂的 | 精品国产乱码久久久久久免费 | 在线视频欧美一区 | 国产美女www爽爽爽 www.国产毛片 | 国产crm系统91在线 | 无码人妻精品一区二区三区99不卡 | 琪琪午夜伦理 | 六月丁香啪啪 | 1级片在线观看 | 免费看国产黄色片 | 7x7x7x人成影视| 国产无玛 | 国产精品99视频 | 欧美日韩黄色一级片 | 亚洲久久一区 | av无码久久久久久不卡网站 | 亚洲色中色 | 99久久免费看精品国产一区 | 久久av资源| 性色在线视频 | 97久久人人| 一级黄色片毛片 | 日本熟妇一区二区三区 | 丰腴饱满的极品熟妇 | 少妇久久久久久被弄高潮 | 欧美一卡二卡三卡四卡 | 逼特逼视频在线观看 | freesex性hd公交车上 | 无码人妻精品一区二 | 亚洲精品lv | 亚洲老老头同性老头交j | 欧美激情性生活 | 欧美熟妇7777一区二区 | 美女啪啪无遮挡 | 中文字幕av高清 | 午夜一级影院 | 中文字幕av观看 | 欧美va在线观看 | 国产露脸91国语对白 | 草草影院在线 | 五月综合在线 | 黄瓜视频色版 | 免费日韩| 善良的女邻居在线观看 | 国产精品高潮呻吟久久av野狼 | 天天综合影院 | 久免费一级suv好看的国产 | 兔费看少妇性l交大片免费 日韩高清不卡 | 色欧美88888久久久久久影院 | 国产熟女一区二区三区四区 | 最新免费av网站 | 在线观看涩涩 | 国产精品jizz在线观看无码 | 欧美一区二区高清 | 顶级嫩模啪啪呻吟不断好爽 | 国产天堂资源 | 成人www视频 | 依人综合网 | 波多野一区二区 | 神马午夜嘿嘿 | 黄色片网站免费在线观看 | 日韩一区二区在线观看视频 | 奇米在线777 | 99在线成人精品视频 | 美女色诱男人激情视频 | 精品无码久久久久久国产 | 日韩操操 | 色呦呦一区二区三区 | 一本一道波多野结衣一区二区 | 欧美亚洲第一页 | 日韩中文字幕综合 | 96精品在线| 成人看片在线观看 | 免费在线h| 精品无码人妻一区二区三 |