1. 程式人生 > 遊戲 >《漫威暗夜之子》深度介紹視訊 內含全新實機演示內容

《漫威暗夜之子》深度介紹視訊 內含全新實機演示內容

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)父元件將改變值的方法傳遞給子元件
做最好的自己,不努力永遠看不到自己的光環。別在該努力的年紀享樂,就不會在該享樂的年紀吃苦!