來公司之後就一直在用vue框架,不論是業務代碼,仍是作vue組件。關於vue有一些點是文檔中沒有說起的,記錄一下以便之後查詢~javascript
新一代 Vue.js 框架很是關注如何用極少的外部特性來解決應用程序/視圖狀態同步問題。css
Vue.js 大部分是基於vue實例(var vm = new Vue({ ... }))完成的。Vue.js 負責給瀏覽器 DOM 中綁定數據。html
(1) 簡潔 (2) 輕量 (3)快速 (4) 數據驅動 (5) 模塊友好 (6) 組件化vue
與angularJS1對比java
vue不少的語法是借鑑的angular,好比v-if/ng-if、v-model、ng-model等。angularjs
在API與設計兩方面上Vue.js都比Angular1簡單得多。vue的源碼比angularJS小了將近一半web
好比綁定點擊事件:v-on:click='doSomething' 可寫成 @click='doSomthing'算法
綁定動態數據:v-bind:href='url' 可寫成 :href='url'數組
angular1使用雙向數據綁定,vue在不一樣組件間強制使用單向數據流。尤爲vue2.0中父子間也強制只能父向子傳遞數據。這使應用中的數據流更加清晰易懂。瀏覽器
並且angularJS綁定數據的代碼也不如vue簡潔。angular裏有什麼ng-app/ng-controller等等設置起來比較繁瑣
Vue 有更好的性能,而且很是很是容易優化,由於它不使用髒檢查。
在 Angular 1 中,當 watcher 愈來愈多時會變得愈來愈慢,由於做用域內的每一次變化,全部 watcher 都要從新計算。而且,若是一些 watcher 觸發另外一個更新,髒檢查循環(digest cycle)可能要運行屢次。
Angular 用戶經常要使用深奧的技術,以解決髒檢查循環的問題。有時沒有簡單的辦法來優化有大量 watcher 的做用域。
Vue 則根本沒有這個問題,由於它使用基於依賴追蹤的觀察系統而且異步隊列更新,全部的數據變化都是獨立觸發,除非它們之間有明確的依賴關係。
在 Vue 中指令和組件分得更加清晰。指令只封裝 DOM 操做,而組件表明一個自給自足的獨立單元 —— 有本身的視圖和數據邏輯
可是,在angular中二者有很多相混的地方。
與angularJS2對比
angularjs2實際是一個全新的框架了,並且還用vue同樣的思路解決了angularJS1裏的一些問題。angular1 面向的是較小的應用程序,angular2 已轉移焦點,面向的是大型企業應用。
在性能方面,這兩個框架都很是的快。
但目前尚沒有足夠的數據用例來具體展現。若是你必定要量化這些數據,你能夠查看第三方參照,它代表 Vue 2 相比 Angular2 是更快的。
在大小方面,vue仍是比angular2小得多
雖然 Angular 2 使用 tree-shaking 和離線編譯技術使代碼體積減少了許多。但包含編譯器和所有功能的 Vue2(23kb) 相比 Angular 2(50kb) 仍是要小的多。可是要注意,用 Angular 2 的 App 的體積縮減是使用了 tree-shaking 移除了那些框架中沒有用到的功能,但隨着功能引入的不斷增多,尺寸會變得愈來愈大。
Vue 相比於 Angular 2 則更加靈活
Vue 官方提供了構建工具來協助你構建項目,但它並不限制你去如何構建。有人可能喜歡用統一的方式來構建,也有不少開發者喜歡這種靈活自由的方式。
Vue可以快速上手。你使用的是熟悉的 HTML、符合 ES5 規則的 JavaScript(也就是純 JavaScript)。有了這些基本的技能,你能夠快速地掌握它(指南)並投入開發 。
Angular 2 的學習曲線是很是陡峭的。即便不包括 TypeScript,它的開始指南中所用的就有 ES2015 標準的 JavaScript,18個 NPM 依賴包,4 個文件和超過 3 千多字的介紹,這一切都是爲了完成個 Hello World。而Vue’s Hello World就很是簡單。甚至咱們並不用花費一整個頁面去介紹它。
寫成data:function(){return{...}}的形式:表示的是一個返回數據對象的函數,而不是直接返回數據對象。採用該方法的緣由是,你建立了一個可在多個位置重用的組件,你不但願全部類型實例共享data字段,若是它是一個直接對象,上述問題就不可避免。
vue2.0也是有改動的,不過我實現過渡效果是用的vue1.0的要求實現的,由於公司原有的部分仍是應用的vue1.0。大體寫下1.0版本下實現的關鍵點:
// 在標籤中加入transition,配合v-if/v-show改變,就觸發過渡的css變化 <div v-if="show" transition='fade'> // 或是寫成下面這樣,而後在vue父實例的data中定義transitionName: 'XXX' <div v-if="show" transition='transitionName'> // 寫CSS樣式: .fade-transition {} —— 始終保留在元素上的 .fade-enter {} —— 進入過渡狀態的一瞬間的樣式,結束後刪除 .fade-leave {} —— 離開過渡的結束狀態的一瞬間的樣式,結束即刪除 // 還能夠配合hooks使用: Vue.transition('fade',{ beforeEnter: function(el){}, enter: function(el){}, alertEnter: function(el){}, ......具體有哪些須要的時候能夠看文檔~ })
這裏你定義的transitionName是XXX,CSS樣式這裏就寫XXX-transition/enter/leave,要對應!
<div class="recommend_shop" v-for="rshop in recommend_shop"> <div class="group_img" :style="{ backgroundImage: 'url('+ rshop.group_header +')'}"v-on:click="openGroup( rshop.group_id )"> </div> <div class="group_info">成交 {{ rshop.goods_nums }}</div> </div>
這裏:style="{ backgroundImage:'url('+ ... +')' }" 和 v-on:click="openGroup( ... )"的寫法要注意!
一開始我寫組件,只知道組件就是把一個經常使用的功能封裝起來,具體這個封裝體如今哪裏?就比如你拿一個轉換插頭,你不知道里面它有什麼邏輯,裝了什麼亂七八糟的東西,可是你提供了一個插孔和一個插頭,這個插孔就是組件要預留出來的可能要傳進來的一些數據,插頭就是組件最後要傳給外部的一些外部須要的數據。
這個我以前也記錄過,我當時理解slot的時候把官方文檔的三個例子都寫了一遍,盯着看了好一會才懂。。。我也是對本身無語了。。。
// 在父實例page.js中定義想要操做的事件
data: function(){
curPage: 1
} methods: { changePage: function(){ this.curPage = cur; } }
// 在html的<page>標籤上添加v-on:click事件
// 父組件用v-on監聽事件
<page :data-num="pagedata.length" :each="eachPageSize" :visiblepage="visiblepage" v-on:change-page="changePage"></page>
// 子組件模板(pages是個數字數組) <li v-for="index in pages" v-bind:class="{ active: curPage == index }"> <a v-on:click="btnClick(index)">{{ index }}</a> </li> // 在子組件page.vue中:點擊事件中添加:$emit(),將事件傳播到父組件 methods: { btnClick: function(index){ this.curPage = index this.$emit('change-page', index) } }
怎麼把點擊的是哪一個數字傳到父組件,使父組件可使用這個數字去作其餘的操做?總體流程是:點擊子組件中的點擊按鈕觸發btnClick(index)方法,btnClick中,利用this.$emit('change-page',index)觸發change-page事件而且將當前的頁碼值以index參數的形式傳到父組件,父組件利用v-on:change-page='changePage'監聽到子組件傳來的change-page,調用父組件中的changePage方法,在這裏完成 「子組件數據傳到父組件」 這件事~ this.curPage = index; 這句就將子組件裏的點擊的那個數字賦值給curPage了,這個curPage是在父組件的data裏定義的~~吼吼,就是這麼個過程~~
props: { navs: { // 從父級傳來的navs type: Array , default: function(){ return {} } } } , data: function(){ return { // 這裏利用傳來的navs來設置初始值cur cur: this.navs[0].en_name } }
props: { dataNum: { // 傳進來的內容總數 type: Number , default: 100 } , each: { // 單頁的個數 type: Number , default: 10 } } , computed: { totalPages: function(){ // 計算得出總頁數,根據父組件傳進來的值的不一樣獲得不一樣的頁數 return Math.ceil(this.dataNum / this.each) || 0 }
用的多了果真以爲順手多了。。。仍是要繼續學習~~~最近終於弄明白了原型、原型鏈還有閉包,接下來要複習一些算法和基礎知識~~~回了學校還要寫論文,時間真的是不夠用。。。不過想到要回家了仍是忍不住小激動~今天把上線的全部需求改完,最近一版的工做就告一段落了,看小哥還在學vue2.0改版的內容,我也很差閒着,寫完我也去看看。。。同志們共同進步呀~