




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
Vue.js數(shù)據(jù)驅(qū)動(dòng)+組件化的前端界面開發(fā)@尤小右@yyx9908031Vue.js數(shù)據(jù)驅(qū)動(dòng)+組件化的前端界面開發(fā)@尤小右@yyVue.js概況2013年底作為個(gè)人實(shí)驗(yàn)項(xiàng)目開始開發(fā)2014年2月公開發(fā)布2014年11月發(fā)布從頭重寫的0.11截止2015年1月:3100+StarsonGitHub2Vue.js概況2Vue.js不是一個(gè)框架3Vue.js不是一個(gè)框架3路由視圖管理數(shù)據(jù)持久化4路由4路由視圖管理數(shù)據(jù)持久化靈活的接口5路由靈活的接口5簡單示例QuickDemo6簡單示例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在單頁Web應(yīng)用中的問題
重新渲染整個(gè)視圖是昂貴的手動(dòng)更新DOM來保持視圖和數(shù)據(jù)的同步很容易導(dǎo)致bug11DOMDOM在單頁Web應(yīng)用中的問題
11ViewViewModelModel通過MVVM的數(shù)據(jù)綁定實(shí)現(xiàn)自動(dòng)同步12ViewViewModelModel通過MVVM的數(shù)據(jù)綁DOMPOJO(原生JS對象)VueViewViewModelModel通過MVVM的數(shù)據(jù)綁定實(shí)現(xiàn)自動(dòng)同步13DOMPOJOVueViewViewModelModel通過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中注冊組件//擴(kuò)展Vue來自定義一個(gè)可復(fù)用的組件類varMyComponent=Vue.extend({template:
'<p>{{msg}}</p>',paramAttributes:['msg']})//全局注冊該組件Vponent('my-component',MyComponent)21在Vue.js中注冊組件//擴(kuò)展Vue來自定義一個(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通過paramAttributes實(shí)現(xiàn)父子組件之間的數(shù)據(jù)傳遞<my-component
msg="{{msgFromParent}}"></my-component>rootmy-componentmsgFromParentmsg雙向綁定每一個(gè)組件都默認(rèn)有自己的獨(dú)立作用域。23通過paramAttributes<my-componen組件之間也可以通過事件系統(tǒng)進(jìn)行通信$dispatch()24組件之間也可以通過$dispatch()24組件之間也可以通過事件系統(tǒng)進(jìn)行通信$broadcast()25組件之間也可以通過$broadcast()25一些實(shí)現(xiàn)細(xì)節(jié)26一些實(shí)現(xiàn)細(xì)節(jié)26基于ES5Object.defineProperty實(shí)現(xiàn)對POJO(原生JS對象)的觀察和依賴收集ObjectsettergetterProperty收集依賴觸發(fā)更新27基于ES5Object.definePropertyObasettergetterbWatchera.b收集依賴Directivev-text="a.b"DOM{{a.b}}通知更新通知依賴收集機(jī)制的實(shí)現(xiàn)類似Knockout,精確到每一個(gè)屬性,比臟檢測效率得多,性能不受制于watcher的數(shù)量。28asettergetterbWatcher收集依賴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!'
}
}
}
})可以直接替換多層嵌套的對象//直接替換對象
vm.nested={
a:{
b:'yo!'
}
}30varvm=newVue({
data:{
vardata={
msg:'hi'
}
varvm=
new
Vue({
data:data
})可以直接修改原數(shù)據(jù)對象//直接修改原對象
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=對于直接的數(shù)組替換,v-repeat會(huì)進(jìn)行Array-diffing確保盡可能地復(fù)用vm和DOM元素//不會(huì)導(dǎo)致性能問題喲vm.items=vm.items.filter(fn)*即使用含有全新數(shù)據(jù)對象的數(shù)組替換,只要對象有uid也可以通過比較uid來達(dá)成有效復(fù)用。33對于直接的數(shù)組替換,//不會(huì)導(dǎo)致性能問題喲*即使用含有全//如果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的局限:不能偵測對象屬性的添加/刪除34//如果data上不存在prop屬性,ES5的局優(yōu)勢和使用場景35優(yōu)勢和使用場景35侵入性低不對整體架構(gòu)做過多約束,方便與其他庫或是已有的前端技術(shù)棧整合。36侵入性低不對整體架構(gòu)做過多約束,方便與其他庫或是已有的前端技數(shù)據(jù)持久層DataPersistenceLayer服務(wù)器端數(shù)據(jù)庫DatabaseViewViewModelModel以POJO作為Model使得Vue對于數(shù)據(jù)持久層的接口非常靈活Vue+BackboneModelVue+FirebaseVue+Meteor37數(shù)據(jù)持久層服務(wù)器端ViewViewModel以POJO作鼓勵(lì)模塊化基于組件的開發(fā)模式有利于將界面代碼自然分割成更容易維護(hù)的模塊38鼓勵(lì)模塊化基于組件的開發(fā)模式有利于將界面代碼38基于CommonJS的單文件組件:Vueify通過Browserify或者Webpack這樣的模塊構(gòu)建工具,將一個(gè)組件的模板、CSS和JS都寫在同一個(gè)文件里。/vuejs/vueify39基于CommonJS的單文件組件:Vueify通過Br輕量+高性能~18kbmin+gzip,無外部依賴不依賴臟檢測的高效數(shù)據(jù)綁定40輕量+高性能~18kbmin+gzip,無外部依賴40Thanks@尤小右@yyx99080341Thanks@尤小右@4Vue.js數(shù)據(jù)驅(qū)動(dòng)+組件化的前端界面開發(fā)@尤小右@yyx99080342Vue.js數(shù)據(jù)驅(qū)動(dòng)+組件化的前端界面開發(fā)@尤小右@yyVue.js概況2013年底作為個(gè)人實(shí)驗(yàn)項(xiàng)目開始開發(fā)2014年2月公開發(fā)布2014年11月發(fā)布從頭重寫的0.11截止2015年1月:3100+StarsonGitHub43Vue.js概況2Vue.js不是一個(gè)框架44Vue.js不是一個(gè)框架3路由視圖管理數(shù)據(jù)持久化45路由4路由視圖管理數(shù)據(jù)持久化靈活的接口46路由靈活的接口5簡單示例QuickDemo47簡單示例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在單頁Web應(yīng)用中的問題
重新渲染整個(gè)視圖是昂貴的手動(dòng)更新DOM來保持視圖和數(shù)據(jù)的同步很容易導(dǎo)致bug52DOMDOM在單頁Web應(yīng)用中的問題
11ViewViewModelModel通過MVVM的數(shù)據(jù)綁定實(shí)現(xiàn)自動(dòng)同步53ViewViewModelModel通過MVVM的數(shù)據(jù)綁DOMPOJO(原生JS對象)VueViewViewModelModel通過MVVM的數(shù)據(jù)綁定實(shí)現(xiàn)自動(dòng)同步54DOMPOJOVueViewViewModelModel通過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中注冊組件//擴(kuò)展Vue來自定義一個(gè)可復(fù)用的組件類varMyComponent=Vue.extend({template:
'<p>{{msg}}</p>',paramAttributes:['msg']})//全局注冊該組件Vponent('my-component',MyComponent)62在Vue.js中注冊組件//擴(kuò)展Vue來自定義一個(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通過paramAttributes實(shí)現(xiàn)父子組件之間的數(shù)據(jù)傳遞<my-component
msg="{{msgFromParent}}"></my-component>rootmy-componentmsgFromParentmsg雙向綁定每一個(gè)組件都默認(rèn)有自己的獨(dú)立作用域。64通過paramAttributes<my-componen組件之間也可以通過事件系統(tǒng)進(jìn)行通信$dispatch()65組件之間也可以通過$dispatch()24組件之間也可以通過事件系統(tǒng)進(jìn)行通信$broadcast()66組件之間也可以通過$broadcast()25一些實(shí)現(xiàn)細(xì)節(jié)67一些實(shí)現(xiàn)細(xì)節(jié)26基于ES5Object.defineProperty實(shí)現(xiàn)對POJO(原生JS對象)的觀察和依賴收集ObjectsettergetterProperty收集依賴觸發(fā)更新68基于ES5Object.definePropertyObasettergetterbWatchera.b收集依賴Directivev-text="a.b"DOM{{a.b}}通知更新通知依賴收集機(jī)制的實(shí)現(xiàn)類似Knockout,精確到每一個(gè)屬性,比臟檢測效率得多,性能不受制于watcher的數(shù)量。69asettergetterbWatcher收集依賴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!'
}
}
}
})可以直接替換多層嵌套的對象//直接替換對象
vm.nested={
a:{
b:'yo!'
}
}71varvm=newVue({
data:{
vardata={
msg:'hi'
}
varvm=
new
Vue({
data:data
})可以直接修改原數(shù)據(jù)對象//直接修改原對象
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=對于直接的數(shù)組替換,v-repeat會(huì)進(jìn)行Array-diffing確保盡可能地復(fù)用vm和DOM元素//不會(huì)導(dǎo)致性能問題喲vm.items=vm.items.filter(fn)*即使用含有全新數(shù)據(jù)對象的數(shù)組替換,只要對象有uid也可以通過比較uid來達(dá)成有效復(fù)用。74對于直接的數(shù)組替換,//不會(huì)導(dǎo)致性能問題喲*即使用含有全//如
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 玻璃材料的生物相容性考核試卷
- 核電工程現(xiàn)場施工安全防護(hù)設(shè)備使用考核試卷
- 木材加工企業(yè)的客戶關(guān)系管理系統(tǒng)考核試卷
- 批發(fā)行業(yè)互聯(lián)網(wǎng)轉(zhuǎn)型之路考核試卷
- 康復(fù)輔具在康復(fù)醫(yī)學(xué)研究方法的革新考核試卷
- 煤炭行業(yè)投資風(fēng)險(xiǎn)評價(jià)考核試卷
- 文化用化學(xué)品在聲音記錄材料的技術(shù)發(fā)展考核試卷
- 醫(yī)療數(shù)據(jù)要素市場交易權(quán)限管理
- 美國發(fā)動(dòng)“對等關(guān)稅戰(zhàn)”的影響
- 車輛維修質(zhì)量保證措施
- 鋁材切割機(jī)操作規(guī)程
- 浙江大學(xué)《普通化學(xué)》(第6版)筆記和課后習(xí)題(含考研真題)詳解
- 電磁學(xué)知到章節(jié)答案智慧樹2023年天津大學(xué)
- EIM Book 1 Unit 10 Don't give up單元知識(shí)要點(diǎn)
- 《塑造打勝仗的團(tuán)隊(duì)系列 8冊 》讀書筆記思維導(dǎo)圖
- 新鄉(xiāng)縣恒新熱力有限公司集中供熱項(xiàng)目二期工程變更項(xiàng)目環(huán)境影響報(bào)告
- A3報(bào)告解析課件
- “越……越……”“越來越……”課件
- 小學(xué)生必背古詩75首+80首(精排+目錄)
- 馬工程《刑法學(xué)(下冊)》教學(xué)課件 第16章 刑法各論概述
評論
0/150
提交評論