摘要:對于一個每秒幀的狀態(tài)改變,清楚的知道那些節(jié)點(diǎn)被影響,更新它們,而避免那些不受影響節(jié)點(diǎn)的更新。而臟檢查或差分,往往會觸發(fā)整個子樹的重新渲染。截至目前還未發(fā)現(xiàn)開放和可復(fù)現(xiàn)的。
原文地址:http://blog.evanyou.me/2015/1...
vuejs是一個建造web界面的庫。配合其他工具,你也可以稱它為“框架”(盡管它更多的看起來像是一堆配合很好的工具集)。如果你從未聽說過vue,你可能會想,好吧,我懂了,又一個js框架。事實(shí)上Vue并不新,因?yàn)槲覂赡暌郧熬烷_始了它的原型開發(fā),第一個正式版發(fā)布于2014年2月,隨后不斷更新進(jìn)步,至今已經(jīng)有很多產(chǎn)品在使用Vue。
那么,Vue到底是干嘛的呢?究竟什么造就了它的與眾不同?當(dāng)這個地球上已經(jīng)有了angular,ember和react,我為什么還要學(xué)習(xí)vue?通過帶你深入vuejs的設(shè)計(jì)概念,本篇文章希望能給你一些靈感, 我相信讀后你自會有自己的答案。
響應(yīng)式保證數(shù)據(jù)和展現(xiàn)的一致很難,是嗎?
我們先從最基本的任務(wù)開始,展示數(shù)據(jù),假設(shè)我們有如下一個簡單的對象
var object = { message: "Hello world!" }
模板:
{{ message }}
在Vue里面我們這樣將它們結(jié)合:
new Vue({ el: "#example", data: object })
看起來我們僅僅渲染了模板,當(dāng)我們更新了數(shù)據(jù),我們要如何去更新界面呢?什么都不用做,因?yàn)閂ue已經(jīng)把這個對象變成了響應(yīng)式的,當(dāng)你更改了object.message, html會自動更新。更重要的是,你無須擔(dān)心如果超時(shí)去調(diào)用$apply,或者setState(),監(jiān)聽Store的事件,或者創(chuàng)建框架監(jiān)聽屬性,比如ko.observable()或 Ember.Object.create(),vue就這樣簡單的運(yùn)作。
Vue同時(shí)提供了一個完美的計(jì)算屬性(computed properties):
var example = new Vue({ data: { a: 1 }, computed: { b: function () { return this.a + 1 } } }) // both a & b are proxied on the created instance. example.a // -> 1 example.b // -> 2 example.a++ example.b // -> 3
計(jì)算屬性b追蹤a,自動同步,不需要聲明a為b的依賴。
另外,簡單類模式(POJO-based)允許很簡單的整合任意類型的數(shù)據(jù)資源或狀態(tài)管理方案,比如,這里有一個整合了vuejs組件和Rxjs的觀察模塊,僅僅用了30行代碼。
數(shù)據(jù)綁定對小型demo來說還不錯,那么大型應(yīng)用呢?
對于結(jié)構(gòu)復(fù)雜的界面,vue采用了與react十分類似的方案:從上至下的組件化。我們先來看一個可復(fù)用組件的例子:
var Example = Vue.extend({ template: "{{ message }}", data: function () { return { message: "Hello Vue.js!" } } }) // register it with the tagVue.component("example", Example)
現(xiàn)在我們就可以用這個組件在其他模版里,就如同一個自定義頁面元素:
一個組件包含另外一些組件,它們形成一個UI樹。為了保證它們之間的組合性,Vue組件同時(shí)包含如下內(nèi)容:
定義如何從父級獲取數(shù)據(jù),使用 props
發(fā)布自定義事件,以便在父級作用域中觸發(fā)它
組合父級引入內(nèi)容,使用
這里不過多探討細(xì)節(jié),感興趣請查看官網(wǎng)。
模塊化21世紀(jì)了,我們不應(yīng)該把所有東西都放在全局作用域里
我們使用打包工具(Webpack, Browerify)以及 ES2015.每個組件都是一個模塊,Vue會自動把配置對象轉(zhuǎn)換到組件結(jié)構(gòu)里,所以我們只需要在模塊里簡單的輸出如下內(nèi)容:
// ComponentA.js export default { template: "{{ message }}", data () { return { message: "Hello Vue.js!" } } }
// App.js import ComponentA from "./ComponentA" export default { // use another component, in this scope only. // ComponentA maps to the tagcomponents: { ComponentA }, template: ` ` }Now I"m using another component.
看起來不錯是嗎?如果我們能講頁面的模版,樣式和js邏輯封裝到一個文件里會更好!尤其是他們本身還有各自的語法高亮。實(shí)用工具諸如 Webpack + vue-loader 或者 Browerify + vueify,我們可以這么做:
什么?我們是不是重新定義了web組件?但是css依舊是全局的。
是的,一定程度上我們重新定義了web組件,除了:
我們也可以進(jìn)行css封裝,只需添加scoped屬性到標(biāo)簽內(nèi),它甚至不會繼承到自己的子組件里。
每個Vue組件都會被壓縮到一個js模塊內(nèi),不許加任何墊片完美兼容至IE9以上,也可以將其添加到自定義元素里。
ES2015 默認(rèn)被支持。
你可以使用任何預(yù)處理器(less, coffeScript ...) 在任意語言塊。
當(dāng)使用Webpack + vue-loader 方案時(shí),你可以引用webpack全部的強(qiáng)大功能,例如靜態(tài)資源加載和處理,因?yàn)閂ue里(單文件組件)模版和樣式都是通過webpack的html-loader,css-loader來實(shí)現(xiàn)的,你可以通過組件URLS來加載模塊依賴。
很好,我們的組件就長這個樣子:
對了,我提到vue組件是熱加載的了嗎?
可以用Vue做炫酷的東西嗎?
Vue內(nèi)置了過渡系統(tǒng),目前已經(jīng)有很多獲獎網(wǎng)站使用它們。
Vue相應(yīng)系統(tǒng)內(nèi)部對漸變性質(zhì)的狀態(tài)改變有著非常好的支持,對于其他框架而言,這里有些混亂,比如采用臟檢查(dirty-checking) 或者 dom差分(Virtual Dom diffing)。對于一個每秒60幀的狀態(tài)改變,vue清楚的知道那些節(jié)點(diǎn)被影響,更新它們,而避免那些不受影響節(jié)點(diǎn)的更新。而臟檢查或dom差分,往往會觸發(fā)整個dom子樹的重新渲染。對于小項(xiàng)目而言這還行,但是比如大項(xiàng)目里每秒60真的改變效率就不行了,就算是可以接受,這些方案也消耗了系統(tǒng)過多的資源。查看這篇討論,搞明白react,vue對于動畫渲染方面的效率差異。
下面是Vue一個狀態(tài)漸變的例子:
http://codepen.io/yyx990803/p...
我想創(chuàng)建的是應(yīng)用,路由在哪里?
和React一樣,Vue本身不提供路由,但是你可以通過Vue-router來使用路由。它提供了內(nèi)置路由映射到內(nèi)置組件的功能,并且提供了顆粒度很好的過場控制,以下例子:
import Vue from "vue" import VueRouter from "vue-router" import App from "./app.vue" import ViewA from "./view-a.vue" import ViewB from "./view-b.vue" Vue.use(VueRouter) const router = new VueRouter() router.map({ "/a": { component: ViewA }, "/b": { component: ViewB } }) router.start(App, "#app")
app.vue的模版
This is the layout that won"t change
項(xiàng)目中的實(shí)際應(yīng)用,參照 HackerNews Clone ,基于Vuejs, vue-router, webpack 和 vue-loader。
穩(wěn)定性Vue是個人項(xiàng)目?安全性如何?
是的,Vue是一個個人項(xiàng)目,如果你想找一個企業(yè)級技術(shù)支持團(tuán)隊(duì),那么Vue并不是。但,我們來看下數(shù)字,Vue自從0.11版本就保持著100%測試覆蓋率,而且肯定會繼續(xù),github issues平均13小時(shí)內(nèi)解決,目前已解決1400+ issues。截至目前還未發(fā)現(xiàn)開放和可復(fù)現(xiàn)的bug。
譯者:以下略去最后兩段,作者主要說了歷史版本,版本遷移,希望各位持續(xù)關(guān)注和支持以及相關(guān)資源。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/80282.html
摘要:小弟在前端摸爬滾打一段時(shí)間,發(fā)現(xiàn)前端的比較好的文檔比較分散,特別是中文的,我平時(shí)都是收藏在瀏覽器里,以后有好的教程和綜合性的文檔我會更新到這里。小組中文文檔,很全。 小弟在前端摸爬滾打一段時(shí)間,發(fā)現(xiàn)前端的比較好的文檔比較分散,特別是中文的,我平時(shí)都是ctrl+D收藏在瀏覽器里,以后有好的教程和綜合性的文檔我會更新到這里。一則可以做個記錄,防止丟失。二則有需要的朋友可以來我這里找一找。 ...
摘要:上圖是二月份前端框架排名,位居第一,排名第三。我們認(rèn)為前端模板和組件代碼是緊密相連的。直到最近看了文檔,才發(fā)現(xiàn)另有蹊蹺。 歡迎大家關(guān)注騰訊云技術(shù)社區(qū)-segmentfault官方主頁,我們將持續(xù)在博客園為大家推薦技術(shù)精品文章哦~ 紀(jì)俊,從事Web前端開發(fā)工作,2016年加入騰訊OMG廣告平臺產(chǎn)品部,喜歡研究前端技術(shù)框架。 這里要討論的話題,不是前端框架哪家強(qiáng),因?yàn)樵?Vue 官網(wǎng)就已經(jīng)...
摘要:一步一步學(xué)習(xí)一直都有發(fā)布他開發(fā)的教程。在上有他免費(fèi)的教程,并且宣稱是世上最深入的系列。基礎(chǔ)在上有個非常的視頻教程。的官網(wǎng)教程非常值得你從頭讀到尾。使用框架這是我們最后一個教程的介紹。不過在和已經(jīng)有為你準(zhǔn)備了不錯的免費(fèi)課程哈 一步一步學(xué)習(xí)Vue 2 (Laracasts) Jeffrey Way一直都有發(fā)布他web開發(fā)的教程。他曾經(jīng)在30天內(nèi)教會了我使用jquery。在Laracast...
摘要:因?yàn)橛脩舨挥迷诘谝淮芜M(jìn)入應(yīng)用時(shí)下載所有代碼,用戶能更快的看到頁面并與之交互。譯高階函數(shù)利用和來編寫更易維護(hù)的代碼高階函數(shù)可以幫助你增強(qiáng)你的,讓你的代碼更具有聲明性。知道什么時(shí)候和怎樣使用高階函數(shù)是至關(guān)重要的。 Vue 折騰記 - (10) 給axios做個挺靠譜的封裝(報(bào)錯,鑒權(quán),跳轉(zhuǎn),攔截,提示) 稍微改改都能直接拿來用~~~喲吼吼,喲吼吼..... 如何無痛降低 if else 面...
摘要:積少成多,最后造成內(nèi)存泄漏。前端內(nèi)存泄漏的影響,都是發(fā)生在客戶機(jī)器上,而且基本上現(xiàn)代瀏覽器也會做好保護(hù)機(jī)制,一般自行刷新之后都會解決。但是,一旦后端繪制內(nèi)存泄漏造成宕機(jī)之后,整個服務(wù)器都會受影響,危險(xiǎn)性更大,搞不好年終獎就沒了。 引言 Memory Leak 是最難排查調(diào)試的 Bug 種類之一,因?yàn)閮?nèi)存泄漏是個 undecidable problem,只有開發(fā)者才能明確一塊內(nèi)存是不是需...
閱讀 1649·2021-11-22 15:33
閱讀 1809·2021-11-15 18:01
閱讀 743·2021-10-09 09:43
閱讀 2717·2021-09-22 16:03
閱讀 896·2021-09-03 10:28
閱讀 3663·2021-08-11 10:22
閱讀 2805·2019-08-30 15:54
閱讀 1831·2019-08-30 14:21