Vue面試題(3)Vue-Router和Vuex

2021-03-06 重溫新知
本文收集和整理了有關Vue-Router和Vuex的面試題,希望對準備面試和深入學習的小夥伴有所幫助!註:文中題目不是原創,但為了添加為話題標為原創。題目選於多篇文章,又重新整理、整合、排序,再此一併感謝。收集材料時有的忽略了標註來源,如原作者希望標出來源,請聯繫小編。1、請介紹一下你對vuex的理解?

Vuex 是一個專為 Vue.js 應用程式開發的狀態管理模式。每一個 Vuex 應用的核心就是 store(倉庫)。「store」 基本上就是一個容器,它包含著你的應用中大部分的狀態 ( state )。

(1)Vuex 的狀態存儲是響應式的。當 Vue 組件從 store 中讀取狀態的時候,若 store 中的狀態發生變化,那麼相應的組件也會相應地得到高效更新。

(2)改變 store 中的狀態的唯一途徑就是顯式地提交 (commit) mutation。這樣使得我們可以方便地跟蹤每一個狀態的變化。

主要包括以下幾個模塊:

· State:定義了應用狀態的數據結構,可以在這裡設置默認的初始狀態。

· Getter:允許組件從 Store 中獲取數據,mapGetters 輔助函數僅僅是將 store 中的 getter 映射到局部計算屬性

· Mutation:是唯一更改 store 中狀態的方法,且必須是同步函數。

· Action:用於提交 mutation,而不是直接變更狀態,可以包含任意異步操作。

· Module:允許將單一的 Store 拆分為多個 store 且同時保存在單一的狀態樹中。

2、action 和 mutation 區別

mutation 是同步更新數據(內部會進行是否為異步方式更新數據的檢測)

內部並不能檢測到是否異步更新,而是實例上有一個開關變量 _committing,

只有在 mutation 執行之前才會把開關打開,允許修改 state 上的屬性。

並且在 mutation 同步執行完成後立刻關閉。

異步更新的話由於已經出了 mutation 的調用棧,此時的開關已經是關上的,自然能檢測到對 state 的修改並報錯。具體可以查看源碼中的 withCommit 函數。這是一種很經典對於 js單線程機制 的利用。

Store.prototype._withCommit = function _withCommit(fn) {
  var committing = this._committing
  this._committing = true
  fn()
  this._committing = committing
}

3、為啥要有vuex,使用localStorage本地存儲不行麼?

Vuex 是一個專為 Vue.js 應用程式開發的狀態管理模式,Vuex 的狀態存儲是響應式的。

當 Vue 組件從 store 中讀取狀態的時候,若 store 中的狀態發生變化,那麼相應的組件也會相應地得到高效更新。

當多個組件擁有同一個狀態的時候,vuex能夠很好的幫我們處理。、

可以很好的使用vue開發者工具調試vuex的狀態 。

這些優勢是localStorage不能夠很好的模擬的。

4、頁面刷新後vuex的state數據丟失怎麼解決?

store裡的數據是保存在運行內存中的,當頁面刷新時,頁面會重新加載vue實例,store裡面的數據就會被重新賦值初始化。

理論上我們是不需要持久存儲vuex的值的,因為請求我們會去接口拿數據,進行重新渲染,和第一次進入一樣 。

但是如果非要保存上一次的臨時狀態,其實可以使用localStorage進行持久化存儲,但是這個時候又得去處理和服務端數據同步的問題。

5、Vuex和localStorage的區別是什麼?

1.最重要的區別

vuex存儲在內存

localstorage以文件的方式存儲在本地

localstorage只能存儲字符串類型的數據,存儲對象需要JSON的stringify和parse方法進行處理。讀取內存比讀取硬碟速度要快

2.應用場景

vuex是一個專門為Vue.js應用程式開發的狀態管理模式。它採用集中式存儲管理應用的所有組件的狀態,並以相應的規則保證狀態以一種可預測的方式發生變化。vuex用於組件之間的傳值

localstorage是本地存儲,是將數據存儲到瀏覽器的方法,一般是在跨頁面傳遞數據時使用的

vuex能做到數據的響應式,localstorage不能做到

3.永久性

很多人覺得用localstorage可以代替vuex,對於不變的數據確實可以,但是當兩個組件公用一個數據源(對象或數組)時,如果其中一個組件改變了該數據源,希望另一個組件響應該變化時,localstorage無法做到,原因在區別1那裡

6、vue-router的原理是什麼?

實現原理:vue-router的原理就是更新視圖而不重新請求頁面

vue-router可以通過mode參數設置為三種模式:hash模式、history模式、abstract模式。

1.hash模式 默認是hash模式,基於瀏覽器history api,使用window.addEventListener('hashchange',callback,false)對瀏覽器地址進行監聽。

當調用push時,把新路由添加到瀏覽器訪問歷史的棧頂。

使用replace時,把瀏覽器訪問歷史的棧頂路由替換成新路由 hash的值等於url中#及其以後的內容。

瀏覽器是根據hash值的變化,將頁面加載到相應的DOM位置。錨點變化只是瀏覽器的行為,每次錨點變化後依然會在瀏覽器中留下一條歷史記錄,可以通過瀏覽器的後退按鈕回到上一個位置

2.History history模式,基於瀏覽器history api ,使用window.onpopstate對瀏覽器地址進行監聽。

對瀏覽器history api中的pushState()、replaceState()進行封裝,當方法調用,會對瀏覽器的歷史棧進行修改。從而實現URL的跳轉而無需加載頁面 。但是他的問題在於當刷新頁面的時候會走後端路由,所以需要服務端的輔助來兜底,避免URL無法匹配到資源時能返回頁面。

3.abstract 不涉及和瀏覽器地址的相關記錄。

流程跟hash模式一樣,通過數組維護模擬瀏覽器的歷史記錄棧 。服務端下使用。使用一個不依賴於瀏覽器的瀏覽器歷史虛擬管理後臺。

4.總結:

hash模式和history模式都是通過window.addEvevtListenter()方法監聽 hashchange和popState進行相應路由的操作。可以通過back、foward、go等方法訪問瀏覽器的歷史記錄棧,進行各種跳轉。

而abstract模式是自己維護一個模擬的瀏覽器歷史記錄棧的數組。

7、hash路由和history路由實現原理說一下8、請介紹一下你對vue-router的理解?

第一,vue-router 有 3 種路由模式:hash、history、abstract

hash: 使用 URL hash 值來作路由。支持所有瀏覽器,包括不支持 HTML5 History Api 的瀏覽 

history : 依賴 HTML5 History API 和伺服器配置。具體可以查看 HTML5 History 模式;

abstract : 支持所有 JavaScript 運行環境,如 Node.js 伺服器端。如果發現沒有瀏覽器的 API,路由會自動強制進入這個模式.

(1)hash 模式的實現原理

早期的前端路由的實現就是基於 location.hash 來實現的。其實現原理很簡單,location.hash 的值就是 URL 中 # 後面的內容。比如,location.hash 的值為 '#search':

hash 路由模式的實現主要是基於下面幾個特性:

URL 中 hash 值只是客戶端的一種狀態,也就是說當向伺服器端發出請求時,hash 部分不會被發送;

hash 值的改變,都會在瀏覽器的訪問歷史中增加一個記錄。因此我們能通過瀏覽器的回退、前進按鈕控制hash 的切換;

可以通過 a 標籤,並設置 href 屬性,當用戶點擊這個標籤後,URL 的 hash 值會發生改變;或者使用 JavaScript 來對 loaction.hash 進行賦值,改變 URL 的 hash 值;

我們可以使用 hashchange 事件來監聽 hash 值的變化,從而對頁面進行跳轉(渲染)。

(2)history 模式的實現原理

HTML5 提供了 History API 來實現 URL 的變化。其中做最主要的 API 有以下兩個:history.pushState() 和 history.repalceState()。這兩個 API 可以在不進行刷新的情況下,操作瀏覽器的歷史記錄。唯一不同的是,前者是新增一個歷史記錄,後者是直接替換當前的歷史記錄,如下所示:

window.history.pushState(null, null, path);
window.history.replaceState(null, null, path);

history 路由模式的實現主要基於存在下面幾個特性:

pushState 和 repalceState 兩個 API 來操作實現 URL 的變化 ;

我們可以使用 popstate 事件來監聽 url 的變化,從而對頁面進行跳轉(渲染);

history.pushState() 或 history.replaceState() 不會觸發 popstate 事件,這時我們需要手動觸發頁面跳轉(渲染)。

第二,說一下導航鉤子函數(導航守衛)

全局守衛

router.beforeEach 全局前置守衛 進入路由之前

router.beforeResolve 全局解析守衛(2.5.0+) 在beforeRouteEnter調用之後調用

router.afterEach 全局後置鉤子 進入路由之後

    main.js 入口文件
    import router from './router'; // 引入路由
    router.beforeEach((to, from, next) => { 
      next();
    });
    router.beforeResolve((to, from, next) => {
      next();
    });
    router.afterEach((to, from) => {
      console.log('afterEach 全局後置鉤子');
    });

路由獨享的守衛 

你可以在路由配置上直接定義 beforeEnter 守衛

const router = new VueRouter({
  routes: [
    {
      path: '/foo',
      component: Foo,
      beforeEnter: (to, from, next) => {
        // ...
      }
    }
  ]
})

組件內的守衛 

你可以在路由組件內直接定義以下路由導航守衛

const Foo = {
  template: `...`,
  beforeRouteEnter (to, from, next) {
    // 在渲染該組件的對應路由被 confirm 前調用
    // 不!能!獲取組件實例 `this`
    // 因為當守衛執行前,組件實例還沒被創建
  },
  beforeRouteUpdate (to, from, next) {
    // 在當前路由改變,但是該組件被復用時調用
    // 舉例來說,對於一個帶有動態參數的路徑 /foo/:id,在 /foo/1 和 /foo/2 之間跳轉的時候,
    // 由於會渲染同樣的 Foo 組件,因此組件實例會被復用。而這個鉤子就會在這個情況下被調用。
    // 可以訪問組件實例 `this`
  },
  beforeRouteLeave (to, from, next) {
    // 導航離開該組件的對應路由時調用,我們用它來禁止用戶離開
    // 可以訪問組件實例 `this`
    // 比如還未保存草稿,或者在用戶離開前,
    將setInterval銷毀,防止離開之後,定時器還在調用。
  }
}

9、Vue-router跳轉和location.href有什麼區別

使用location.href='/url'來跳轉,簡單方便,但是刷新了頁面

使用history.pushState('/url'),無刷新頁面,靜態跳轉;

引進router,然後使用router.push('/url')來跳轉,使用了diff算法,實現了按需加載,減少了dom的消耗。

其實使用router跳轉和使用history.pushState()沒什麼差別的,因為vue-router就是用了history.pushState(),尤其是在history模式下。

10、怎麼定義 vue-router 的動態路由? 怎麼獲取傳過來的值?

在router目錄下的index.js文件中,對path屬性加上/:id。使用router對象的params.id。

{
    name: 'monitor',
    path: '/monitor/:projectInfo',
    component: () => import('@/pages/monitor/Index'),
    meta: {
      breadcrumbName: 'ViewRecorder',
      parentParam: true
    }
  }

11、vue-router實現路由懶加載( 動態加載路由 )

第一種:vue異步組件技術:異步加載,vue-router配置路由 , 使用vue的異步組件技術 , 可以實現按需加載 .但是,這種情況下一個組件生成一個js文件。

第二種:路由懶加載(使用import)。

第三種:webpack提供的require.ensure(),vue-router配置路由,使用webpack的require.ensure技術,也可以實現按需加載。這種情況下,多個路由指定相同的chunkName,會合併打包成一個js文件。

const routes = [
{
  path: '/login',
  name: 'login',
  component: () => import('@/pages/Login')
},
{
  path: '/',
  name: 'main',
  component: () => import('@/pages/Main'),
  children: [{
    name: 'index',
    path: '',
    component: () => import('@/pages/system/Index'),
    meta: {
      breadcrumbName: 'HomePage'
    }
  },
 ]

12、this.$route.params和this.$route.query的區別

用法:query要用path來引入,params要用name來引入

相關焦點

  • Vue全家桶&vue-router原理
    原理 Vue全家桶:vue + vue-router(路由)+ vuex(狀態管理)+ axios(請求)本次主要分析並實現簡版vue-router,從源碼中學習借鑑,更好的理解源碼vue-routerVue Router 是 Vue.js 官⽅的路由管理器。
  • Vue-Router源碼學習之index.js(vue-router類)
    正文vue-router類裡面都做了什麼?= {}),在vue-router中使用了flow.js做了類型的檢查,什麼是flow.js?首先我們說一下vue-router最核心的內容之一:解析:mode我們知到vue-router的路由有兩種方式,一種是#錨點性的,第二種是和正常路徑一樣的,可是vue構建的應用是一個但頁面應用如何讓他像正常的多頁面應用一樣,是在不停的改變路徑呢?
  • 前端面試題——Vue
    前言前幾天整理了一些 html + css + JavaScript 常見的面試題(https://segmentfault.com/u/youdangde_5c8b208a23f95/articles),然後現在也是找了一些在 Vue 方面經常出現的面試題,留給自己查看消化,也分享給有需要的小夥伴。
  • 從頭開始學習 vue-router
    vue-router是Vue.js官方的路由插件,它和vue.js是深度集成的,適合用於構建單頁面應用。vue的單頁面應用是基於路由和組件的,路由用於設定訪問路徑,並將路徑和組件映射起來。傳統的頁面應用,是用一些超連結來實現頁面切換和跳轉的。在vue-router單頁面應用中,則是路徑之間的切換,也就是組件的切換。
  • 20 道必看的 Vue 面試題 | 原力計劃
    請列舉出3個 Vue 中常見的生命周期鉤子函數。beforeCreate:Vue 實例的掛載元素 $el 和數據對象 data 都為未定義,還未初始化。created:vue 實例的數據對象 data 有值了,$el 沒有。
  • vue-router 實現分析
    是 Vue.js 官方的路由庫,本著學習的目的,我對 vue-router 的源碼進行了閱讀和分析,分享出來給其他感興趣的同學做個參考吧。參考初步我們分別從不同的視角來看 vue-router。})源碼(https://github.com/vuejs/vue-router/blob/v2.2.1/src/history/hash.js#L21)這個動作是什麼時候執行的呢?是在 router.init()(源碼)中調用的,而 router.init() 則是在根組件創建時(源碼)調用的。
  • Vue面試中,經常會被問到的面試題/Vue知識點整理
    切記不要以為背了面試題,就萬事大吉了,最好是理解背後的原理,這樣面試的時候才能侃侃而談。不然,稍微有水平的面試官一看就能看出,是否有真才實學還是剛好背中了這道面試題。(都是一些基礎的vue面試題,大神不用浪費時間往下看)一、對於MVVM的理解?MVVM 是 Model-View-ViewModel 的縮寫。
  • Vue.js 框架作者公布 Vue 3 最新進展
    尤雨溪表示,由於在 Vue 3 上花費的大部分時間都投入到了設計和構建穩定的內核上,不過要讓整個框架處於 "ready" 狀態,不僅僅是內核的問題,還需要有兼容版本的支持庫 (Vue Router, Vuex, test
  • vue題
    (4)vue頁面級組件之間傳值1.使用vue-router通過跳轉連結帶參數傳參。2.使用本地緩存localStorge。3.使用vuex數據管理傳值。(5)說說vue的動態組件。多個組件通過同一個掛載點進行組件的切換,is的值是哪個組件的名稱,那麼頁面就會顯示哪個組件。
  • 20 道必看的 Vue 面試題|原力計劃
    請列舉出3個 Vue 中常見的生命周期鉤子函數。beforeCreate:Vue 實例的掛載元素 $el 和數據對象 data 都為未定義,還未初始化。created:vue 實例的數據對象 data 有值了,$el 沒有。
  • 35道常見的前端vue面試題
    面試題。$router.replace('/admin/noPermission') } } }) }14、vuex的使用?Vuex 是一個專為 Vue.js 應用程式開發的狀態管理模式。
  • Springboot Vue Login(從零開始實現Springboot+Vue登錄)
    /router' //引入路由配置 Vue.config.productionTip = false new Vue({ render: h => h(App), router, //使用路由配置}).$mount('#app')3.
  • 實戰教學使用 Vue3 重構 Vue2 項目(萬字好文推薦)
    本文來自於 神奇的程式設計師 的分享好文,點擊閱讀原文查看作者的掘金鍊接。
  • Vue入門10 vue+elementUI
    2、安裝依賴, 我們需要安裝vue-router、element-ui、sass-loader和node-sass四個插件cd hello-vuenpminstall vue-router --save-devnpm i element-ui -Snpm installcnpm install sass-loader node-sass --save-devnpm run dev
  • Vue.js以業務為中心的常見面試題
    在vue.js中的MVVM模式:vue.js是通過數據驅動的,vue.js實例化對象將dom和數據進行綁定,一旦綁定,dom和數據將保持同步,每當數據發生變化,dom也會隨著變化;ViewModel是Vue.js的核心,它是Vue.js的一個實例。
  • 如何用 Vue + Vuetify 快速建站?
    }到這裡就完成了最重要的兩部分基礎配置,接下來是如何用 Vue, Vuetify, Vuex, Vue-router, Vue-router-sync。Vuetify + Vuex + Vue-router + Vue-router-sync這裡側重講怎麼將這些都結合在一起使用,每個庫的細節還是要大家自己去看官方文檔,每個官方文檔連結附錄在最後。
  • 官方推薦:Vue之router路由最優美寫法
    Router from 'vue-router'import HelloWorld from '@/components/HelloWorld'Vue.use(Router)export default new Router({ routes: [ { path: '/', name: 'HelloWorld', component: HelloWorld
  • vue高級進階系列——用typescript玩轉vue和vuex
    本文轉載自【微信公眾號:趣談前端,ID:beautifulFront】經微信公眾號授權轉載,如需轉載與原文作者聯繫用過vue的朋友大概對vuex也不陌生,vuex的官方解釋是專為 Vue.js 應用程式開發的狀態管理模式。它採用集中式存儲管理應用的所有組件的狀態,並以相應的規則保證狀態以一種可預測的方式發生變化。
  • vue基本知識點總結——面試必備
    3、vue中的模板編譯原理答:模板指的就是template。如果我們傳了一個template,我們會把template轉換成一個render函數,然後通過render函數返回虛擬DOM,再把虛擬的DOM變成真正的DOM。4、 響應式數據的原理答:響應式就是當數據變化的時候,可以讓視圖也同步更新。
  • 手寫自己的Vue全家桶之kvue-router
    $router.push('/')5this.$router.push('/about')62.我們發現作為Vue全家桶之一的vue-router使用起來非常方便,幫助我們很好的處理了路由的跳轉的問題,那麼現在我們就來看看怎麼實現一個簡化版的vue-router,從而更加了解他的內部原理