主頁 > 前端設計 > 【前端領域高頻筆試面試】—— Vue相關

【前端領域高頻筆試面試】—— Vue相關

2021-11-09 08:22:14 前端設計

目錄

1.v-if 和 v-show 區別

2.vue常用的修飾符

3.vue中 key 值的作用

4.vue的單頁面應用(SPA)的優缺點

5.Vue的生命周期

6.Vue組件間的引數傳遞

7.為什么vue中data必須是一個函式?

8.對MVVM模式的理解

9. vue-router 有哪幾種導航鉤子?

10.路由嵌套

11.axios的特點有哪些

12.頁面重繪vuex被清空時的解決辦法

13.vue中的 ref 是什么

14.Promise物件是什么

15.什么是js的冒泡?Vue中如何阻止冒泡事件

16.指令周期

17.如何優化SPA應用的首屏加載速度慢的問題?

18.解釋一下vuex

19.說出至少4種vue當中的指令和它的用法?

20.vue.cli中怎樣使用自定義組件?有遇到過哪些問題嗎?

21.vuex有哪幾種屬性?

22.不用Vuex會帶來什么問題?

23.Vue前端實作購物車

24.methods、computed、watch的區別

25.簡述vuex的資料傳遞流程

26.組件中寫 name 選項有什么作用?

27.的作用是什么?

28.mint-ui是什么?怎么使用?說出至少三個組件使用方法

29.為什么避免 v-if 和 v-for 用在一起?

30.怎樣理解 Vue 的單向資料流?

31.Vue 的父組件和子組件生命周期鉤子函式執行順序?

32.在哪個生命周期內呼叫異步請求?

33.你有對 Vue 專案進行哪些優化?

34.虛擬 DOM 的優缺點

35.虛擬 DOM 實作原理

36.直接給一個陣列項賦值,Vue 能檢測到變化嗎?

37.在Vue生命周期什么階段才能訪問操作DOM?

38.Vue-router 原理

39.router-link 和 $router.push 實作跳轉的原理

40.promise 和 await/async 區別

41.v-if 和 v-show 的區別

42.什么是單頁應用?

43.Vue的權限管理

44.vue 的 watch 是否可以監聽陣列

45.前端的優化方案


1.v-if 和 v-show 區別

(1)手段:v-if是動態的向DOM樹內添加或者洗掉DOM元素;v-show是通過設定DOM元素的display樣式屬性控制顯隱;

(2)編譯程序:v-if切換有一個區域編譯/卸載的程序,切換程序中合適地銷毀和重建內部的事件監聽和子組件;v-show只是簡單的基于css切換;

(3)編譯條件:v-if是惰性的,如果初始條件為假則什么也不做,只有在條件第一次變為真時才開始區域編譯;v-show是在任何條件下都被編譯,然后被快取,而且DOM元素保留;

(4)性能消耗:v-if有更高的切換消耗;v-show有更高的初始渲染消耗;

(5)使用場景:v-if適合運營條件不大可能改變;v-show適合頻繁切換,

2.vue常用的修飾符

.prevent: 提交事件不再多載頁面;

.stop: 阻止單擊事件冒泡;

.self: 當事件發生在該元素本身而不是子元素的時候會觸發;

.capture: 事件偵聽,事件發生的時候會呼叫,

3.vue中 key 值的作用

當 Vue.js 用 v-for 正在更新已渲染過的元素串列時,默認用“就地復用”策略,如果資料項的順序被改變,Vue 將不會移動 DOM 元素來匹配資料項的順序,而是簡單復用此處每個元素,并且確保它在特定索引下顯示已被渲染過的每個元素,key的作用主要是為了高效的更新虛擬DOM,

4.vue的單頁面應用(SPA)的優缺點

優點:Vue是通過盡可能簡單的 API 實作回應的資料系結和組合的視圖組件,核心是一個回應的資料系結系統;組件化開發、輕量、簡潔、高效、快速、模塊友好,

缺點:不支持低版本的瀏覽器,最低只支持到IE9;不利于SEO的優化(如果要支持SEO,建議通過服務端來進行渲染組件);第一次加載首頁耗時相對長一些;不可以使用瀏覽器的導航按鈕需要自行實作前進、后退,

5.Vue的生命周期

(1)生命周期是什么?

Vue 實體有一個完整的生命周期,也就是從開始創建、初始化資料、編譯模版、掛載 Dom 渲染 更新 渲染 卸載等一系列程序,我們稱這是 Vue 的生命周期,

(2)生命周期的各個階段作用

beforeCreate(創建前)資料觀測和初始化事件還未開始;

created(創建后)完成資料觀測,屬性和方法的運算,初始化事件,$el屬性還未顯示出來;

beforeMount(掛載前)在掛載開始之前被呼叫,相關的render函式首次被呼叫,實體已完成以下的配置:編譯模板,把data里面的資料和模板生成html;注意此時還沒有掛載html到頁面上;

mounted(掛載后)el被新創建的 vm.$el 替換,并掛載到實體上去呼叫,實體已完成以下的配置:用上面編譯好的html內容替換el屬性指向的DOM物件,完成模板中的html渲染到html頁面中,此程序中進行ajax互動,

beforeUpdate(更新前) 在資料更新之前呼叫,發生在虛擬DOM重新渲染和打補丁之前,可以在該鉤子中進一步地更改狀態,不會觸發附加的重渲染程序;

updated(更新后) 在由于資料更改導致的虛擬DOM重新渲染和打補丁之后呼叫,呼叫時,組件DOM已經更新,所以可以執行依賴于DOM的操作,然而在大多數情況下,應該避免在此期間更改狀態,因為這可能會導致更新無限回圈,該鉤子在服務器端渲染期間不被呼叫;

beforeDestroy(銷毀前) 在實體銷毀之前呼叫,實體仍然完全可用;

destroyed(銷毀后) 在實體銷毀之后呼叫,呼叫后,所有的事件監聽器會被移除,所有的子實體也會被銷毀,該鉤子在服務器端渲染期間不被呼叫,

6.Vue組件間的引數傳遞

父子組件間傳參

父給子傳參(父:自定義屬性傳遞變數;子:用Props['父元素自定義屬性']接受)

子給父傳參(子:this.$emit(父元素自定義事件,傳遞的值) ;父:自定義事件用引數去接收傳遞來 的值)

兄弟間傳參(除了以下方式也可直接用Vuex)

通過給eventbus注冊事件,別的組件觸發事件,實作通信,

①創建一個eventbus物件,即創造一個vue物件,用作傳遞資訊,

②接收資訊的一方將事件通過vm.$on(“事件名”,事件處理函式)添加在eventbus物件上,

③發送資料的一方,通過vm.$emit(“事件名”,傳遞的資料)觸發事件,將資料傳遞,

路由傳參

a.通過params

//需要在router的path后跟上引數
{
   path: "/two",
   name: "two",
   component: two
}

//跳轉時
   this.$router.push({
      path: `/two` //直接把資料拼接在path后面
   })

//接收時
   this.$route.params

b.通過query

//跳轉時
this.$router.push({
    path: `/two`,
    query: { id: this.message, data: 456 }
});    

//接收時            
    this.$route.query

params 和 query 都是傳遞引數的,params不會在url上面出現,并且params引數是路由的一部分,是一定要存在的 , query是我們通常看到的url后面的跟在 ?后面的顯示引數,

7.為什么vue中data必須是一個函式?

物件為參考型別,當重用組件時,由于資料物件都指向同一個data物件,當在一個組件中修改data時,其他重用的組件中的data會同時被修改;而使用回傳物件的函式,由于每次回傳的都是一個新物件(Object的實體),參考地址不同,則不會出現這個問題,

8.對MVVM模式的理解

MVVM 是 Model-View-ViewModel 的縮寫;

Model 代表資料模型,也可以在Model中定義資料修改和操作的業務邏輯;

View 代表UI組件,負責將資料模型轉化成UI展現出來;

ViewModel 監聽模型資料的改變和控制視圖行為、處理用戶互動,簡單理解就是一個同步View 和 Model的物件,連接Model和View,

在MVVM架構下,View 和 Model 之間并沒有直接的聯系,而是通過ViewModel進行互動,Model 和 ViewModel 之間的互動是雙向的, 因此View 資料的變化會同步到Model中,而Model 資料的變化也會立即反應到View 上,

ViewModel 通過雙向資料系結把 View 層和 Model 層連接了起來,而View 和 Model 之間的同步作業完全是自動的,無需人為干涉,開發者只需關注業務邏輯,不需要手動操作DOM, 不需要關注資料狀態的同步問題,復雜的資料狀態維護完全由 MVVM 統一管理,

9. vue-router 有哪幾種導航鉤子?

全域導航鉤子

router.beforeEach(to, from, next),

router.beforeResolve(to, from, next),

router.afterEach(to, from ,next)

組件內鉤子

beforeRouteEnter,

beforeRouteUpdate,

beforeRouteLeave

單獨路由獨享組件beforeEnter

10.路由嵌套

路由嵌套會將其他組件渲染到該組件內,而不是進行整個頁面跳轉;

router-view本身就是將組件渲染到該位置,想要進行頁面跳轉,就要將頁面渲染到根組件,在起始配置路由時候寫:

var App = Vue.extend({ root });

router.start(App,'#app');

11.axios的特點有哪些

(1)axios是一個基于promise的HTTP庫,支持promise的所有API;

(2)它可以攔截請求和回應;

(3)它可以轉換請求資料和回應資料,并對回應回來的內容自動轉換為json型別的資料;

(4)它安全性更高,客戶端支持防御XSRF,

12.頁面重繪vuex被清空時的解決辦法

(1)localStorage 存盤到本地再回去;

(2)重新獲取介面獲取資料,

13.vue中的 ref 是什么

ref 被用來給元素或子組件注冊參考資訊,參考資訊將會注冊在父組件的 $refs 物件上;如果在普通的 DOM 元素上使用,參考指向的就是 DOM 元素;如果用在子組件上,參考就指向組件實體,

14.Promise物件是什么

Promise是異步編程的一種解決方案,它是一個容器,里面保存著某個未來才會結束的事件(通常是一個異步操作)的結果,從語法上說,Promise 是一個物件,可以獲取異步操作的訊息;Promise 提供統一的 API,各種異步操作都可以用同樣的方法進行處理;promise物件是一個建構式,用來生成Promise實體;

promise的特點是物件狀態不受外界影響且一旦狀態改變,就不會再變,任何時候都可以得到結果,Promise有三種狀態:

pending:初始狀態,不是成功或失敗狀態,

fulfilled:意味著操作成功完成,

rejected:意味著操作失敗,

優點是將異步操作以同步操作的流程表達出來,避免了層層嵌套的回呼函式,避免回呼地獄,Promise 物件提供統一的介面,使得控制異步操作更加容易,

缺點是無法取消 Promise,一旦新建它就會立即執行,無法中途取消,如果不設定回呼函式,Promise 內部拋出的錯誤,不會反應到外部, 當處于 Pending 狀態時,無法得知目前進展到哪一個階段(剛剛開始還是即將完成),

15.什么是js的冒泡?Vue中如何阻止冒泡事件

js冒泡概念:當父元素內多級子元素系結了同一個事件,js會依次從內往外或者從外往內執行每個元素的該事件,從而引發冒泡,

js解決冒泡:event.stopPropagation();

vue解決冒泡: 事件.stop,例如:@click.stop="" 、@mouseover.stop=""

16.指令周期

Bind

一次初始化呼叫
inserted被系結元素插入父節點呼叫
Update模板更新呼叫
unbind指令與元素解綁時呼叫
Vue.nextTick在dom更新后執行,一般用于dom操作
Vue.$nextTick一直到真實的dom渲染結束后執行

17.如何優化SPA應用的首屏加載速度慢的問題?

將公用的JS庫通過script標簽外部引入,減小app.bundel的大小,讓瀏覽器并行下載資源檔案,提高下載速度;

在配置路由時,頁面和組件使用懶加載的方式引入,進一步縮小 app.bundel 的體積,在呼叫某個組件時再加載對應的js檔案;

加一個首屏 loading 圖,提升用戶體驗;

18.解釋一下vuex

vuex是用來做狀態管理的,有五個常用屬性state, getter, actions, mutations, modules;

state是資料源,類似vue中的data,我們可以通過兩種方式來獲取它,mapStates, mapGerters,獲取state必須放到computed中,這樣才能保證state發生改變的時候該組件中用到state的地方都發生變化

getters:相當于計算屬性;

mutation:同步操作, 修改資料;

action:異步操作;

modules:模塊化

補充:如何獲取vuex的state物件中的屬性?

方法1:直接從store實體中取值 this.$store.state.屬性

方法2:利用vuex的mapState方法來獲取vuex的state物件中屬性;

//先在組件中引入vuex的mapState方法
import { mapState } from 'vuex'

//在computed中
        computed:{
            ...mapState({
                count:state => state.count   //使用ES6的箭頭函式來給count賦值
            })

        }
//在computed中也可寫成陣列格式
        computed:
            ...mapState(['count'])
        }

19.說出至少4種vue當中的指令和它的用法?

v-if

判斷是否隱藏;
v-for連續生成一組結構相同,但是內容不同的HTML元素;
v-bind元素的屬性值可能隨程式自動變化,用v-bind系結;
v-model實作雙向系結;
v-on為元素系結事件,可簡寫為@;
v-html系結一段HTML代碼片段到頁面上;

v-once

一個元素的內容,只會在首次加載時系結一次,之后幾乎不會改變時,都用v-once標記;

v-pre

正文中包含了不希望被vue編譯的{{ }}時,采用v-pre保護,

補充:v-for為什么必須加:key

a.為每個元素添加唯一標識;

b.避免重建整個串列;

c.提高修改的效率,

20.vue.cli中怎樣使用自定義組件?有遇到過哪些問題嗎?

第一步:在components目錄新建組件檔案(smithButton.vue),在組件檔案中的script代碼中一定要用 export default 將組件匯出;

第二步:在需要用的頁面(組件)中匯入:import smithButton from ‘../components/smithButton.vue’;

第三步:注入到vue的子組件的components屬性上面,components:{smithButton};

第四步:在template視圖view中使用,<smith-button> </smith-button>

問題:smithButton命名,使用的時候則smith-button(HTML不認識大寫字母),

21.vuex有哪幾種屬性?

有五種,分別是 State、Getter、Mutation 、Action、Module;

state為單一狀態樹,在state中需要定義我們所需要管理的陣列、物件、字串等等,只有在這里定義了,在vue.js的組件中才能獲取定義物件的狀態;

getter類似vue.js的計算屬性,當我們需要從store的state中派生出一些狀態時,就需要使用getter,getter會接收state作為第一個引數,而且getter的回傳值會根據它的依賴被快取起來,只有getter中的依賴值(state中的某個需要派生狀態的值)發生改變的時候才會被重新計算;

更改store中state狀態的唯一方法就是提交mutation,每個mutation都有一個字串型別的事件型別和一個回呼函式,我們需要改變state的值就要在回呼函式中改變,要執行這個回呼函式,就需要執行一個相應的呼叫方法:store.commit;

action可以提交mutation,在action中可以執行store.commit,而且action中可以有任何的異步操作,在頁面中如果我們要用這個action,就需要執行store.dispatch;

當state中很復雜臃腫的時候,module可以將store分割成模塊,每個模塊中擁有自己的state、mutation、action和getter,

22.不用Vuex會帶來什么問題?

(1)可維護性會下降,要想修改資料,得維護三個地方;

(2)可讀性會下降,因為一個組件里的資料,看不出來是從哪來;

(3)增加耦合,大量的上傳派發,會讓耦合性大大的增加,本來Vue用Component就是為了減少耦合,現在這么用,和組件化的初衷相背,

23.Vue前端實作購物車

利用vuex + vant 實作購物車功能,概括有以下步驟:

(1)mock模擬資料;

(2)利用veux操作商品的選中狀態;

(3)全選與取消全選;

(4)動態reduce計算價格;

(5)結算取出商品id;

(6)利用manageStatus判斷管理狀態,管理洗掉商品;

(7)未洗掉商品的狀態存盤,

24.methods、computed、watch的區別

methods是個方法,執行的時候需要事件進行觸發;

computed是一個計算屬性,是實時回應的,只要data中的屬性發生了變化那么就會觸發computed,計算屬性是基于屬性的依賴進行快取的,methods呼叫的時候需要加(),而computed呼叫的時候不需要加();

watch用來監聽屬性的變化,當值發生變化的時候來執行特定的函式,watch監聽屬性的時候會有2個引數newVal和oldVal一個新值一個舊值,

25.簡述vuex的資料傳遞流程

當組件進行資料修改的時候我們需要呼叫dispatch來觸發actions里面的方法,actions里面的每個方法中都會 有一個commit方法,當方法執行的時候會通過commit來觸發mutations里面的方法進行資料的修改,mutations里面的每個函式都會有一個state引數,這樣就可以在mutations里面進行state的資料修改 ,當資料修改完畢后,會傳導給頁面,頁面的資料也會發生改變,

26.組件中寫 name 選項有什么作用?

(1)專案使用 keep-alive 時,可搭配組件 name 進行快取過濾;

(2)DOM 做遞回組件時需要呼叫自身 name;

(3)vue-devtools 除錯工具里顯示的組見名稱是由vue中組件name決定的,

27.<keep-alive></keep-alive>的作用是什么?

<keep-alive></keep-alive> 包裹動態組件時,會快取不活動的組件實體,主要用于保留組件狀態或避免重新渲染,

28.mint-ui是什么?怎么使用?說出至少三個組件使用方法

基于vue的前端組件庫,先npm安裝,然后import引入樣式和js,vue.use(mintUi)全域引入,在單個組件區域引入:import {Toast} from ‘mint-ui’,

組件一:Toast(‘登錄成功’);

組件二:mint-header;

組件三:mint-swiper

29.為什么避免 v-if 和 v-for 用在一起?

當 Vue 處理指令時,v-for 比 v-if 具有更高的優先級,通過v-if 移動到容器元素,不會再重復遍歷串列中的每個值,取而代之的是,我們只檢查它一次,且不會在 v-if 為否的時候運算 v-for,

30.怎樣理解 Vue 的單向資料流?

所有的 prop 都使得其父子 prop 之間形成了一個單向下行系結:父級 prop 的更新會向下流動到子組件中,但是反過來則不行;

這樣會防止從子組件意外改變父級組件的狀態,從而導致應用的資料流向難以理解;

除此之外,每次父級組件發生更新時,子組件中所有的 prop 都將會重繪為最新的值,

所以不應該在一個子組件內部改變 prop,如果你這樣做了,Vue 會在瀏覽器的控制臺中發出警告;

子組件想修改時,只能通過 $emit 派發一個自定義事件,父組件接收到后,由父組件來修改,

31.Vue 的父組件和子組件生命周期鉤子函式執行順序?

Vue 的父組件和子組件生命周期鉤子函式執行順序可以歸類為以下 4 部分:

加載渲染程序

父 beforeCreate --> 父 created --> 父 beforeMount --> 子 beforeCreate --> 子 created --> 子 beforeMount --> 子 mounted --> 父 mounted

子組件更新程序

父 beforeUpdate --> 子 beforeUpdate --> 子 updated --> 父 updated

父組件更新程序

父 beforeUpdate --> 父 updated

銷毀程序

父 beforeDestroy --> 子 beforeDestroy --> 子 destroyed --> 父 destroyed

32.在哪個生命周期內呼叫異步請求?

可以在鉤子函式 created、beforeMount、mounted 中進行呼叫,因為在這三個鉤子函式中,data 已經創建,可以將服務端端回傳的資料進行賦值,但是更推薦在 created 鉤子函式中呼叫異步請求,因為在 created 鉤子函式中呼叫異步請求有以下優點:

(1)能更快獲取到服務端資料,減少頁面 loading 時間;

(2)ssr 不支持 beforeMount 、mounted 鉤子函式,所以放在 created 中有助于一致性;

33.你有對 Vue 專案進行哪些優化?

(1)代碼層面的優化

v-if 和 v-show 區分使用場景;

computed 和 watch 區分使用場景;

v-for 遍歷必須為 item 添加 key,且避免同時使用 v-if;

長串列性能優化;

事件的銷毀;

圖片資源懶加載;

路由懶加載;

第三方插件的按需引入;

優化無限串列性能;

服務端渲染 SSR or 預渲染;

(2)Webpack 層面的優化

Webpack 對圖片進行壓縮;

減少 ES6 轉為 ES5 的冗余代碼;

提取公共代碼;

模板預編譯;

提取組件的 CSS;

優化 SourceMap;

構建結果輸出分析;

Vue 專案的編譯優化;

(3)基礎的 Web 技術的優化

開啟 gzip 壓縮;

瀏覽器快取;

CDN 的使用;

使用 Chrome Performance 查找性能瓶頸;

34.虛擬 DOM 的優缺點

優點:

保證性能下限: 框架的虛擬 DOM 需要適配任何上層 API 可能產生的操作,它的一些 DOM 操作的實作必須是普適的,所以它的性能并不是最優的;但是比起粗暴的 DOM 操作性能要好很多,因此框架的虛擬 DOM 至少可以保證在不需要手動優化的情況下,依然可以提供還不錯的性能,即保證性能的下限;

無需手動操作 DOM: 我們不再需要手動去操作 DOM,只需要寫好 View-Model 的代碼邏輯,框架會根據虛擬 DOM 和 資料雙向系結,幫我們以可預期的方式更新視圖,極大提高我們的開發效率;

跨平臺: 虛擬 DOM 本質上是 JavaScript 物件,而 DOM 與平臺強相關,相比之下虛擬 DOM 可以進行更方便地跨平臺操作,例如服務器渲染、weex 開發等等,

缺點:

無法進行極致優化: 雖然虛擬 DOM + 合理的優化,足以應對絕大部分應用的性能需求,但在一些性能要求極高的應用中虛擬 DOM 無法進行針對性的極致優化,

35.虛擬 DOM 實作原理

虛擬 DOM 的實作原理主要包括以下 3 部分:

(1)用 JavaScript 物件模擬真實 DOM 樹,對真實 DOM 進行抽象;

(2)diff 演算法 — 比較兩棵虛擬 DOM 樹的差異;

(3)pach 演算法 — 將兩個虛擬 DOM 物件的差異應用到真正的 DOM 樹,

36.直接給一個陣列項賦值,Vue 能檢測到變化嗎?

由于 JavaScript 的限制,Vue 不能檢測到以下陣列的變動:

(1)利用索引直接設定一個陣列項時,例如:vm.items[indexOfItem] = newValue

(2)當你修改陣列的長度時,例如:vm.items.length = newLength

為了解決第一個問題,Vue 提供了以下操作方法:

// Vue.set
Vue.set(vm.items, indexOfItem, newValue)

// vm.$set,Vue.set的一個別名
vm.$set(vm.items, indexOfItem, newValue)

// Array.prototype.splice
vm.items.splice(indexOfItem, 1, newValue)

為了解決第二個問題,Vue 提供了以下操作方法:

// Array.prototype.splice
vm.items.splice(newLength)

37.在Vue生命周期什么階段才能訪問操作DOM?

在鉤子函式 mounted 被呼叫前,Vue 已經將編譯好的模板掛載到頁面上,所以在 mounted 中可以訪問操作 DOM,

38.Vue-router 原理

vue-router通過hash與history兩種方式實作前端路由;更新視圖但不重新請求頁面是前端路由原理的核心之一,目前在瀏覽器環境中這一功能的實作主要有兩種方式:

(1)hash:利用 URL 中的 hash. 形式上會多個# ;如下,

http://localhost:8080/#/login

hash("#") 的作用是加載 URL 中指示網頁中的位置; # 本身以及它后面的字符稱之為 hash,可通過 window.location.hash 獲取;

hash 雖然出現在 url 中,但不會被包括在 http 請求中,它是用來指導瀏覽器動作的,對服務器端完全無用,因此改變 hash 不會重新加載頁面, 每一次改變 hash(window.localtion.hash)都會在瀏覽器訪問歷史中增加一個記錄, 利用 hash 的以上特點,就可以來實作前端路由"更新視圖但不重新請求頁面"的功能了,

(2)history:html5 中新增的方法,形式上比 hash更好看;如下,

http://localhost:8080/login

History interface 是瀏覽器歷史記錄堆疊提供的介面,通過back()、forward()、go()等方法,可以讀取瀏覽器歷史記錄堆疊的資訊,進行各種跳轉操作,

從 HTML5開始,History interface 提供了2個新的方法:pushState()、replaceState() 使得我們 可以對瀏覽器歷史記錄堆疊進行修改,這2個方法有個共同的特點:當呼叫他們修改瀏覽器歷史堆疊后,雖然當前url改變了,但瀏覽器不會立即發送請求該url,這就為單頁應用前端路由,更新視圖但不重新請求頁面提供了基礎,

39.router-link 和 $router.push 實作跳轉的原理

router-link

默認會渲染為 a 標簽,可以通過 tag 屬性修改為其他標簽,自動為 a 標簽添加 click 事件,然后執行 $router.push() 實作跳轉;

$router.push

根據路由配置的 mode 確定使用 HTML5History 還是 HashHistory 實作跳轉;

HTML5History:呼叫 window.history.pushState() 跳轉;

HashHistory:呼叫 HashHistory.push() 跳轉,

40.promise 和 await/async 區別

區別主要在于按順序呼叫多個異步函式時的寫法和報錯獲取,

Promise方式

ajax().then(func1).then(func2).then(func3).then(func4)

await/async方式

async function demo(){
 await res = ajax();
 await res = func1(res);
 await res = func2(res);
 await res = func3(res);
 await res = func4(res);
}

當遇到多個異步函式時 Promise 方式需要很多 .then,這樣會導致代碼不易讀且結構復雜;await/async 方式讓異步代碼的格式與同步代碼一樣更易讀,

報錯讀取 Promise 使用 .catch 抓取報錯,await/async 使用 try...catch... 方式抓取報錯,

41.v-if 和 v-show 的區別

v-if

通過洗掉DOM元素實作元素的隱藏;

惰性:只有條件為真時, 才會加載元素到DOM;

v-show

通過設定元素的css樣式 display:none 實作元素的隱藏, 不操作DOM;

非惰性:不管條件真與假, 都會加載元素到 DOM;

v-if 的開銷比 v-show 更大,v-show 有更高的初始化渲染消耗;

一個元素頻繁進行隱藏和顯示操作時使用 v-show 更加合適;一個元素不頻繁進行隱藏和顯示操作時使用 v-if 更合適,

42.什么是單頁應用?

單頁應用的全稱是 Single Page Application,簡稱 SPA,通過路由的變更,區域切換網頁內容取代整個頁面的重繪操作;

三大框架 React、Vue、Angular 均采用單頁應用模式;

優點:用戶操作體驗好,用戶不用重繪頁面;區域更新, 對服務器壓力小;良好的前后端分離,后端不再負責頁面渲染和輸出作業,

缺點:首次加載耗時長, 速度慢;SEO不友好, 需要采用 prerender 服務進行完善,

43.Vue的權限管理

整體思路:

后端回傳用戶權限,前端根據用戶權限處理得到左側選單;所有路由在前端定義好,根據后端回傳的用戶權限篩 選出需要掛載的路由,然后使用 addRoutes 動態掛載路由,

具體思路:

(1)路由定義,分為初始路由和動態路由,一般來說初始路由只有 login,其他路由都掛載在 home 路由之下 需要動態掛載;

(2)用戶登錄,登錄成功之后得到 token,保存在 sessionStorage,跳轉到 home,此時會進入路由攔截根 據 token 獲取用戶權限串列;

(3)全域路由攔截,根據當前用戶有沒有 token 和 權限串列進行相應的判斷和跳轉,當沒有 token 時跳到 login,當有 token 而沒有權限串列時去發請求獲取權限等等邏輯;

(4)使用 Vuex 管理路由表, 根據 Vuex 動態渲染側邊欄組件,

44.vue 的 watch 是否可以監聽陣列

能監聽

陣列的元素增刪:例如 push 和 splice 操作;

陣列元素內部的變化:必須手動開啟 deep:true 配置, 才能監聽到,

不能監聽

陣列中已有值的替換,

45.前端的優化方案

(1)盡量減少閉包的使用;

(2)進行 js 和 css 檔案的合并,減少http請求次數,進行可能講檔案壓縮,減少請求大小;

(3)使用字體圖示和svg圖示,代替傳統的png格式;

(4)減少DOM操作,主要減少DOM的重繪和重排;

(5)采用圖片懶加載,加快頁面啟動速度,加載頁面時先不加載圖片,使用一張背景圖占位,等頁面加載完畢后再加載圖片;

(6)盡可能使用事件委托來處理系結操作,減少DOM的頻繁操作(事件委托:為父元素添加事件, 利用冒泡機制,讓父元素處理所有子元素的事件);

(7)減少 css 運算式的使用;

(8)減少 css 標簽選擇器的使用;

(9)頁面資料獲取方式采用異步和延遲分批加載,

轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/353432.html

標籤:其他

上一篇:JavaScript demo合集(一)

下一篇:js原生 JavaScript輪播圖【漸變淡入淡出】效果實作(附代碼)

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • vue移動端上拉加載

    可能做得過于簡單或者比較low,請各位大佬留情,一起探討技術 ......

    uj5u.com 2020-09-10 04:38:07 more
  • 優美網站首頁,頂部多層導航

    一個個人用的瀏覽器首頁,可以把一下常用的網站放在這里,平常打開會比較方便。 第一步,HTML代碼 <script src=https://www.cnblogs.com/szharf/p/"js/jquery-3.4.1.min.js"></script> <div id="navigate"> <ul> <li class="labels labels_1"> ......

    uj5u.com 2020-09-10 04:38:47 more
  • 頁面為要加<!DOCTYPE html>

    最近因為寫一個js函式,需要用到$(window).height(); 由于手寫demo的時候,過于自信,其實對前端方面的認識也不夠體系,用文本檔案直接敲出來的html代碼,第一行沒有加上<!DOCTYPE html> 導致了$(window).height();的結果直接是整個document的高 ......

    uj5u.com 2020-09-10 04:38:52 more
  • WordPress網站程式手動升級要做好資料備份

    WordPress博客網站程式在進行升級前,必須要做好網站資料的備份,這個問題良家佐言是遇見過的;在剛開始接觸WordPress博客程式的時候,因為升級問題和博客網站的修改的一些嘗試,良家佐言是吃盡了苦頭。因為購買的是西部數碼的空間和域名,每當佐言把自己的WordPress博客網站搞到一塌糊涂的時候 ......

    uj5u.com 2020-09-10 04:39:30 more
  • WordPress程式不能升級為5.4.2版本的原因

    WordPress是一款個人博客系統,受到英文博客愛好者和中文博客愛好者的追捧,并逐步演化成一款內容管理系統軟體;它是使用PHP語言和MySQL資料庫開發的,用戶可以在支持PHP和MySQL資料庫的服務器上使用自己的博客。每一次WordPress程式的更新,就會牽動無數WordPress愛好者的心, ......

    uj5u.com 2020-09-10 04:39:49 more
  • 使用CSS3的偽元素進行首字母下沉和首行改變樣式

    網頁中常見的一種效果,首字改變樣式或者首行改變樣式,效果如下圖。 代碼: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, ......

    uj5u.com 2020-09-10 04:40:09 more
  • 關于a標簽的講解

    什么是a標簽? <a> 標簽定義超鏈接,用于從一個頁面鏈接到另一個頁面。 <a> 元素最重要的屬性是 href 屬性,它指定鏈接的目標。 a標簽的語法格式:<a href=https://www.cnblogs.com/summerxbc/p/"指定要跳轉的目標界面的鏈接">需要展示給用戶看見的內容</a> a標簽 在所有瀏覽器中,鏈接的默認外觀如下: 未被訪問的鏈接帶 ......

    uj5u.com 2020-09-10 04:40:11 more
  • 前端輪播圖

    在需要輪播的頁面是引入swiper.min.js和swiper.min.css swiper.min.js地址: 鏈接:https://pan.baidu.com/s/15Uh516YHa4CV3X-RyjEIWw 提取碼:4aks swiper.min.css地址 鏈接:https://pan.b ......

    uj5u.com 2020-09-10 04:40:13 more
  • 如何設定html中的背景圖片(全屏顯示,且不拉伸)

    1 <style>2 body{background-image:url(https://uploadbeta.com/api/pictures/random/?key=BingEverydayWallpaperPicture); 3 background-size:cover;background ......

    uj5u.com 2020-09-10 04:40:16 more
  • Java學習——HTML詳解(上)

    HTML詳解 初識HTML Hyper Text Markup Language(超文本標記語言) 1 <!--DOCTYPE:告訴瀏覽器我們要使用什么規范--> 2 <!DOCTYPE html> 3 <html lang="en"> 4 <head> 5 <!--meta 描述性的標簽,描述一些 ......

    uj5u.com 2020-09-10 04:40:33 more
最新发布
  • 我的第一個NPM包:panghu-planebattle-esm(胖虎飛機大戰)使用說明

    好家伙,我的包終于開發完啦 歡迎使用胖虎的飛機大戰包!! 為你的主頁添加色彩 這是一個有趣的網頁小游戲包,使用canvas和js開發 使用ES6模塊化開發 效果圖如下: (覺得圖片太sb的可以自己改) 代碼已開源!! Git: https://gitee.com/tang-and-han-dynas ......

    uj5u.com 2023-04-20 07:59:23 more
  • 生產事故-走近科學之消失的JWT

    入職多年,面對生產環境,盡管都是小心翼翼,慎之又慎,還是難免捅出簍子。輕則滿頭大汗,面紅耳赤。重則系統停擺,損失資金。每一個生產事故的背后,都是寶貴的經驗和教訓,都是專案成員的血淚史。為了更好地防范和遏制今后的各類事故,特開此專題,長期更新和記錄大大小小的各類事故。有些是親身經歷,有些是經人耳傳口授 ......

    uj5u.com 2023-04-18 07:55:04 more
  • 記錄--Canvas實作打飛字游戲

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 打開游戲界面,看到一個畫面簡潔、卻又富有挑戰性的游戲。螢屏上,有一個白色的矩形框,里面不斷下落著各種單詞,而我需要迅速地輸入這些單詞。如果我輸入的單詞與螢屏上的單詞匹配,那么我就可以獲得得分;如果我輸入的單詞錯誤或者時間過長,那么我就會輸 ......

    uj5u.com 2023-04-04 08:35:30 more
  • 了解 HTTP 看這一篇就夠

    在學習網路之前,了解它的歷史能夠幫助我們明白為何它會發展為如今這個樣子,引發探究網路的興趣。下面的這張圖片就展示了“互聯網”誕生至今的發展歷程。 ......

    uj5u.com 2023-03-16 11:00:15 more
  • 藍牙-低功耗中心設備

    //11.開啟藍牙配接器 openBluetoothAdapter //21.開始搜索藍牙設備 startBluetoothDevicesDiscovery //31.開啟監聽搜索藍牙設備 onBluetoothDeviceFound //30.停止監聽搜索藍牙設備 offBluetoothDevi ......

    uj5u.com 2023-03-15 09:06:45 more
  • canvas畫板(滑鼠和觸摸)

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>canves</title> <style> #canvas { cursor:url(../images/pen.png),crosshair; } #canvasdiv{ bo ......

    uj5u.com 2023-02-15 08:56:31 more
  • 手機端H5 實作自定義拍照界面

    手機端 H5 實作自定義拍照界面也可以使用 MediaDevices API 和 <video> 標簽來實作,和在桌面端做法基本一致。 首先,使用 MediaDevices.getUserMedia() 方法獲取攝像頭媒體流,并將其傳遞給 <video> 標簽進行渲染。 接著,使用 HTML 的 < ......

    uj5u.com 2023-01-12 07:58:22 more
  • 記錄--短視頻滑動播放在 H5 下的實作

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 短視頻已經無數不在了,但是主體還是使用 app 來承載的。本文講述 H5 如何實作 app 的視頻滑動體驗。 無聲勝有聲,一圖頂百辯,且看下圖: 網址鏈接(需在微信或者手Q中瀏覽) 從上圖可以看到,我們主要實作的功能也是本文要講解的有: ......

    uj5u.com 2023-01-04 07:29:05 more
  • 一文讀懂 HTTP/1 HTTP/2 HTTP/3

    從 1989 年萬維網(www)誕生,HTTP(HyperText Transfer Protocol)經歷了眾多版本迭代,WebSocket 也在期間萌芽。1991 年 HTTP0.9 被發明。1996 年出現了 HTTP1.0。2015 年 HTTP2 正式發布。2020 年 HTTP3 或能正... ......

    uj5u.com 2022-12-24 06:56:02 more
  • 【HTML基礎篇002】HTML之form表單超詳解

    ??一、form表單是什么

    ??二、form表單的屬性

    ??三、input中的各種Type屬性值

    ??四、標簽 ......

    uj5u.com 2022-12-18 07:17:06 more