相同點css
不一樣點html
MVC(Model-View-Controller)前端
MVVM(Model-View-ViewModel)vue
如何理解vue中MVVM模式?react
v-if
:是「真正」的條件渲染,在切換中組件會適當的被銷燬和重建;v-for
:數據循環渲染;v-show
:控制元素的顯示隱藏,即控制元素的display,基於 CSS 進行切換v-bind:class
:綁定一個屬性;v-model
:實現雙向綁定//父組件經過標籤上面定義傳值 <template> <Main :obj="data"></Main> </template> <script> //引入子組件 import Main form "./main" exprot default{ name:"parent", data(){ return { data:"我要向子組件傳遞數據" } }, //初始化組件 components:{ Main } } </script>
//子組件經過props方法接受數據 <template> <div>{{data}}</div> </template> <script> exprot default{ name:"son", //接受父組件傳值 props:["data"] } </script>
子組件向父組件傳值:經過$on,$emitwebpack
//子組件: <template> <div @click="up"></div> </template> methods: { up() { this.$emit('upup','hehe'); //主動觸發upup方法,'hehe'爲向父組件傳遞的數據 } } //父組件 <div> <child v-on:upup="change" :msg="msg"></child> //監聽子組件觸發的upup事件,而後調用change方法 </div> methods: { change(msg) { this.msg = msg; } }
若是2個組件不是父子組件那麼如何通訊呢?這時能夠經過eventHub來實現通訊.
所謂eventHub就是建立一個事件中心,至關於中轉站,能夠用它來傳遞事件和接收事件.angularjs
let Hub = new Vue(); //建立事件中心 //組件1觸發: <div @click="eve"></div> methods: { eve() { Hub.$emit('change','hehe'); //Hub觸發事件 } } //組件2接收: <div></div> created() { Hub.$on('change', () => { //Hub接收事件 this.msg = 'hehe'; }); }
聲明式(標籤跳轉) <router-link :to="index">
es6
router.push('index')
indexPage.vue
),script必定要export default {}
import indexPage from '@/components/indexPage.vue'
components
屬性上面,components:{indexPage}
template
視圖view中使用,問題有indexPage
命名,使用的時候則index-page
。web
require.ensure()
來實現按需加載。之前引入路由是經過import
這樣的方式引入,改成const定義的方式進行引入。import home from '../../common/home.vue'
const home = r => require.ensure( [], () => r (require('../../common/home.vue')))
main.js
引入store
,注入。場景有:單頁應用中,組件之間的狀態。音樂播放、登陸狀態、加入購物車數據單向流動vue-router
View, Actions,State
,數據的流動也是從View => Actions => State =>View
,以此達到數據的單向流動,可是項目較大的,組件嵌套過多的時候,多組件共享同一個State會在數據傳遞時出現不少問題。Vuex就是爲了解決這些問題而產生的。Vuex.Store
由state
, mutations
和actions
三個屬性組成:state
中保存着共有數據,改變state
中的數據只能經過mutations
中的方法,且mutations
中的方法必須是同步的,若是要寫異步的方法,須要些在actions
中,並經過commit
到mutations
中進行state
中數據的更改。v-show
指令是經過修改元素的displayCSS屬性讓其顯示或者隱藏v-if
指令是直接銷燬和重建DOM達到讓元素顯示和隱藏的效果<style>
修改成<style scoped>
<keep-alive></keep-alive>
包裹動態組件時,會緩存不活動的組件實例,主要用於保留組件狀態或避免從新渲染。import ... from ...
語法或CommonJS
的require()
方法引入組件// 註冊 Vue.component('my-component', { template: '<div>A custom component!</div>' })
<my-component></my-component>
import ... from ...
語法或CommonJS
的require()
方法引入插件Vue.use(MyPlugin, { someOption: true })
template/js/style
轉換成js模塊。而後,AST會通過generate(將AST語法樹轉化成render funtion字符串的過程)獲得render函數,render的返回值是VNode,VNode是Vue的虛擬DOM節點,裏面有(標籤名、子節點、文本等等)
前端路由的核心,就在於 —— 改變視圖的同時不會向後端發出請求。
所以能夠說,hash 模式和 history 模式都屬於瀏覽器自身的特性,Vue-Router 只是利用了這兩個特性(經過調用瀏覽器提供的接口)來實現前端路由。
與AngularJS的區別
相同點:
1.都支持指令:內置指令和自定義指令。
2.都支持過濾器:內置過濾器和自定義過濾器。
3.都支持雙向數據綁定。
4.都不支持低端瀏覽器。
不一樣點:
1.AngularJS的學習成本高,好比增長了Dependency Injection特性,而Vue.js自己提供的API都比較簡單、直觀。
2.在性能上,AngularJS依賴對數據作髒檢查,因此Watcher越多越慢。
3.Vue.js使用基於依賴追蹤的觀察而且使用異步隊列更新。全部的數據都是獨立觸發的。對於龐大的應用來講,這個優化差別仍是比較明顯的。
beforeCreate
階段,vue實例的掛載元素el和數據對象data
都爲undefined
,還未初始化。在created
階段,vue實例的數據對象data
有了,el
尚未。載入前/後:在beforeMount
階段,vue實例的$el
和data
都初始化了,但仍是掛載以前,爲虛擬的dom節點,data.message
還未替換。在mounted
階段,vue實例掛載完成,data.message
成功渲染。
更新前/後:當data變化時,會觸發beforeUpdate
和updated
方法。
銷燬前/後:在執行destroy
方法後,對data的改變不會再觸發周期函數,說明此時vue實例已經解除了事件監聽以及和dom的綁定,可是dom結構依然存在
beforeCreate, created, beforeMount, mounted
這幾個鉤子mounted
中就已經完成了beforecreate
: 能夠在這加個loading事件,在加載實例時觸發 created
: 初始化完成時的事件寫在這裏,如在這結束loading事件,異步請求也適宜在這裏調用 mounted
: 掛載元素,獲取到DOM節點 updated
: 若是對數據統一處理,在這裏寫上相應函數 beforeDestroy
: 能夠作一個確認中止事件的確認框 nextTick
: 更新數據後當即操做dom