vue常用知識點整理
什么是 mvvm?
MVVM 是 Model-View-ViewModel 的縮寫。mvvm 是一種設計思想。Model 層代表數(shù)據(jù)模型,也可以在 Model 中定義數(shù)據(jù)修改和操作的業(yè)務邏輯;View 代表 UI 組件,它負責將數(shù)據(jù)模型轉(zhuǎn)化成 UI 展現(xiàn)出來,ViewModel 是一個同步 View 和 Model 的對象。
在 MVVM 架構下,View 和 Model 之間并沒有直接的聯(lián)系,而是通過 ViewModel 進行交互,Model 和 ViewModel 之間的交互是雙向的, 因此 View 數(shù)據(jù)的變化會同步到 Model 中,而 Model 數(shù)據(jù)的變化也會立即反應到 View 上。
ViewModel 通過雙向數(shù)據(jù)綁定把 View 層和 Model 層連接了起來,而 View 和 Model 之間的同步工作完全是自動的,無需人為干涉,因此開發(fā)者只需關注業(yè)務邏輯,不需要手動操作 DOM, 不需要關注數(shù)據(jù)狀態(tài)的同步問題,復雜的數(shù)據(jù)狀態(tài)維護完全由 MVVM 來統(tǒng)一管理。
mvvm 和 mvc 區(qū)別?
mvc 和 mvvm 其實區(qū)別并不大。都是一種設計思想。主要就是 mvc 中 Controller 演變成 mvvm 中的 viewModel。mvvm 主要解決了 mvc 中大量的 DOM 操作使頁面渲染性能降低,加載速度變慢,影響用戶體驗。和當 Model 頻繁發(fā)生變化,開發(fā)者需要主動更新到 View 。
vue 的優(yōu)點是什么?
- 低耦合。視圖(View)可以獨立于 Model 變化和修改,一個 ViewModel 可以綁定到不同的"View"上,當 View 變化的時候 Model 可以不變,當 Model 變化的時候 View 也可以不變。
- 可重用性。你可以把一些視圖邏輯放在一個 ViewModel 里面,讓很多 view 重用這段視圖邏輯。
- 獨立開發(fā)。開發(fā)人員可以專注于業(yè)務邏輯和數(shù)據(jù)的開發(fā)(ViewModel),設計人員可以專注于頁面設計,使用 Expression Blend 可以很容易設計界面并生成 xml 代碼。
- 可測試。界面素來是比較難于測試的,而現(xiàn)在測試可以針對 ViewModel 來寫。
vue生命周期的理解?
答:總共分為 8 個階段創(chuàng)建前/后,載入前/后,更新前/后,銷毀前/后。
- 創(chuàng)建前/后: 在 beforeCreate 階段,vue 實例的掛載元素 el 還沒有。
- 載入前/后:在 beforeMount 階段,vue 實例的$el 和 data 都初始化了,但還是掛載之前為虛擬的 dom 節(jié)點,data.message 還未替換。在 mounted 階段,vue 實例掛載完成,data.message 成功渲染。
- 更新前/后:當 data 變化時,會觸發(fā) beforeUpdate 和 updated 方法。
- 銷毀前/后:在執(zhí)行 destroy 方法后,對 data 的改變不會再觸發(fā)周期函數(shù),說明此時 vue 實例已經(jīng)解除了事件監(jiān)聽以及和 dom 的綁定,但是 dom 結構依然存在
組件之間的傳值?
- 父組件與子組件傳值
//父組件通過標簽上面定義傳值 <template> <Main :obj="data"></Main> </template> <script> //引入子組件 import Main form "./main" exprot default{ name:"parent", data(){ return { data:"我要向子組件傳遞數(shù)據(jù)" } }, //初始化組件 components:{ Main } } </script> //子組件通過props方法接受數(shù)據(jù) <template> <div>{{data}}</div> </template> <script> exprot default{ name:"son", //接受父組件傳值 props:["data"] } </script>
- 子組件向父組件傳遞數(shù)據(jù)
//子組件通過$emit方法傳遞參數(shù) <template> <div v-on:click="events"></div> </template> <script> //引入子組件 import Main form "./main" exprot default{ methods:{ events:function(params){ console.log(params) } } } </script> // <template> <div v-on:click="emitEvent">{{data}}</div> </template> <script> exprot default{ name:"son", //接受父組件傳值 props:["data"], methods: { emitEvent() { this.$emit('event', params) // 派發(fā)函數(shù),并傳遞值,params是你自己想傳的值 } } } </script>
active-class 是哪個組件的屬性?
vue-router 模塊的 router-link 組件。
嵌套路由怎么定義?
在實際項目中我們會碰到多層嵌套的組件組合而成,但是我們?nèi)绾螌崿F(xiàn)嵌套路由呢?因此我們需要在 VueRouter 的參數(shù)中使用 children 配置,這樣就可以很好的實現(xiàn)路由嵌套。
index.html,只有一個路由出口
<div id="app"> <!-- router-view 路由出口, 路由匹配到的組件將渲染在這里 --> <router-view></router-view> </div>
main.js,路由的重定向,就會在頁面一加載的時候,就會將 home 組件顯示出來,因為重定向指向了 home 組件,redirect 的指向與 path 的必須一致。children 里面是子路由,當然子路由里面還可以繼續(xù)嵌套子路由。
import Vue from 'vue' import VueRouter from 'vue-router' Vue.use(VueRouter) //引入兩個組件 import home from "./home.vue" import game from "./game.vue" //定義路由 const routes = [ { path: "/", redirect: "/home" },//重定向,指向了home組件 { path: "/home", component: home, children: [ { path: "/home/game", component: game } ] } ] //創(chuàng)建路由實例 const router = new VueRouter({routes}) new Vue({ el: '#app', data: { }, methods: { }, router })
home.vue,點擊顯示就會將子路由顯示在出來,子路由的出口必須在父路由里面,否則子路由無法顯示。
路由之間跳轉(zhuǎn)?
- 聲明式(標簽跳轉(zhuǎn))
- 編程式( js 跳轉(zhuǎn)) router.push('index')
懶加載(按需加載路由)(??迹?/h2>
webpack 中提供了 require.ensure()來實現(xiàn)按需加載。以前引入路由是通過 import 這樣的方式引入,改為 const 定義的方式進行引入。
- 不進行頁面按需加載引入方式:
import home from '../../common/home.vue'
- 進行頁面按需加載的引入方式:
const home = r => require.ensure( [], () => r (require('../../common/home.vue')))
vuex 是什么?怎么使用?哪種功能場景使用它?
vue 框架中狀態(tài)管理。在 main.js 引入 store,注入。新建了一個目錄 store,….. export 。場景有:單頁應用中,組件之間的狀態(tài)。音樂播放、登錄狀態(tài)、加入購物車
// 新建 store.js import vue from 'vue' import vuex form 'vuex' vue.use(vuex) export default new vuex.store({ //...code }) //main.js import store from './store' ...
vue-router 有哪幾種導航鉤子?
三種
全局導航鉤子
- router.beforeEach(to, from, next),
- router.beforeResolve(to, from, next),
- router.afterEach(to, from ,next)
組件內(nèi)鉤子
- beforeRouteEnter,
- beforeRouteUpdate,
- beforeRouteLeave
單獨路由獨享組件
- beforeEnter
自定義指令(v-check, v-focus) 的方法有哪些? 它有哪些鉤子函數(shù)? 還有哪些鉤子函數(shù)參數(shù)
- 全局定義指令:在 vue 對象的 directive 方法里面有兩個參數(shù), 一個是指令名稱, 另一個是函數(shù)。
- 組件內(nèi)定義指令:directives
- 鉤子函數(shù): bind(綁定事件出發(fā))、inserted(節(jié)點插入時候觸發(fā))、update(組件內(nèi)相關更新)
- 鉤子函數(shù)參數(shù): el、binding
說出至少 4 種 vue 當中的指令和它的用法
- v-if(判斷是否隱藏)
- v-for(把數(shù)據(jù)遍歷出來)
- v-bind(綁定屬性)
- v-model(實現(xiàn)雙向綁定)
vue 的雙向綁定的原理是什么(???
vue.js 是采用數(shù)據(jù)劫持結合發(fā)布者-訂閱者模式的方式,通過 Object.defineProperty()來劫持各個屬性的 setter,getter,在數(shù)據(jù)變動時發(fā)布消息給訂閱者,觸發(fā)相應的監(jiān)聽回調(diào)。
具體步驟:
第一步:需要 observe 的數(shù)據(jù)對象進行遞歸遍歷,包括子屬性對象的屬性,都加上 setter 和 getter 這樣的話,給這個對象的某個值賦值,就會觸發(fā) setter,那么就能監(jiān)聽到了數(shù)據(jù)變化
第二步:compile 解析模板指令,將模板中的變量替換成數(shù)據(jù),然后初始化渲染頁面視圖,并將每個指令對應的節(jié)點綁定更新函數(shù),添加監(jiān)聽數(shù)據(jù)的訂閱者,一旦數(shù)據(jù)有變動,收到通知,更新視圖
第三步:Watcher 訂閱者是 Observer 和 Compile 之間通信的橋梁,主要做的事情是:
- 在自身實例化時往屬性訂閱器(dep)里面添加自己
- 自身必須有一個 update()方法
- 待屬性變動 dep.notice()通知時,能調(diào)用自身的 update() 方法,并觸發(fā) Compile 中綁定的回調(diào),則功成身退。
第四步:MVVM 作為數(shù)據(jù)綁定的入口,整合 Observer、Compile 和 Watcher 三者,通過 Observer 來監(jiān)聽自己的 model 數(shù)據(jù)變化,通過 Compile 來解析編譯模板指令,最終利用 Watcher 搭起 Observer 和 Compile 之間的通信橋梁,達到數(shù)據(jù)變化 -> 視圖更新;視圖交互變化(input) -> 數(shù)據(jù) model 變更的雙向綁定效果。
vuex 有哪幾種屬性
有 5 種,分別是 state、getter、mutation、action、module
vuex 的 store 特性是什么
- vuex 就是一個倉庫,倉庫里放了很多對象。其中 state 就是數(shù)據(jù)源存放地,對應于一般 vue 對象里面的 data
- state 里面存放的數(shù)據(jù)是響應式的,vue 組件從 store 讀取數(shù)據(jù),若是 store 中的數(shù)據(jù)發(fā)生改變,依賴這相數(shù)據(jù)的組件也會發(fā)生更新
- 它通過 mapState 把全局的 state 和 getters 映射到當前組件的 computed 計算屬性
vuex 的 getter 特性是什么
- getter 可以對 state 進行計算操作,它就是 store 的計算屬性
- 雖然在組件內(nèi)也可以做計算屬性,但是 getters 可以在多給件之間復用
- 如果一個狀態(tài)只在一個組件內(nèi)使用,是可以不用 getters
vuex 的 mutation 特性是什么
- action 類似于 muation, 不同在于:action 提交的是 mutation,而不是直接變更狀態(tài)
- action 可以包含任意異步操作
vue 中 ajax 請求代碼應該寫在組件的 methods 中還是 vuex 的 action 中
如果請求來的數(shù)據(jù)不是要被其他組件公用,僅僅在請求的組件內(nèi)使用,就不需要放入 vuex 的 state 里
如果被其他地方復用,請將請求放入 action 里,方便復用,并包裝成 promise 返回
不用 vuex 會帶來什么問題
- 可維護性會下降,你要修改數(shù)據(jù),你得維護 3 個地方
- 可讀性下降,因為一個組件里的數(shù)據(jù),你根本就看不出來是從哪里來的
- 增加耦合,大量的上傳派發(fā),會讓耦合性大大的增加,本來 Vue 用 Component 就是為了減少耦合,現(xiàn)在這么用,和組件化的初衷相背
vuex 原理
vuex 僅僅是作為 vue 的一個插件而存在,不像 Redux,MobX 等庫可以應用于所有框架,vuex 只能使用在 vue 上,很大的程度是因為其高度依賴于 vue 的 computed 依賴檢測系統(tǒng)以及其插件系統(tǒng),
vuex 整體思想誕生于 flux,可其的實現(xiàn)方式完完全全的使用了 vue 自身的響應式設計,依賴監(jiān)聽、依賴收集都屬于 vue 對對象 Property set get 方法的代理劫持。最后一句話結束 vuex 工作原理,vuex 中的 store 本質(zhì)就是沒有 template 的隱藏著的 vue 組件;
使用 Vuex 只需執(zhí)行 Vue.use(Vuex),并在 Vue 的配置中傳入一個 store 對象的示例,store 是如何實現(xiàn)注入的?
Vue.use(Vuex) 方法執(zhí)行的是 install 方法,它實現(xiàn)了 Vue 實例對象的 init 方法封裝和注入,使傳入的 store 對象被設置到 Vue 上下文環(huán)境的store中。因此在VueComponent任意地方都能夠通過this.store 訪問到該 store。
state 內(nèi)部支持模塊配置和模塊嵌套,如何實現(xiàn)的?
在 store 構造方法中有 makeLocalContext 方法,所有 module 都會有一個 local context,根據(jù)配置時的 path 進行匹配。所以執(zhí)行如 dispatch('submitOrder', payload)這類 action 時,默認的拿到都是 module 的 local state,如果要訪問最外層或者是其他 module 的 state,只能從 rootState 按照 path 路徑逐步進行訪問。
在執(zhí)行 dispatch 觸發(fā) action(commit 同理)的時候,只需傳入(type, payload),action 執(zhí)行函數(shù)中第一個參數(shù) store 從哪里獲取的?
store 初始化時,所有配置的 action 和 mutation 以及 getters 均被封裝過。在執(zhí)行如 dispatch('submitOrder', payload)的時候,actions 中 type 為 submitOrder 的所有處理方法都是被封裝后的,其第一個參數(shù)為當前的 store 對象,所以能夠獲取到 { dispatch, commit, state, rootState } 等數(shù)據(jù)。
Vuex 如何區(qū)分 state 是外部直接修改,還是通過 mutation 方法修改的?
Vuex 中修改 state 的唯一渠道就是執(zhí)行 commit('xx', payload) 方法,其底層通過執(zhí)行 this._withCommit(fn) 設置_committing 標志變量為 true,然后才能修改 state,修改完畢還需要還原_committing 變量。外部修改雖然能夠直接修改 state,但是并沒有修改_committing 標志位,所以只要 watch 一下 state,state change 時判斷是否_committing 值為 true,即可判斷修改的合法性。
調(diào)試時的"時空穿梭"功能是如何實現(xiàn)的?
devtoolPlugin 中提供了此功能。因為 dev 模式下所有的 state change 都會被記錄下來,'時空穿梭' 功能其實就是將當前的 state 替換為記錄中某個時刻的 state 狀態(tài),利用 store.replaceState(targetState) 方法將執(zhí)行 this._vm.state = state
實現(xiàn)。
axios 是什么?怎么使用?描述使用它實現(xiàn)登錄功能的流程
axios 是請求后臺資源的模塊。 npm i axios -S
如果發(fā)送的是跨域請求,需在配置文件中 config/index.js 進行配置
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
詳解Vue中l(wèi)ocalstorage和sessionstorage的使用
這篇文章主要介紹了詳解Vue中l(wèi)ocalstorage和sessionstorage的使用方法和經(jīng)驗心得,有需要的朋友跟著小編參考學習下吧。2017-12-12解決創(chuàng)建vue項目后沒有vue.config.js文件的問題
這篇文章給大家主要介紹如何解決創(chuàng)建vue項目后沒有webpack.config.js(vue.config.js)文件,文中有詳細的解決方法,感興趣的朋友可以參考閱讀下2023-07-07在vue中使用screenfull?依賴,實現(xiàn)全屏組件方式
這篇文章主要介紹了在vue中使用screenfull?依賴,實現(xiàn)全屏組件方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-12-12vue插件開發(fā)之使用pdf.js實現(xiàn)手機端在線預覽pdf文檔的方法
這篇文章主要介紹了vue插件開發(fā)之使用pdf.js實現(xiàn)手機端在線預覽pdf文檔的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-07-07