2021年前端面試題-vue篇


1、多個組件之間如何拆分各自的state,每塊小的組件有自己的狀態,它們之間還有一些公共的狀態需要維護,如何思考這塊

(1)公共的數據部分可以提升至和他們最近的父組件,由父組件派發
(2)公共數據可以放到vuex中統一管理,各組件分別獲取

2、key主要是解決哪一類的問題,為什么不建議用索引index(重繪)

(1)key的作用主要是為了高效的更新虛擬DOM
(2)當以index為key值時,如果數組長度發生變化,會導致key的變化,比如刪除其中某一項,那么index會相應變化。
所以用index作為key和不加index沒有什么區別,都不能提升性能。一般用每項數據的唯一值來作為key,就算數組長度變化,也不會影響到這個key

3、介紹虛擬DOM

(1)讓我們不用直接操作DOM元素,只操作數據便可以重新渲染頁面
(2)虛擬dom
虛擬dom是為了解決瀏覽器性能問題而被設計出來的
當操作數據時,將改變的dom元素緩存起來,都計算完后再通過比較映射到真實的dom樹上
(3)diff算法比較新舊虛擬dom
如果節點類型相同,則比較數據,修改數據
如果節點不同,直接干掉節點及所有子節點,插入新的節點
如果給每個節點都設置了唯一的key,就可以准確的找到需要改變的內容,否則就會出現修改一個地方導致其他地方都改變的情況。
比如A-B-C-D, 我要插入新節點A-B-M-C-D,實際上改變的了C和D。但是設置了key,就可以准確的找到B C並插入

dom樹介紹直通車 :https://www.jianshu.com/p/af0b398602bc(個人覺得還不錯很容易懂)

4、介紹高階組件
5、如何解決props層級過深的問題

(1)使用vuex
(2)傳遞數據,使用以下接收(均不含被props接收的數據)
this.$attrs 接收屬性
this.$listeners 接收事件(不含被 .native 修飾符的事件)

6、vue中如何編寫可復用的組件

(1)以組件功能命名
(2)只負責ui的展示和交互動畫,不要在組件里與服務器打交道(獲取異步數據等)
(3)可復用組件不會因組件使用的位置、場景而變化。盡量減少對外部條件的依賴。

7、vue中對象更改檢測的注意事項

8、解決非工程化項目初始化頁面閃動問題

vue頁面在加載的時候閃爍花括號{{}},使用v-cloak,隱藏未編譯時候的標簽
//css樣式
[v-cloak] {
    display: none;
}

//html代碼
<div v-cloak>
   <ul>
      <li >{{ text }}</li>
   </ul>
</div>

9、十個常用的自定義過濾器

(1)去除空格
(2)時間轉換
(3)大小寫轉換
(4)字符串替換
(5)金額字符轉金額/數字轉金額字符
(6)保留兩位小數
(7)判斷字符串長度並省略
...
根據自己常用的來說

10、vue彈窗后如何禁止滾動條滾動?

methods : {
   //禁止滾動
   stop(){
        var mo=function(e){e.preventDefault();};
        document.body.style.overflow='hidden';
        document.addEventListener("touchmove",mo,false);//禁止頁面滑動
    },
    /***取消滑動限制***/
    move(){
        var mo=function(e){e.preventDefault();};
        document.body.style.overflow='';//出現滾動條
        document.removeEventListener("touchmove",mo,false);
    }

11、完整的 vue-router 導航解析流程
12、vue-router的幾種實例方法以及參數傳遞
13、vue-router如何定義嵌套路由?

 在這種場景下就需要用到嵌套路由

const router = new VueRouter({
  routes: [
    { path: '/testPage', 
    component: testPage, children: [ { path: '/sonPageA', component: sonPageA }, { path: '/sonPageB', component: sonPageB }, ] }, { // 其他和testPage平級的路由 } ] })

14、vue-router如何實現路由懶加載( 動態加載路由 )
15、vue-router路由的兩種模式

 vue-router中默認使用的是hash模式
(1)hash模式
http://localhost:8080/#/pageA
hash 的值為 #/pageA
改變hash,瀏覽器本身不會有任何請求服務器動作的,但是頁面狀態和url已經關聯起來了。
(2)history模式
http://localhost:8080/ 正常的而路徑,並沒有#

16、vuex的核心概念

state => 基本數據 
getters => 從基本數據派生的數據 
mutations => 修改數據,同步 
actions => 修改數據,異步 
modules => 模塊化Vuex

17、vue如何優化首屏加載速度?

(1)按需加載組件,不一次性加載所有組件
(2)減少打包js,如果打包后的js文件過大,會阻塞加載。如下:
A、在index.html文件中:
<script src="/static/common/js/vue.min.js"></script> B、在vue.config.js文件中配置: config.externals({ vue: 'Vue', }) 配置兩個步驟,不打包vue (3)關閉sourcemap,開啟壓縮代碼 vue.config.js文件中配置:productionSourceMap: false, (4)加個好看的loading效果

18、Vue.js 全局運行機制
19、響應式系統的基本原理
20、怎么注冊插件

使用全局方法Vue.use()
Vue.use( MyPlugin )

com.js中
import com from './xx.vue'
let test = {}
test.install = function(Vue,options){
    Vue.component(panel.name, panel)  // 注冊全局組件
}
export default com

main.js中
import com from './com.js'
Vue.use(com)

所有vue文件中都可以調用組件<com></com>

21、如何編譯template 模板?

compile編譯會有三個過程
(1)parse 根據正則進行字符串解析,得到指令、class、style等數據,形成語法樹(AST)
(2)對 parse 生成的 AST 進行靜態內容的優化,標記靜態節點(和數據沒有關系不需要每次都刷新的內容),標記靜態根節點。
(3)generate 生成 render
生成 render 的 generate 函數的輸入也是 AST,它遞歸了 AST 樹,為不同的 AST 節點創建了不同的內部調用方法,等待后面的調用。

compile編譯模板好文直通車: https://segmentfault.com/a/1190000012922342

22、diff算法

diff算法比較新舊虛擬dom
如果節點類型相同,則比較數據,修改數據
如果節點不同,直接干掉節點及所有子節點,插入新的節點
如果給每個節點都設置了唯一的key,就可以准確的找到需要改變的內容,否則就會出現修改一個地方導致其他地方都改變的情況。比如A-B-C-D, 我要插入新節點A-B-M-C-D,實際上改變的了C和D。但是設置了key,就可以准確的找到B C並插入

23、批量異步更新策略及 nextTick 原理?

(1)批量異步策略
Vue 在修改數據后,視圖不會立刻更新,而是等同一事件循環中的所有數據變化完成之后,再統一進行視圖更新。
(2)nextTick
在下一次DOM更新循環結束之后執行延遲回調

24、vue中proxy代理?

25、vue開發命令 npm run dev 輸入后的執行過程

(1)npm run dev是執行配置在package.json中的腳本
(2)調用了webpack配置文件
(3)配置文件中調用了main.js
(4)main.js用到了一個html元素#app,引用路由等開始vue的模板編譯

26、devDependencies和dependencies的區別

(1)devDependencies
用於本地開發,打包時生產環境不會打包這些依賴
(2)dependencies
開發環境能用,生產環境也能用。生產環境會被打包

27、依賴版本~和^的區別

(1)~
會匹配最近的小版本依賴包,比如~1.2.3會匹配所有1.2.x版本,但是不包括1.3.0
(2)^
會匹配最新的大版本依賴包,比如^1.2.3會匹配所有1.x.x的包,包括1.3.0,但是不包括2.0.0

28、插件機制

29、router的meta有什么用

在meta對象中可以設置一些狀態,通常設置標題或是否需要緩存。$route.meta.keepAlive/$route.meta.title
{
    path:"/test",
    name:"test",
    component:()=>import("@/components/test"),
    meta:{
        title:"測試頁面", //配置title
        keepAlive: true //是否緩存
    }
}

30、如果子組件直接修改父組件的值會發生什么?怎么解決,要修改多個數據怎么辦?

如果修改的不是引用類型的值時會報錯,告訴我們不能直接修改父組件的值。
(1)可以使用.sync修飾符來修改值,對一個 prop 進行“雙向綁定”。(注意.sync 修飾符的 v-bind 不能和表達式一起使用)
(2)父組件將改變值的方法傳遞給子組件

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM