Vue 面试题 (全)
vue用的什么web模板引擎?
jade模板,后來由于商標(biāo)原因改成了pugv-model的原理?
數(shù)據(jù)雙向綁定的指令,同步控件輸入值到data屬性 更新data綁定屬性,更新控件的值. view層和model層數(shù)據(jù)交互 view層輸入值影響data屬性值,data屬性值改變會更新view層 初始化vue實例會遞歸遍歷data的每一個屬性. 通過object.defineProperty來監(jiān)聽每一個屬性的get,set方法, 一旦某個屬性重新賦值,則能監(jiān)聽到變化來操作相應(yīng)的頁面控制 編譯模板文件,為控件的v-model綁定input事件computed和data中的數(shù)據(jù)能同名嗎?
不可以,重名會導(dǎo)致初始化vm時計算屬性綁定后覆蓋掉data中的同名數(shù)據(jù)data的數(shù)據(jù)和methods能同名嗎?
不可以,vue會把methods和data的東西,代理到vue生成對象中,會覆蓋怎么給vue定義全局的方法?
1.通過prototype,這個非常方便 Vue.prototype[name]=method Vue.prototype.name.=method 2.通過插件Vue.use(plugin); 3.通過mixin,Vue.mixin(mixins);解決vue2.0 v-html中使用過濾器
//全局方法(推薦) Vue.prototype.msg = function(msg){return msg.replace("\n","") } //computed方法 computed:{content:function(msg){return msg.replace("\n","")} } //$options.filters(推薦) filters:{msg:function(msg){return msg.replace(/\n/g,"")} }, data:{content:“XXXX” }解決vue打包后靜態(tài)資源圖片
靜態(tài)資源存放位置放在src目錄下解決vue動態(tài)設(shè)置img的src不生效
動態(tài)添加src被當(dāng)做靜態(tài)資源處理了,加上require。 <img :src="require('../assets/images/xxx.png')" />vue對搜索引擎做SEO優(yōu)化
合適的HTML標(biāo)簽和屬性 合理的HTTP狀態(tài)碼 Sitemap & robot.txt 合適的渲染方案 ssr 即單頁面后臺渲染 vue-meta-info與prerender-spa-plugin預(yù)渲染 nuxt.js phantomjskeep-alive有關(guān)的生命周期
1.activated: 頁面第一次進(jìn)入,觸發(fā)順序created->mounted->activated2.deactivated:頁面退出觸發(fā)deactivated,當(dāng)再次前進(jìn)/后退的時候只觸發(fā)activatedvue的優(yōu)缺點
構(gòu)建數(shù)據(jù)驅(qū)動,通過API提供高效的數(shù)據(jù)綁定和靈活的組件。Vue的特性:輕量級的框架/雙向數(shù)據(jù)綁定/指令/插件化優(yōu)點:1. 簡單:文檔清晰2. 快速:異步更新DOM。3. 組合:用解耦的復(fù)用的組件應(yīng)用程序。4. 緊湊:~18kb min+gzip,無依賴。5. 強(qiáng)大:表達(dá)式無需聲明依賴的可推導(dǎo)屬性6. 模塊:通過NPM、Bower或Duo 安裝缺點:1.不支持IE8:vue2.0兼容IE哪個版本
不支持ie8及以下,部分兼容IE9 ,完全兼容10以上vue開發(fā)一個todo小應(yīng)用的思路
結(jié)構(gòu): 輸入部分( input )和輸出部分( ul ) 邏輯:用戶輸入之后,通過事件觸發(fā)拿到用戶輸入的數(shù)據(jù)存起來, 將用戶數(shù)據(jù)集合通過 v-for 渲染到頁面上 當(dāng)用戶點擊清單項,通過事件觸發(fā)移出對應(yīng)事件vue推薦的風(fēng)格指南
重要 1.vue組件名稱推薦由多個單詞構(gòu)成 2.組件data數(shù)據(jù)推薦用函數(shù)return 3.props推薦更加詳細(xì)的定義type/default/require 4.v-for推薦有配套的:key 5.v-for和v-if避免同在一起 6.vue組件樣式推薦設(shè)置作用域 7.自定義的私有屬性,推薦$_ + 命名空間作為前綴一般 1.能用.vue寫的組件,盡量不同vue.component 2.vue組件命名,用PascalCase或者短橫線,風(fēng)格保持統(tǒng)一。 3.基礎(chǔ)組件命名,以Base前綴開頭,以顯示其通用性 4.單例組件命名,以The前綴開頭,以顯示其獨特性 5.緊密耦合的組件命名。比如緊密耦合的父子組件,子組件以父組件名稱為前綴 6.組件命名單詞的順序。先名詞后形容詞 7.自閉合組件的寫法。如果有編譯器的vue用自閉合寫法,以顯示沒有傳入屬性 8.不同模板中vue命名大小寫。如果有編譯器的話PascalCase,否則用短橫線命名 9.JS/JSX中始終用PascalCase組件命名 10.組件命名單詞應(yīng)該是完整的單詞 11.props的命名方式,最自然的方法。JS里用駝峰命名,html里用短橫線 12.vue組件有多個屬性,分多行來寫更加清晰易讀 13.模板里復(fù)雜邏輯用計算屬性或者method 14.復(fù)雜的計算屬性或者method,拆分成多個 15.html模板的屬性推薦用雙引號的 16.指令縮寫要么不寫,要么都用縮寫vue1.x和2.x的區(qū)別
作用域區(qū)別1.x 隨意的定義作用域2.x 不允許body 或者h(yuǎn)tml 元素 json1.x json 如果想顯示 那么就得使用過濾器 json2.x 不用過濾器了 直接可以看1.x 顯示 {{msg | json}}2.x 顯示 {{ msg}} 便可直接顯示對象 生命周期1.x created 實例已經(jīng)創(chuàng)建beforeCompile 在編程之前compiled 編程之后ready 實例已經(jīng)插入到文檔之中beforeDetroy 在銷毀之前destroyed 銷毀之后2.xbeforeCreate 剛剛創(chuàng)建這個實例 屬性還沒有綁定created 創(chuàng)建完畢 屬性已經(jīng)綁定好了beforeMount 模版在渲染之前mounted //ready 渲染之后beforeUpdate //數(shù)據(jù)更新之前updated //數(shù)據(jù)更新之后beforeDestroy 實例化銷毀之前destroyed 實例化銷毀之后 過濾器2.x取消了所有的默認(rèn)的過濾器 封裝的方式?jīng)]有區(qū)別1.x 傳參 uppercase "1" "2"2.x uppercase('1','2')vue中key的原理
是給每一個vnode的唯一id, 是diff的一種優(yōu)化策略, 可以根據(jù)key更準(zhǔn)確更快找到對應(yīng)的vnode節(jié)點不用key,Vue會采用就地復(fù)地原則:最小化element的移動, 并且會嘗試盡最大程度在同適當(dāng)?shù)牡胤綄ο嗤愋偷膃lement, 做patch或者reuse。使用key,Vue會根據(jù)keys的順序記錄element, 曾經(jīng)擁有了key的element不再出現(xiàn)的話,會被直接remove/destoryed 當(dāng)擁有新值的render作為key時,擁有了新key的Comp出現(xiàn)了, 那么舊key Comp會被移除,新key Comp觸發(fā)渲染vue中重置data
this.$data獲取當(dāng)前的data this.$options.data獲取組件初始狀態(tài)的data. Object.assign(this.$data, this.$options.data()),重置data。 重置某個屬性:this.form = this.$options.data().formvue渲染時保留模板中的HTML注釋
<template comments>... </template>Vue.observable是什么
Vue.observable是vue2.6版本新增的,可以實現(xiàn)簡單的跨組件數(shù)據(jù)狀態(tài)共享 const state = Vue.observable({count:0}) const demo = {render(h){return h ({'button',{on:{click:()=>{state.count++})},count is :$(state.count})} }style加scoped屬性的用途和原理
防止全局同名CSS污染, 在標(biāo)簽加上v-data-something屬性,再在選擇器時加上對應(yīng)[v-data-something]vue3.0新功能
一.性能快 diff算法的優(yōu)化/render階段的靜態(tài)提升/事件偵聽緩存二.按需編譯,體積比更小(Tree shaking) import { computed, watch, nextTick } from "vue"; ES6 模塊系統(tǒng)import/export三.Compostion組合API四.更好的TS支持五.自定義渲染API六.更先進(jìn)的組件 1.Fragment組件:Fragment節(jié)點是虛擬的,不會DOM樹中呈現(xiàn) // vue2是不允許這樣寫的,組件必須有一個跟節(jié)點,現(xiàn)在vue將為我們創(chuàng)建一個虛擬的Fragment節(jié)點。 <template><div>Hello</div><div>World</div> </template> 2.Suspense組件:在Suspended-component完全渲染之前,備用內(nèi)容會被顯示出來。如果是異步組件, Suspense可以等待組件被下載,或者在設(shè)置函數(shù)中執(zhí)行一些異步操作。 <Suspense><template ><Suspended-component /></template><template #fallback>Loading...</template> </Suspense> 七.更快的vite開發(fā)構(gòu)建工具八.proxy實現(xiàn)數(shù)據(jù)監(jiān)聽vue邊界情況
訪問根實例、訪問父組件、子組件子組件中訪問父組件的實例
1:直接在子組件中通過this.$parent.event來調(diào)用父組件的方法 2:在子組件里用$emit向父組件觸發(fā)一個事件,父組件監(jiān)聽這個事件 3:父組件把方法傳入子組件中,在子組件里直接調(diào)用這個方法watch的屬性用箭頭函數(shù)定義的結(jié)果
因為箭頭函數(shù)默綁定父級作用域的上下文,所以不會綁定vue實例,所以this是undefinedmethods的方法用箭頭函數(shù)定義的結(jié)果
因為箭頭函數(shù)默綁定父級作用域的上下文,所以不會綁定vue實例,所以this是undefinedbabel-polyfill模塊用途
babel默認(rèn)只轉(zhuǎn)換語法,而不轉(zhuǎn)換新的API,如需使用新的API,還需要使用對應(yīng)的轉(zhuǎn)換插件或者polyfill去模擬這些新特性。vue的錯誤處理
1.errorCaptured是組件內(nèi)部鉤子,可捕捉本組件與子孫組件拋出的錯誤,接收error、vm、info三個參數(shù),return false后可以阻止錯誤繼續(xù)向上拋出。 2.errorHandler為全局鉤子,使用Vue.config.errorHandler配置,接收參數(shù)與errorCaptured一致,2.6后可捕捉v-on與promise鏈的錯誤,可用于統(tǒng)一錯誤處理與錯誤兜底。 Vue.config.errorHandler = function (err, vm, info) {}// handle error// `info` 是 Vue 特定的錯誤信息,比如錯誤所在的生命周期鉤子// 只在 2.2.0+ 可用事件中傳入$event,e.target和e.currentTarget的區(qū)別?
event.currentTarget始終指向事件所綁定的元素,event.target指向事件發(fā)生時的元素vue文件中style和script的必要性
都不是必須的,如果是普通組件那么是一個靜態(tài)html 如果是函數(shù)式組件,那么可以直接使用props等函數(shù)式組件屬性vue怎么實現(xiàn)強(qiáng)制刷新組件?
1.Vue.$set(object, key, value) 2.this.$forceupdate(); 3.<components :key=XXX>vue自定義事件中父組件接收子組件的多個參數(shù)
this.$emit("eventName",data)data為一個對象 子組件傳遞多個參數(shù),父組件用展開運算符獲取實際工作中的vue最佳實踐
1. 項目目錄結(jié)構(gòu)簡介 ├── public // index.html ├── src // 業(yè)務(wù)相關(guān) │ ├── assets // 靜態(tài)文件(css, images) │ ├── components // 全局組件 │ ├── layouts // 基礎(chǔ)樣式布局 │ ├── plugin // 樣式及工具引入 │ ├── request // 請求配置 │ ├── router // 路由 │ ├── store // 全局狀態(tài)管理 │ ├── utils // 工具文件 │ ├── app.vue // 入口文件 │ ├── main.js // 主要配置文件 │ └── views // 頁面 ├── .eslintrc.js // eslint 檢查配置 ├── .env.release // 測試環(huán)境變量 ├── .env.pre-build // 預(yù)發(fā)環(huán)境變量2.UI 框架選擇 element,iview,ant-design-vue3.main.js 分散處理 main.js 作為操作入口,很多東西需要引入,代碼體積過大,需要進(jìn)行優(yōu)化,邏輯清晰4.axios 請求二次封裝解決vue給組件綁定自定義事件無效
組件外部加修飾符.navtive 組件內(nèi)部聲明$emit('自定義事件')vue的屬性名稱與method的方法名稱一樣時的問題
vue會把methods和data的東西,全部代理到vue生成對象中。 會產(chǎn)生覆蓋所以最好不要同名 鍵名優(yōu)先級:props > data > methods訪問vue變量名如果以_、$開頭的屬性的值?
報錯 變量未定義 以 _ 或 $ 開頭的屬性 不會 被 Vue 實例代理,因為它們可能和 Vue 內(nèi)置的屬性、API 方法沖突。 你可以使用例如 $data.xxx或者_(dá)data.xxx 的方式訪問這些屬性。vue使用v-for遍歷對象時,是按什么順序遍歷的?
1、會先判斷是否有iterator接口,如果有循環(huán)執(zhí)行next()方法 2、沒有iterator的情況下,會調(diào)用Object.keys()方法,在不同瀏覽器中,JS引擎不能保證輸出順序一致 3、保證對象的輸出順序可以把對象放在數(shù)組中,作為數(shù)組的元素vue如果想擴(kuò)展某個現(xiàn)有的組件時,怎么做呢?
使用Vue.extend直接擴(kuò)展 使用Vue.mixin全局混入 HOC封裝說下attrs和attrs和listeners的使用場景
組件傳值的時候會用到 爺爺在父親組件傳遞值,父親組件會通過$attrs獲取到不在父親props里面的所有屬性, 父親組件通過在孫子組件上綁定$attrs 和 $listeners 使孫組件獲取爺爺傳遞的值并且可以調(diào)用在爺爺那里定義的方法 $attrs:包含了父作用域中不被 prop 所識別 (且獲取) 的特性綁定 (class 和 style 除外)。當(dāng)一個組件沒有聲明任何 prop 時, 這里會包含所有父作用域的綁定 (class 和 style 除外),并且可以通過 v-bind="$attrs" 傳入內(nèi)部組件. 通常配合 interitAttrs 選項一起使用。 $listeners:包含了父作用域中的 (不含 .native 修飾器的) v-on 事件監(jiān)聽器。它可以通過 v-on="$listeners" 傳入內(nèi)部組件vue項目本地開發(fā)完成后部署到服務(wù)器后報404是什么原因呢?
1.檢查nginx配置,是否正確設(shè)置了資源映射條件; 2.檢查vue.config.js中是否配置了publicPath,若有則檢查是否和項目資源文件在服務(wù)器擺放位置一致。v-once的使用場景有哪些?
v-once 只渲染元素和組件一次。隨后的重新渲染,元素/組件及其所有的子節(jié)點將被視為靜態(tài)內(nèi)容并跳過。這可以用于優(yōu)化更新性能。說說你對vue的表單修飾符.lazy的理解?
input標(biāo)簽v-model用lazy修飾之后,vue并不會立即監(jiān)聽input Value的改變,會在input失去焦點之后,才會觸發(fā)Value的改變vue為什么要求組件模板只能有一個根元素?
從效率上,如果多個根,那么就會產(chǎn)生多個入口(遍歷、查找)從效率上來說都不方便 其次,如果一顆樹有多個根,其實是可以優(yōu)化的。肯定存在一個子節(jié)點。通過這個該子節(jié)點訪問到所有的節(jié)點。那么,優(yōu)化后, 這個子節(jié)點就成為了新的樹的根節(jié)點 ,此外從vue的角度來說,如果一個組件有多個根,說明你可以把這個組件拆開成兩個組件, 這樣既進(jìn)行了解耦,也會為后續(xù)的維護(hù)和迭代提供方便EventBus注冊在全局上時,路由切換時會重復(fù)觸發(fā)事件,如何解決呢?
建議在created里注冊,在beforeDestory移出 在組件內(nèi)的beforeRouteLeave中移除事件監(jiān)聽怎么修改vue打包后生成文件路徑?
webpack:output.path vue-cli3: outputDir說說vue與app交互的方法?
window.onload onload 事件會在頁面或圖像加載完成后立即發(fā)生。mounted鉤子里添加代碼window.οnlοad=function(){//調(diào)用交互},在window加載完成以后觸發(fā)交互,而且此時間節(jié)點在vue的生命周期是不存在的,也是在mounted、created鉤子后發(fā)生的,這個原生的方法還是很有用的使用vue寫一個tab切換?
v-if 配合data+watch監(jiān)聽實現(xiàn)vue中什么是遞歸組件?
tree,多級導(dǎo)航組件怎么訪問到子組件的實例或者子元素?
this.$refs.XXX在子組件中怎么訪問到父組件的實例?
1:直接在子組件中通過this.$parent.event來調(diào)用父組件的方法 2:在子組件里用$emit向父組件觸發(fā)一個事件,父組件監(jiān)聽這個事件 3:父組件把方法傳入子組件中,在子組件里直接調(diào)用這個方法在組件中怎么訪問到根實例?
通過this.$root說說你對Object.defineProperty的理解?
Object.defineProperty定義新屬性或修改原有的屬性; vue的數(shù)據(jù)雙向綁定的原理就是用的Object.defineProperty這個方法,里面定義了setter和getter方法, 通過觀察者模式(發(fā)布訂閱模式)來監(jiān)聽數(shù)據(jù)的變化,從而做相應(yīng)的邏輯處理。原生addEventListeners監(jiān)聽事件,要手動去銷毀嗎?為什么?
“需要,原生DOM事件必須要手動銷毀,否則會造成內(nèi)存泄漏”vue組件里的定時器要怎么銷毀?
beforeDestroyvue組件會在什么時候下被銷毀?
頁面關(guān)閉、路由跳轉(zhuǎn)、v-if和改變key值使用vue渲染大量數(shù)據(jù)時應(yīng)該怎么優(yōu)化?
1.如果需要響應(yīng)式,考慮使用虛表(只渲染要顯示的數(shù)據(jù));
2.如果不考慮響應(yīng)式,變量在beforeCreated或created中聲明(Object.freeze會導(dǎo)致列表無法增加數(shù)據(jù))
在vue中使用this應(yīng)該注意哪些問題?
vue中使用匿名函數(shù),會出現(xiàn)this指針改變。 1.使用箭頭函數(shù) 2.定義變量綁定this至vue對象你有使用過JSX嗎?
jsx不是一門新的語言,是一種新的語法糖。讓我們在js中可以編寫像html一樣的代碼。允許XML語法直接加入到JavaScript代碼中,讓你能夠高效的通過代碼而不是模板來定義界面說說組件的命名規(guī)范?
定義組件名有兩種方式: 1.kebab-case(短橫線分隔命名),引用時必須也采用kebab-case; 2.PascalCase(首字母大寫命名),引用時既可以采用PascalCase也可以使用kebab-case; 但在DOM中使用只有kebab-case是有效的怎么配置使vue2.0+支持TypeScript寫法?
配置ts-loader,tsconfig 增加類型擴(kuò)展,讓ts識別vue文件 vue文件中script里面換成ts寫法, 需要增加幾個ts擴(kuò)展的package, 比如vue-property-decoratortemplate有什么用?
包裹嵌套其它元素,使元素具有區(qū)域性,自身具有三個特點: *隱藏性:不會顯示在頁面中 *任意性:可以寫在頁面的任意地方 *無效性: 沒有一個根元素包裹,任何HTML內(nèi)容都是無效的vue的is這個特性你有用過嗎?主要用在哪些方面?
vue中is的屬性引入是為了解決dom結(jié)構(gòu)中對放入html的元素有限制的問題<ul><li is='my-component'></li> </ul>vue的:class和:style有幾種表示方式?
:class 綁定變量 綁定對象 綁定一個數(shù)組 綁定三元表達(dá)式 :style 綁定變量 綁定對象 綁定函數(shù)返回值 綁定三元表達(dá)式你了解什么是函數(shù)式組件嗎?
函數(shù)式組件: 需要提供一個render方法, 接受一個參數(shù)(createElement函數(shù)), 方法內(nèi)根據(jù)業(yè)務(wù)邏輯, 通過createElement創(chuàng)建vnodes,最后return vnodes createElement函數(shù), 三個參數(shù), 第一個參數(shù)是html標(biāo)簽或自定義組件, 第二個參數(shù)一個obj(包含props, on...等等), 第三個參數(shù)children(通過createElement構(gòu)建, 或者字符串)vue怎么改變插入模板的分隔符?
要做實例中增加delimiters 2.0后只能在實例中修改了,1.0還可以全局修改 new Vue({ delimiters: ['${', '}'] })// 分隔符變成了 ES6 模板字符串的風(fēng)格組件中寫name選項有什么作用?
項目使用keep-alive時,可搭配組件name進(jìn)行緩存過濾 DOM做遞歸組件時需要調(diào)用自身name vue-devtools調(diào)試工具里顯示的組見名稱是由vue中組件name決定的說說你對provide和inject的理解?
通過在父組件中inject一些數(shù)據(jù)然后再所有子組件中都可以通過provide獲取使用該參數(shù), 主要是為了解決一些循環(huán)組件比如tree, menu, list等, 傳參困難, 并且難以管理的問題, 主要用于組件封裝, 常見于一些ui組件庫開發(fā)過程中有使用過devtools嗎?
有,devtools確實是個好東西,大力協(xié)助vue項目開發(fā),傳參,數(shù)據(jù)展示,用于調(diào)試vue應(yīng)用, 這可以極大地提高我們的調(diào)試效率說說你對slot的理解有多少?slot使用場景有哪些?
slot, 插槽, 在使用組件的時候, 在組建內(nèi)部插入東西. 組件封裝的時候最常使用到你有使用過動態(tài)組件嗎?說說你對它的理解?
通過 Vue 的 元素加一個特殊的 is 特性來實現(xiàn)prop驗證的type類型有哪幾種?
props:{title:String,likes: Number,isPublished: Boolean,commentIds: Array,author: Object,callback: Function,contactsPromise: Promise }prop是怎么做驗證的?可以設(shè)置默認(rèn)值嗎?
單個類型就用Number等基礎(chǔ)類型,多個類型用數(shù)組,必填的話設(shè)置require為true, 默認(rèn)值的話設(shè)置default,對象和數(shù)組設(shè)置默認(rèn)用工廠函數(shù),自定義驗證函數(shù)validator。怎么緩存當(dāng)前打開的路由組件,緩存后想更新當(dāng)前組件怎么辦呢?
可以在路由meta中加入?yún)?shù), 對打開的路由進(jìn)行keep-alive的判斷, 通過鉤子active等說說你對vue組件的設(shè)計原則的理解?
第一: 容錯處理, 這個要做好, 極端場景要考慮到 第二: 缺省值(默認(rèn)值)要有, 一般把應(yīng)用較多的設(shè)為缺省值 第三: 顆粒化, 把組件拆分出來. 第四: 一切皆可配置, 如有必要, 組件里面使用中文標(biāo)點符號, 還是英文的標(biāo)點符號, 都要考慮到 第五: 場景化, 如一個dialog彈出, 還需要根據(jù)不同的狀態(tài)封裝成success, waring, 等 第六: 有詳細(xì)的文檔/注釋和變更歷史, 能查到來龍去脈, 新版本加了什么功能是因為什么 第七: 組件名稱, 參數(shù)prop, emit, 名稱設(shè)計要通俗易懂, 最好能做到代碼即注釋這種程度 第八: 可拓展性, 前期可能不需要這個功能, 但是后期可能會用上, 要預(yù)留什么, 要注意什么 第九: 規(guī)范化 第十: 分階段: 不是什么都要一期開發(fā)完成看具體業(yè)務(wù)vue的diff算法是什么?
“diff就是比較兩個樹,render會生成兩顆樹,一個新樹 newVnode,一棵舊樹oleVnode, 然后兩棵樹進(jìn)行對比更新差異就是 diff ,全稱是 difference, 在 vue 里面, diff 算法就是通過 patch 函數(shù)來完成的,所有有的時候也叫 patch 算法。”** vue如何優(yōu)化首頁的加載速度?**
異步路由和異步加載 還有分屏加載, 按需加載, 延時加載圖片等, cdn,ssr直出,域名拆分, webpack壓縮HTML/CSS/JS, 首屏css單獨提取內(nèi)聯(lián),關(guān)鍵資源Proload, 圖片:不縮放,使用webp、小圖片base64,iconfont, gzip,dns-prefetch,靜態(tài)資源單獨域名,去掉cookie** vue打包成最終的文件有哪些?**
vendor.js, app.js, app.css, 1.xxx.js 2.xxx.js如果有設(shè)置到單獨提取css的話 還有 1.xxx.css…
** ajax、fetch、axios這三都有什么區(qū)別?**
** vue能監(jiān)聽到數(shù)組變化的方法有哪些?為什么這些方法能監(jiān)聽到呢?**
push() pop() shift() unshift() splice() sort() reverse() 對中轉(zhuǎn)的數(shù)據(jù)都做了監(jiān)聽vue中是如何使用event對象的?
@click=“func” 默認(rèn)第一個參數(shù)傳入event對象 @click="func(0, $event)" 如果自己需要傳入?yún)?shù)和event對象,則需要使用$event來獲取event對象并傳入funcvue首頁白屏是什么問題引起的?如何解決呢?
1.打包后文件引用路徑不對,導(dǎo)致找不到文件報錯白屏 2.路由模式mode設(shè)置影響說說你對單向數(shù)據(jù)流和雙向數(shù)據(jù)流的理解?
單向數(shù)據(jù)流:所有狀態(tài)的改變可記錄、可跟蹤,源頭易追溯;所有數(shù)據(jù)只有一份,組件數(shù)據(jù)只有唯一的入口和出口,使得程序更直觀更容易理解,有利于應(yīng)用的可維護(hù)性;一旦數(shù)據(jù)變化,就去更新頁面(data-頁面),但是沒有(頁面-data);如果用戶在頁面上做了變動,那么就手動收集起來(雙向是自動),合并到原有的數(shù)據(jù)中。 雙向數(shù)據(jù)流:無論數(shù)據(jù)改變,或是用戶操作,都能帶來互相的變動,自動更新移動端ui你用的是哪個ui庫?
vant,mint等等吧,大部分都是可以查到解決方案你知道nextTick的原理嗎?
nextTick里面的代碼會在DOM更新后執(zhí)行 Vue.nextTick(function(){//操作 })說說你對v-clock和v-pre指令的理解?
v-cloak指令只是在標(biāo)簽中加入v-cloak自定義屬性,在HTML還編譯完成之后該屬性會被刪除。 v-pre可以用來阻止預(yù)編譯,有v-pre指令的標(biāo)簽內(nèi)部的內(nèi)容不會被編譯,會原樣輸出。寫出你知道的表單修飾符和事件修飾符?
事件修飾符.stop .prevent .capture .self .once .passive 表單修飾符.number .lazy .trim說說你對proxy的理解?
vue的數(shù)據(jù)劫持有兩個缺點: 1、無法監(jiān)聽通過索引修改數(shù)組的值的變化 2、無法監(jiān)聽object也就是對象的值的變化 所以vue2.x中才會有$set屬性的存在 proxy是es6中推出的新api,可以彌補(bǔ)以上兩個缺點,所以vue3版本用proxy替換object.defineproperty用vue怎么實現(xiàn)一個換膚的功能?
全局的theme屬性然后做class判斷或者加載不同的樣式文件。一種是編譯時換膚 一種是用戶操作換膚. 編譯時換膚可以通過css in js相關(guān)技術(shù)修改css預(yù)處理器的變量 。用戶操作換膚 只能內(nèi)置一些style變量供用戶選擇有在vue中使用過echarts嗎?
npm install echarts vue-echarts
vue性能的優(yōu)化的方法有哪些?
v-if 和 v-show 區(qū)分使用場景 computed 和 watch 的使用場景 v-for 遍歷必須為 item 添加 key,且避免同時使用 v-if 長列表性能優(yōu)化 可以通過 Object.freeze 方法來凍結(jié)一個對象 事件的銷毀 addEventListener 圖片資源懶加載 路由懶加載 第三方插件的按需引入 優(yōu)化無限列表性能 可以參考 vue-virtual-scroll-list vue-virtual-scroller 優(yōu)化 服務(wù)端渲染 SSR or 預(yù)渲染 Webpack 對圖片進(jìn)行壓縮 減少 ES6 轉(zhuǎn)為 ES5 的冗余代碼 模板預(yù)編譯 提取公共代碼 提取組件的 CSS 優(yōu)化 SourceMap 構(gòu)建結(jié)果輸出分析 Vue 項目的編譯優(yōu)化 開啟 gzip 壓縮 瀏覽器緩存https://blog.csdn.net/weixin_43392489/article/details/114178963
SSR解決了什么問題?
說說你覺得認(rèn)為的vue開發(fā)規(guī)范有哪些?
https://cn.vuejs.org/v2/style-guide/vue部署上線前需要做哪些準(zhǔn)備工作?
router 是不是hash 是否需要配置nginx , publicPath , 是不是要配置cdnvue過渡動畫實現(xiàn)的方式有哪些?
1.使用vue的transition標(biāo)簽結(jié)合css樣式完成動畫 2.利用animate.css結(jié)合transition實現(xiàn)動畫 3.利用 vue中的鉤子函數(shù)實現(xiàn)動畫created和mounted中請求數(shù)據(jù)的區(qū)別?
created:在模板渲染成html前調(diào)用,即通常初始化某些屬性值,然后再渲染成視圖。 mounted:在模板渲染成html后調(diào)用,通常是初始化頁面完成后, 再對html的dom節(jié)點進(jìn)行一些需要的操作。vue父子組件雙向綁定的方法有哪些?
1.利用對象的引用關(guān)系來實現(xiàn) 2.父子組件之間的數(shù)據(jù)傳遞 3.使用.sync修飾符vue怎么獲取DOM節(jié)點?
1、document.getElementById 2、引入jquery 3、標(biāo)簽的屬性加上ref="name",通過this.$refs.name來獲取這個元素節(jié)點vue項目有使用過npm run build --report嗎?
給process.env對象添加了一個屬性 npm_config_report: "true", 表示開啟編譯完成后的報告。如何解決vue打包vendor過大的問題?
1、在webpack.base.conf.js新增externals配置,表示不需要打包的文件, 然后在index.html中通過CDN引入 externals: {"vue": "Vue","vue-router": "VueRouter","vuex": "Vuex","element-ui": "ELEMENT","BMap": "BMap"} 2、使用路由懶加載webpack打包vue速度太慢怎么辦?
webpack支持監(jiān)聽模式,此時需要重新編譯時就可以進(jìn)行增量構(gòu)建 增量構(gòu)建是很快的,基本不到一秒或幾秒之內(nèi)就能重新編譯好, 注意區(qū)分一下開發(fā)環(huán)境和線上環(huán)境,開發(fā)環(huán)境啟用熱更新替換,升級webpack4,支持多進(jìn)程開發(fā)過程中要同時跟不同的后端人員聯(lián)調(diào)接口該怎么辦?
devServer中把所有的服務(wù)人員的地址代理都寫進(jìn)去, 然后動態(tài)更改接口的baseUrl,這樣切換不同后端人員的時候不用重啟vue要做權(quán)限管理該怎么做?如果控制到按鈕級別的權(quán)限怎么做?
// 可以通過指令去做 Vue.directive('hasPermission', {bind(el, binding, vnode) {const permissions = vnode.context.$store.state.account.permissionsif (binding.value === '') returnconst value = binding.value.split(',')let flag = truefor (const v of value) {if (!permissions.includes(v)) {flag = false}}if (!flag) {if (!el.parentNode) {el.style.display = 'none'} else {el.parentNode.removeChild(el)}}} }vue和微信小程序?qū)懛ㄉ嫌惺裁磪^(qū)別?
onLoad: 頁面加載,只會調(diào)用一次,可以獲取當(dāng)前頁面所調(diào)用的 query 參數(shù)。 onShow: 頁面顯示,每次打開頁面都會調(diào)用一次。 onReady: 頁面初次渲染完成,只會調(diào)用一次,可以和視圖層進(jìn)行交互。 onHide: 頁面隱藏 onUnload: 頁面卸載 數(shù)據(jù)請求:在onLoad或者onShow中請求數(shù)據(jù)。 綁定某個變量的值為元素屬性用兩個大括號括起來,不加被認(rèn)為是字符串。 循環(huán)wx:for wx-if和hidden控制元素的顯示和隱藏 全用bindtap(bind+event),或者catchtap(catch+event)綁定事件你了解什么是高階組件嗎?舉個例子說明下?
高階組件(HOC)應(yīng)該是無副作用的純函數(shù),且不修改原組件 高階組件(HOC)不關(guān)心你傳遞的數(shù)據(jù),并且新生成組件不關(guān)心數(shù)據(jù)來源 高階組件(HOC)接收到的 props 應(yīng)該透傳給被包裝組件 高階組件完全可以添加、刪除、修改 props為什么寫組件的時候?qū)懺?vue里?可以是別的文件名后綴嗎?
也可以寫為js,jsx,ts,tsx這種vue-loader是什么?它有什么作用?
解析和轉(zhuǎn)換.vue。提取出其中的邏輯代碼 script,樣式代碼style, 以及HTML 模板template,再分別把他們交給對應(yīng)的loader去處理。說說你對vue的extend的理解,它主要是用來做什么的?
繼承當(dāng)前的Vue類,傳入一個extendOption生成一個新的構(gòu)造函數(shù). 在extend的時候會進(jìn)行mergeOption,融合Vue原型上的baseOption, 所以extend出來的子類也能使用v-model、keep-alive等全局性的組件。 作用是生成組件類。在掛載全局組件和設(shè)置了components屬性的時候會使用到. 在生成DOM的時候會new 實例化掛載。如果將axios異步請求同步化處理?
async await為什么vue使用異步更新組件?
批量更新 收集當(dāng)前的改動一次性更新 節(jié)省diff開銷你有使用過render函數(shù)嗎?有什么好處?
template也會翻譯成render,只有一點,template中元素的tag_name是靜態(tài)的, 不可變化,使用createEelment可以生成不同tag_name組件進(jìn)來請求接口時你是放在哪個生命周期?
一般在created 因為在這個生命周期我們常用到的都已經(jīng)初始化了, 如果涉及dom 那就mounted為何官方推薦使用axios而不用vue-resource?
1.vue-resources不再更新了,vue作者尤大推薦axios。 2.axios更加強(qiáng)大 3.axios就是一個基于ES6的Promise的網(wǎng)絡(luò)請求庫 4.axios在瀏覽器里建立XHR,通過nodejs進(jìn)行http請求, 轉(zhuǎn)換或者攔截請求數(shù)據(jù)或響應(yīng)數(shù)據(jù),支持Promise的API, 可以取消請求,自動轉(zhuǎn)換JSON,可以防御XSRF攻擊 5.vue-resources只提供了瀏覽器版本如何中斷axios的請求?
axios是什么?怎樣使用它?怎么解決跨域的問題?
說說你對vue的mixin的理解,有什么應(yīng)用場景?
mixins 就是混入。 一個混入對象可以包含任意組件選項。同一個生命周期,混入對象會比組件的先執(zhí)行。 //暴露兩個mixins對象 export const mixinsTest1 = {methods: { },created() {}, } <script> import {mixinsTest1} from '../util/test.js' export default {name: "Home",data () {return {};},created(){console.log("1212");},mixins:[mixinsTest1] // 先調(diào)用哪個mixins對象,就先執(zhí)行哪個 } </script>刪除數(shù)組用delete和Vue.delete有什么區(qū)別?
delete:只是被刪除數(shù)組成員變?yōu)?empty / undefined,其他元素鍵值不變 Vue.delete:直接刪了數(shù)組成員,并改變了數(shù)組的鍵值(避開 Vue 不能檢測到屬性被刪除的限制)動態(tài)給vue的data添加一個新的屬性時會發(fā)生什么?怎樣解決?
如果在實例創(chuàng)建之后添加新的屬性到實例上,它不會觸發(fā)視圖更新。如果想要使添加的值做到響應(yīng)式,應(yīng)當(dāng)使用$set()來添加對象。vue實例掛載的過程是什么?
render, 沒有則去編譯編譯vdom,對實例進(jìn)行watchvue有哪些場景是監(jiān)聽不到的?無法監(jiān)聽時怎么解決?
無法監(jiān)聽時的方案: 數(shù)組:改變數(shù)組的值:this.$set() 改變數(shù)組長度:arr.splice() 對象:改變原有屬性:Object.assign() 增加新屬性:this.$set()為什么data屬性必須聲明為返回一個初始數(shù)據(jù)對應(yīng)的函數(shù)呢?
當(dāng)重用組件時,由于數(shù)據(jù)對象都指向同一個data對象,當(dāng)修改data時,其他組件中的data會同時被修改;而使用返回對象的函數(shù),由于每次返回的都是一個新對象,引用地址不同,則不會出現(xiàn)這個問題。怎么在watch監(jiān)聽開始之后立即被調(diào)用?
設(shè)置immediate屬性為truewatch怎么深度監(jiān)聽對象變化?
設(shè)置deep屬性為truewatch和計算屬性有什么區(qū)別?
一個是偵聽屬性,一個是計算屬性 一個是為了應(yīng)對復(fù)雜的邏輯計算,一個是對數(shù)據(jù)的變化作出反應(yīng) 一個是只有當(dāng)緩存改變時才執(zhí)行,一個是只要從新渲染就會執(zhí)行 一個有緩存,一個沒有緩存vue如何監(jiān)聽鍵盤事件?
@keyup.鍵名.native說說你對MVC、MVP、MVVM模式的理解?
MVVM用視圖模型代替了MVP中的展示器,視圖模型和視圖實現(xiàn)了雙向綁定, 當(dāng)視圖發(fā)生變化的時候視圖模型也會發(fā)生改變,當(dāng)視圖模型變化的時候視圖也隨之變化。MVP用展示器代替了控制器,而展示器是可以直接更新視圖, 所以MVP中展示器可以處理視圖的請求并遞送到模型又可以根據(jù)模型的變化更新視圖, 實現(xiàn)了視圖和模型的完全分離。什么是雙向綁定?原理是什么?
雙向數(shù)據(jù)綁定就是存在data→view,view→data兩條數(shù)據(jù)流的模式。 目前雙向數(shù)據(jù)綁定都是基于Object.defineProperty() 重新定義get和set方法實現(xiàn)的。修改觸發(fā)set方法賦值,獲取觸發(fā)get方法取值, 并通過數(shù)據(jù)劫持發(fā)布信息.vue-router怎么重定向頁面?
路由中配置redirect屬性
vue-router怎么配置404頁面?
export default { path: '*', name: '404', component: '組件404', } 需注意:將改路由配置放到所有路由的配置信息的最后,否則會其他路由path匹配造成影響。切換路由時,需要保存草稿的功能,怎么實現(xiàn)呢?
用keep-alive緩存那個路由vue-router路由有幾種模式?說說它們的區(qū)別?
共有兩種模式
vue-router有哪幾種導(dǎo)航鉤子( 導(dǎo)航守衛(wèi) )?
共有三種守衛(wèi): 1:全局守衛(wèi):beforeEach,afterEach 2:路由獨享守衛(wèi):beforeEnter 3:組件級別的守衛(wèi)beforeRouteEnter,beforeRouteUpdate,beforeRouteLeave 他們執(zhí)行順序:全局》路由》組件 除了afterEach全局后置外,其他的守衛(wèi)中務(wù)必要調(diào)用next(),否則無法完成導(dǎo)航 還有注意全局前置守衛(wèi)可以用來進(jìn)行攔截,(登錄攔截)說說你對router-link的了解
to 表示目標(biāo)路由的鏈接,內(nèi)部會立刻把 to 的值傳到 router.push(), 這個值可以是字符串或者是描述位置的對象。replace 設(shè)置 replace 屬性的話,當(dāng)點擊時,會調(diào)用 router.replace() 而不是 router.push(),導(dǎo)航后不會留下 history 記錄。append 設(shè)置后,則在當(dāng)前(相對)路徑前添加基路徑。例如,我們從 /a 導(dǎo)航到一個相對路徑 b,如果沒有配置 append,則路徑為 /b,如果配了,則為 /a/btag 有時候想要渲染成某種標(biāo)簽active-class 設(shè)置鏈接激活時使用的 CSS 類名。可以通過以下代碼來替代exact-active-class 配置當(dāng)鏈接被精確匹配的時候應(yīng)該激活的 class。可以通過以下代碼來替代event 聲明可以用來觸發(fā)導(dǎo)航的事件。可以是一個字符串或是一個包含字符串的數(shù)組。vue-router如何響應(yīng)路由參數(shù)的變化?
切換路由,路由參數(shù)發(fā)生了變化,但是頁面數(shù)據(jù)并未及時更新,需要強(qiáng)制刷新后才會變化。 不同路由渲染相同的組件時(組件復(fù)用比銷毀重新創(chuàng)建效率要高),在切換路由后,當(dāng)前組件下的生命周期函數(shù)不會再被調(diào)用切換到新路由,頁面要滾動到頂部或保持原先的滾動位置?
通過router 的meta來記錄需要保存滾動條的位置,在new VueRouter()時調(diào)用scrollBehavior(to, from, savedPosition) {return { x: 0, y: 0 }}的方法在什么場景下會用到嵌套路由?
頂部欄和左側(cè)菜單欄是全局通用的,那就應(yīng)該放在父路由, 而右下的頁面內(nèi)容部分放在子路由如何獲取路由傳過來的參數(shù)?
query方式傳入的參數(shù)使用this.$route.query接收 params方式傳入的參數(shù)使用this.$router.params接收說說active-class是哪個組件的屬性?
active-class是vue-router模塊的router-link組件中的屬性, 用來做選中樣式的切換首頁在vue組件中怎么獲取到當(dāng)前的路由信息?
this.$route.pathvur-router怎么重定向?
const routes = [{ path: '/home', redirect: '/' }]怎樣動態(tài)加載路由?
vue-router的addRoutes方法怎么實現(xiàn)路由懶加載呢?
// vue異步組件 {path: '/home',name: 'home',component: resolve => require(['@/components/home'],resolve) }// es6提案的import() import(/* ChunkName: 'ImportFuncDemo' */ '@/components/home')// webpack的require,ensure() {path: '/home',name: 'home',component: r => require.ensure([], () => r(require('@/components/home')), 'demo') }如果讓你從零開始寫一個vue路由,說說思路
1.為了方便后期維護(hù),建議獨立出一個 router.js 文件 2.npm install vue-router 3.引入注冊 import Router from 'vue-router'; Vue.user(Router); 4.向外暴露出一個router實例 export default new Router({ mode: '', path: '', name: '', ... });說說vue-router完整的導(dǎo)航解析流程是什么?
1.導(dǎo)航被觸發(fā) 2.在失活的組件里調(diào)用beforeRouteLeave守衛(wèi) 3.調(diào)用全局beforeEach守衛(wèi) 4.在復(fù)用組件里調(diào)用beforeRouteUpdate守衛(wèi) 5.調(diào)用路由配置里的beforeEnter守衛(wèi) 6.解析異步路由組件 7.在被激活的組件里調(diào)用beforeRouteEnter守衛(wèi) 8.調(diào)用全局beforeResolve守衛(wèi) 9.導(dǎo)航被確認(rèn) 10.調(diào)用全局的afterEach鉤子 11.DOM更新 12.用創(chuàng)建好的實例調(diào)用beforeRouteEnter守衛(wèi)中傳給next的回調(diào)函數(shù)路由之間是怎么跳轉(zhuǎn)的?有哪些方式?
1.在頁面使用來定義導(dǎo)航鏈接 2.使用編程式導(dǎo)航,push,replace,go如果vue-router使用history模式,部署時要注意什么?
服務(wù)器的404頁面需要重定向到index.htmlroute和router有什么區(qū)別?
route:代表當(dāng)前路由信息對象,可以獲取到當(dāng)前路由的信息參數(shù) router:代表路由實例的對象,包含了路由的跳轉(zhuǎn)方法,鉤子函數(shù)等vue-router鉤子函數(shù)有哪些?都有哪些參數(shù)?
全局的:beforeEach、beforeResolve、afterEach 路由的:beforeEnter 組件的:beforeRouteEnter、beforeRouteUpdate、beforeRouteLeave 參數(shù):to、from、next;正對不同的鉤子函數(shù)參數(shù)有所差異。vue-router是用來做什么的?它有哪些組件?
vue-router路由,通俗來講主要是來實現(xiàn)頁面的跳轉(zhuǎn), 通過設(shè)置不同的path,向服務(wù)器發(fā)送的不同的請求,獲取不同的資源。你有使用過vuex的module嗎?主要是在什么場景下使用?
把狀態(tài)全部集中在狀態(tài)樹上,非常難以維護(hù)。 按模塊分成多個module,狀態(tài)樹延伸多個分支,模塊的狀態(tài)內(nèi)聚, 主枝干放全局共享狀態(tài)vuex中actions和mutations有什么區(qū)別?
mutations可以直接修改state,包含同步操作,通過提交commit調(diào)用 (通過Action或mapMutation調(diào)用而非通過this.$store.commit()提交) actions是用來觸發(fā)mutations的,它無法直接改變state,包含異步操作, 通過store.dispatch觸發(fā)vuex使用actions時不支持多參數(shù)傳遞怎么辦?
以載荷或?qū)ο笮问?vuex怎么知道state是通過mutation修改還是外部直接修改的?
通過$watch監(jiān)聽mutation的commit函數(shù)中_committing是否為true請求數(shù)據(jù)是寫在組件的methods中還是在vuex的action中?
根據(jù)業(yè)務(wù)場景劃分,如果該請求數(shù)據(jù)的方法是多個視圖共享的話, 則寫在action中,如果是當(dāng)前視圖所用,則寫在組件的methods中怎么監(jiān)聽vuex數(shù)據(jù)的變化?
官網(wǎng)的圖顯示 Devtools好像是監(jiān)視mutation的調(diào)用 mark一下vuex的action和mutation的特性是什么?有什么區(qū)別?
action:通過執(zhí)行commit()來觸發(fā)mutation間接更新state ,組件中通過$store.dispatch('名稱') 觸發(fā)action,可以包含(定時器, ajax) mutation是一個對象包含多個直接更新state的方法(回調(diào)函數(shù)), 只能包含同步的代碼, 不能寫異步代碼頁面刷新后vuex的state數(shù)據(jù)丟失怎么解決?
localStorage/SessionStoragevuex的store有幾個屬性值?分別講講它們的作用是什么?
state:存貯公共數(shù)據(jù)的地方 getters:獲取公共數(shù)據(jù)的地方 mutations:放的是同步的操作和reducer有點像 通過store的commit方法來讓mutations執(zhí)行 action:放的是異步的操作 通過dispatch的方法讓action里面的方法執(zhí)行 context是你理解的vuex是什么呢?哪些場景會用到?
Vuex就是一個倉庫,store倉庫里面放了很多對象,儲存數(shù)據(jù),方法使用vuex的優(yōu)勢是什么?
全局存儲狀態(tài)和全局方法ElementUI是怎么做表單驗證的?
rules方法,props對應(yīng)表單的字段ElementUI怎么修改組件的默認(rèn)樣式?
/deep/ !important 刪除scopedElementUI的穿梭組件如果數(shù)據(jù)量大會變卡怎么解決不卡的問題呢?
ElementUI表格組件如何實現(xiàn)動態(tài)表頭?
ElementUI使用表格組件時有遇到過問題嗎?
總結(jié)
以上是生活随笔為你收集整理的Vue 面试题 (全)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: springcloud alibaba
- 下一篇: 七种Vue3传值方式