




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
Vue.js數(shù)據(jù)驅(qū)動(dòng)+組件化的前端界面開(kāi)發(fā)@尤小右@yyx9908031Vue.js數(shù)據(jù)驅(qū)動(dòng)+組件化的前端界面開(kāi)發(fā)@尤小右@yyVue.js概況2013年底作為個(gè)人實(shí)驗(yàn)項(xiàng)目開(kāi)始開(kāi)發(fā)2014年2月公開(kāi)發(fā)布2014年11月發(fā)布從頭重寫(xiě)的0.11截止2015年1月:3100+StarsonGitHub2Vue.js概況2Vue.js不是一個(gè)框架3Vue.js不是一個(gè)框架3路由視圖管理數(shù)據(jù)持久化4路由4路由視圖管理數(shù)據(jù)持久化靈活的接口5路由靈活的接口5簡(jiǎn)單示例QuickDemo6簡(jiǎn)單示例6核心思想:數(shù)據(jù)驅(qū)動(dòng)組件化7核心思想:7數(shù)據(jù)驅(qū)動(dòng)Data-Driven8數(shù)據(jù)驅(qū)動(dòng)8視圖View用戶行為UserInput數(shù)據(jù)模型Model渲染Render9視圖用戶行為數(shù)據(jù)模型渲染9視圖View用戶行為UserInput數(shù)據(jù)模型Model渲染Render視圖只是數(shù)據(jù)的映射“真相只有一個(gè)”10視圖用戶行為數(shù)據(jù)模型渲染視圖只是數(shù)據(jù)的映射“真相只有一個(gè)”1DOMDOM在單頁(yè)Web應(yīng)用中的問(wèn)題
重新渲染整個(gè)視圖是昂貴的手動(dòng)更新DOM來(lái)保持視圖和數(shù)據(jù)的同步很容易導(dǎo)致bug11DOMDOM在單頁(yè)Web應(yīng)用中的問(wèn)題
11ViewViewModelModel通過(guò)MVVM的數(shù)據(jù)綁定實(shí)現(xiàn)自動(dòng)同步12ViewViewModelModel通過(guò)MVVM的數(shù)據(jù)綁DOMPOJO(原生JS對(duì)象)VueViewViewModelModel通過(guò)MVVM的數(shù)據(jù)綁定實(shí)現(xiàn)自動(dòng)同步13DOMPOJOVueViewViewModelModel通過(guò)varvm=
new
Vue({
el:'#demo',
data:{
msg:'HelloVue.js!'
}
})<div
id="demo">
<h1>{{msg}}</h1>
</div>JavaScriptHTML14varvm=newVue({
el:'#demvarvm=
new
Vue({
el:'#demo',
data:{
msg:'HelloVue.js!'
}
})<div
id="demo">
<h1>{{msg}}</h1>
</div>JavaScript指令Directive(插值其實(shí)被編譯為v-text指令)ViewModelModelViewHTML15varvm=newVue({
el:'#demViewModelDOMListenersDirectivesViewModel應(yīng)用邏輯全部是數(shù)據(jù)操作DOM操作封裝在指令中16ViewModelDOMListenersDirectiv組件化Component-Oriented17組件化17每一個(gè)應(yīng)用界面都可以看作是組件構(gòu)成的NavContentItemSidebarSideItem18每一個(gè)應(yīng)用界面都可以NavContentItemSideba每一個(gè)組件都可以看做是一個(gè)ViewModelNavContentItemSidebar19每一個(gè)組件都可以看做是一個(gè)NavContentItemSid所以可以把界面抽象為ViewModelTree20所以可以把界面抽象為20在Vue.js中注冊(cè)組件//擴(kuò)展Vue來(lái)自定義一個(gè)可復(fù)用的組件類(lèi)varMyComponent=Vue.extend({template:
'<p>{{msg}}</p>',paramAttributes:['msg']})//全局注冊(cè)該組件Vponent('my-component',MyComponent)21在Vue.js中注冊(cè)組件//擴(kuò)展Vue來(lái)自定義一個(gè)在Vue.js模板中使用組件<my-component
msg="Hello!"></my-component>my-component組件的模板將會(huì)被填充到該元素中,而msg則會(huì)被作為數(shù)據(jù)傳入該組件實(shí)例。渲染結(jié)果如下。<my-component><p>Hello!</p>
</my-component>22在Vue.js模板中使用組件<my-component通過(guò)paramAttributes實(shí)現(xiàn)父子組件之間的數(shù)據(jù)傳遞<my-component
msg="{{msgFromParent}}"></my-component>rootmy-componentmsgFromParentmsg雙向綁定每一個(gè)組件都默認(rèn)有自己的獨(dú)立作用域。23通過(guò)paramAttributes<my-componen組件之間也可以通過(guò)事件系統(tǒng)進(jìn)行通信$dispatch()24組件之間也可以通過(guò)$dispatch()24組件之間也可以通過(guò)事件系統(tǒng)進(jìn)行通信$broadcast()25組件之間也可以通過(guò)$broadcast()25一些實(shí)現(xiàn)細(xì)節(jié)26一些實(shí)現(xiàn)細(xì)節(jié)26基于ES5Object.defineProperty實(shí)現(xiàn)對(duì)POJO(原生JS對(duì)象)的觀察和依賴(lài)收集ObjectsettergetterProperty收集依賴(lài)觸發(fā)更新27基于ES5Object.definePropertyObasettergetterbWatchera.b收集依賴(lài)Directivev-text="a.b"DOM{{a.b}}通知更新通知依賴(lài)收集機(jī)制的實(shí)現(xiàn)類(lèi)似Knockout,精確到每一個(gè)屬性,比臟檢測(cè)效率得多,性能不受制于watcher的數(shù)量。28asettergetterbWatcher收集依賴(lài)Direcvm.msg=
'one'
vm.msg=
'two'
vm.msg=
'three'
//只會(huì)觸發(fā)一次DOM更新異步批量更新29vm.msg='one'
vm.msg='two'
varvm=
new
Vue({
data:{
nested:{
a:{
b:'hi!'
}
}
}
})可以直接替換多層嵌套的對(duì)象//直接替換對(duì)象
vm.nested={
a:{
b:'yo!'
}
}30varvm=newVue({
data:{
vardata={
msg:'hi'
}
varvm=
new
Vue({
data:data
})可以直接修改原數(shù)據(jù)對(duì)象//直接修改原對(duì)象
data.msg=
'changed'
//DOM會(huì)在下一幀更新31vardata={
msg:'hi'
}可以直接varitems=[a,b,c]
varvm=
new
Vue({
data:{
items:items
}
})
//下一幀會(huì)觸發(fā)更新
items.reverse()數(shù)組的mutating方法會(huì)觸發(fā)更新32varitems=[a,b,c]
varvm=對(duì)于直接的數(shù)組替換,v-repeat會(huì)進(jìn)行Array-diffing確保盡可能地復(fù)用vm和DOM元素//不會(huì)導(dǎo)致性能問(wèn)題喲vm.items=vm.items.filter(fn)*即使用含有全新數(shù)據(jù)對(duì)象的數(shù)組替換,只要對(duì)象有uid也可以通過(guò)比較uid來(lái)達(dá)成有效復(fù)用。33對(duì)于直接的數(shù)組替換,//不會(huì)導(dǎo)致性能問(wèn)題喲*即使用含有全//如果data上不存在prop屬性,//則必須要用$set或$add才會(huì)觸發(fā)更新data.$set('prop',value)
data.$add('prop',value)//刪除屬性要用$delete
data.$delete('prop')
//數(shù)組不能用arr[0]=value,要用$set
arr.$set(0,value)ES5的局限:不能偵測(cè)對(duì)象屬性的添加/刪除34//如果data上不存在prop屬性,ES5的局優(yōu)勢(shì)和使用場(chǎng)景35優(yōu)勢(shì)和使用場(chǎng)景35侵入性低不對(duì)整體架構(gòu)做過(guò)多約束,方便與其他庫(kù)或是已有的前端技術(shù)棧整合。36侵入性低不對(duì)整體架構(gòu)做過(guò)多約束,方便與其他庫(kù)或是已有的前端技數(shù)據(jù)持久層DataPersistenceLayer服務(wù)器端數(shù)據(jù)庫(kù)DatabaseViewViewModelModel以POJO作為Model使得Vue對(duì)于數(shù)據(jù)持久層的接口非常靈活Vue+BackboneModelVue+FirebaseVue+Meteor37數(shù)據(jù)持久層服務(wù)器端ViewViewModel以POJO作鼓勵(lì)模塊化基于組件的開(kāi)發(fā)模式有利于將界面代碼自然分割成更容易維護(hù)的模塊38鼓勵(lì)模塊化基于組件的開(kāi)發(fā)模式有利于將界面代碼38基于CommonJS的單文件組件:Vueify通過(guò)Browserify或者Webpack這樣的模塊構(gòu)建工具,將一個(gè)組件的模板、CSS和JS都寫(xiě)在同一個(gè)文件里。/vuejs/vueify39基于CommonJS的單文件組件:Vueify通過(guò)Br輕量+高性能~18kbmin+gzip,無(wú)外部依賴(lài)不依賴(lài)臟檢測(cè)的高效數(shù)據(jù)綁定40輕量+高性能~18kbmin+gzip,無(wú)外部依賴(lài)40Thanks@尤小右@yyx99080341Thanks@尤小右@4Vue.js數(shù)據(jù)驅(qū)動(dòng)+組件化的前端界面開(kāi)發(fā)@尤小右@yyx99080342Vue.js數(shù)據(jù)驅(qū)動(dòng)+組件化的前端界面開(kāi)發(fā)@尤小右@yyVue.js概況2013年底作為個(gè)人實(shí)驗(yàn)項(xiàng)目開(kāi)始開(kāi)發(fā)2014年2月公開(kāi)發(fā)布2014年11月發(fā)布從頭重寫(xiě)的0.11截止2015年1月:3100+StarsonGitHub43Vue.js概況2Vue.js不是一個(gè)框架44Vue.js不是一個(gè)框架3路由視圖管理數(shù)據(jù)持久化45路由4路由視圖管理數(shù)據(jù)持久化靈活的接口46路由靈活的接口5簡(jiǎn)單示例QuickDemo47簡(jiǎn)單示例6核心思想:數(shù)據(jù)驅(qū)動(dòng)組件化48核心思想:7數(shù)據(jù)驅(qū)動(dòng)Data-Driven49數(shù)據(jù)驅(qū)動(dòng)8視圖View用戶行為UserInput數(shù)據(jù)模型Model渲染Render50視圖用戶行為數(shù)據(jù)模型渲染9視圖View用戶行為UserInput數(shù)據(jù)模型Model渲染Render視圖只是數(shù)據(jù)的映射“真相只有一個(gè)”51視圖用戶行為數(shù)據(jù)模型渲染視圖只是數(shù)據(jù)的映射“真相只有一個(gè)”1DOMDOM在單頁(yè)Web應(yīng)用中的問(wèn)題
重新渲染整個(gè)視圖是昂貴的手動(dòng)更新DOM來(lái)保持視圖和數(shù)據(jù)的同步很容易導(dǎo)致bug52DOMDOM在單頁(yè)Web應(yīng)用中的問(wèn)題
11ViewViewModelModel通過(guò)MVVM的數(shù)據(jù)綁定實(shí)現(xiàn)自動(dòng)同步53ViewViewModelModel通過(guò)MVVM的數(shù)據(jù)綁DOMPOJO(原生JS對(duì)象)VueViewViewModelModel通過(guò)MVVM的數(shù)據(jù)綁定實(shí)現(xiàn)自動(dòng)同步54DOMPOJOVueViewViewModelModel通過(guò)varvm=
new
Vue({
el:'#demo',
data:{
msg:'HelloVue.js!'
}
})<div
id="demo">
<h1>{{msg}}</h1>
</div>JavaScriptHTML55varvm=newVue({
el:'#demvarvm=
new
Vue({
el:'#demo',
data:{
msg:'HelloVue.js!'
}
})<div
id="demo">
<h1>{{msg}}</h1>
</div>JavaScript指令Directive(插值其實(shí)被編譯為v-text指令)ViewModelModelViewHTML56varvm=newVue({
el:'#demViewModelDOMListenersDirectivesViewModel應(yīng)用邏輯全部是數(shù)據(jù)操作DOM操作封裝在指令中57ViewModelDOMListenersDirectiv組件化Component-Oriented58組件化17每一個(gè)應(yīng)用界面都可以看作是組件構(gòu)成的NavContentItemSidebarSideItem59每一個(gè)應(yīng)用界面都可以NavContentItemSideba每一個(gè)組件都可以看做是一個(gè)ViewModelNavContentItemSidebar60每一個(gè)組件都可以看做是一個(gè)NavContentItemSid所以可以把界面抽象為ViewModelTree61所以可以把界面抽象為20在Vue.js中注冊(cè)組件//擴(kuò)展Vue來(lái)自定義一個(gè)可復(fù)用的組件類(lèi)varMyComponent=Vue.extend({template:
'<p>{{msg}}</p>',paramAttributes:['msg']})//全局注冊(cè)該組件Vponent('my-component',MyComponent)62在Vue.js中注冊(cè)組件//擴(kuò)展Vue來(lái)自定義一個(gè)在Vue.js模板中使用組件<my-component
msg="Hello!"></my-component>my-component組件的模板將會(huì)被填充到該元素中,而msg則會(huì)被作為數(shù)據(jù)傳入該組件實(shí)例。渲染結(jié)果如下。<my-component><p>Hello!</p>
</my-component>63在Vue.js模板中使用組件<my-component通過(guò)paramAttributes實(shí)現(xiàn)父子組件之間的數(shù)據(jù)傳遞<my-component
msg="{{msgFromParent}}"></my-component>rootmy-componentmsgFromParentmsg雙向綁定每一個(gè)組件都默認(rèn)有自己的獨(dú)立作用域。64通過(guò)paramAttributes<my-componen組件之間也可以通過(guò)事件系統(tǒng)進(jìn)行通信$dispatch()65組件之間也可以通過(guò)$dispatch()24組件之間也可以通過(guò)事件系統(tǒng)進(jìn)行通信$broadcast()66組件之間也可以通過(guò)$broadcast()25一些實(shí)現(xiàn)細(xì)節(jié)67一些實(shí)現(xiàn)細(xì)節(jié)26基于ES5Object.defineProperty實(shí)現(xiàn)對(duì)POJO(原生JS對(duì)象)的觀察和依賴(lài)收集ObjectsettergetterProperty收集依賴(lài)觸發(fā)更新68基于ES5Object.definePropertyObasettergetterbWatchera.b收集依賴(lài)Directivev-text="a.b"DOM{{a.b}}通知更新通知依賴(lài)收集機(jī)制的實(shí)現(xiàn)類(lèi)似Knockout,精確到每一個(gè)屬性,比臟檢測(cè)效率得多,性能不受制于watcher的數(shù)量。69asettergetterbWatcher收集依賴(lài)Direcvm.msg=
'one'
vm.msg=
'two'
vm.msg=
'three'
//只會(huì)觸發(fā)一次DOM更新異步批量更新70vm.msg='one'
vm.msg='two'
varvm=
new
Vue({
data:{
nested:{
a:{
b:'hi!'
}
}
}
})可以直接替換多層嵌套的對(duì)象//直接替換對(duì)象
vm.nested={
a:{
b:'yo!'
}
}71varvm=newVue({
data:{
vardata={
msg:'hi'
}
varvm=
new
Vue({
data:data
})可以直接修改原數(shù)據(jù)對(duì)象//直接修改原對(duì)象
data.msg=
'changed'
//DOM會(huì)在下一幀更新72vardata={
msg:'hi'
}可以直接varitems=[a,b,c]
varvm=
new
Vue({
data:{
items:items
}
})
//下一幀會(huì)觸發(fā)更新
items.reverse()數(shù)組的mutating方法會(huì)觸發(fā)更新73varitems=[a,b,c]
varvm=對(duì)于直接的數(shù)組替換,v-repeat會(huì)進(jìn)行Array-diffing確保盡可能地復(fù)用vm和DOM元素//不會(huì)導(dǎo)致性能問(wèn)題喲vm.items=vm.items.filter(fn)*即使用含有全新數(shù)據(jù)對(duì)象的數(shù)組替換,只要對(duì)象有uid也可以通過(guò)比較uid來(lái)達(dá)成有效復(fù)用。74對(duì)于直接的數(shù)組替換,//不會(huì)導(dǎo)致性能問(wèn)題喲*即使用含有全//如
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 【正版授權(quán)】 IEC TR 61850-7-6:2024 EN Communication networks and systems for power utility automation - Part 7-6: Guideline for definition of Basic Application Profiles (BAPs) using IEC
- 2025-2030年中國(guó)鍍鋅層鈍化劑行業(yè)發(fā)展趨勢(shì)及投資戰(zhàn)略研究報(bào)告
- 2025-2030年中國(guó)鉛酸蓄電池行業(yè)市場(chǎng)現(xiàn)狀分析規(guī)劃研究報(bào)告
- 2025-2030年中國(guó)針織服裝市場(chǎng)市場(chǎng)運(yùn)行動(dòng)態(tài)及投資戰(zhàn)略研究報(bào)告
- 2025-2030年中國(guó)酮洛芬腸溶膠囊行業(yè)十三五規(guī)劃與發(fā)展趨勢(shì)分析報(bào)告
- 2025-2030年中國(guó)艾灸養(yǎng)生儀產(chǎn)業(yè)發(fā)展現(xiàn)狀及前景趨勢(shì)分析報(bào)告
- 2025-2030年中國(guó)美甲行業(yè)運(yùn)行現(xiàn)狀及發(fā)展前景分析報(bào)告
- 2025年四川省建筑安全員C證考試(專(zhuān)職安全員)題庫(kù)及答案
- 皖北衛(wèi)生職業(yè)學(xué)院《時(shí)間序列分析》2023-2024學(xué)年第二學(xué)期期末試卷
- 中央財(cái)經(jīng)大學(xué)《商務(wù)智能》2023-2024學(xué)年第二學(xué)期期末試卷
- 幼兒看圖填數(shù)
- 酒店項(xiàng)目精裝修工程施工組織設(shè)計(jì)
- 小學(xué)生研學(xué)旅行展示ppt模板
- 《思想道德與法治》第一章
- 新概念英語(yǔ)第2冊(cè)課文word版
- 大學(xué)生職業(yè)生涯規(guī)劃(高職)PPT完整全套教學(xué)課件
- 微信小程序開(kāi)發(fā)實(shí)戰(zhàn)(第2版)全套PPT完整教學(xué)課件
- 部編版語(yǔ)文四年級(jí)下冊(cè)全冊(cè)大單元整體作業(yè)設(shè)計(jì)
- 重慶自然博物館
- 收養(yǎng)人撫養(yǎng)教育被收養(yǎng)人能力的證明
- 施工升降機(jī)的安裝步驟
評(píng)論
0/150
提交評(píng)論