前端常见的vue面试题,问一下
v-if鍜寁-for鍝釜浼樺厛绾ч珮涔熶笉閿檝-if鐨勪紭鍏堢骇姣攙-if楂樸€傛斁鍦ㄤ竴璧凤紝浠庤緭鍑烘覆鏌撳嚱鏁板彲浠ョ湅鍑猴紝浼氬厛鎵ц寰幆锛屽啀鍒ゆ柇鏉′欢銆傚嵆浣挎垜浠彧娓叉煋鍒楄〃涓殑涓€灏忛儴鍒嗗厓绱狅紝姣忔閬嶅巻鏁翠釜鍒楄〃鏃舵垜浠兘蹇呴』閲嶆柊娓叉煋锛岃繖灏嗘槸涓€绉嶆氮璐癸紱鍙﹀闇€瑕佹敞鎰忕殑鏄紝鍦╲ue3涓紝鏄畬鍏ㄧ浉鍙嶇殑銆倂-if鐨勪紭鍏堢骇楂樹簬v-for锛屾墍浠ユ墽琛寁-if鏃讹紝瀹冭皟鐢ㄧ殑鍙橀噺杩樹笉瀛樺湪銆傚畠浼氬鑷村紓甯搞€傞€氬父鏈変袱绉嶆儏鍐典細瀵艰嚧鎴戜滑杩欐牱鍋氾細杩囨护鍒楄〃涓殑椤圭洰锛堝v-for="userinusers"v-if="user.isActive"锛夈€傛鏃跺畾涔変竴涓绠楀睘鎬э紙姣斿activeUsers锛夛紝璁╁畠杩斿洖杩囨护鍚庣殑鍒楄〃锛堟瘮濡倁sers.filter(u=>u.isActive)锛夛紝閬垮厤娓叉煋搴旇闅愯棌鐨勫垪琛紙姣斿v-for="鐢ㄦ埛涓殑鐢ㄦ埛"v-if="shouldShowUsers").姝ゆ椂灏唙-if绉诲姩鍒板鍣ㄥ厓绱狅紙濡倁l銆乷l锛夋垨鑰呭湪澶栭潰鍖呰9涓€灞傛ā鏉裤€傝鏂囨。鏄庣‘鎸囧嚭锛屾偍姘歌繙涓嶅簲鍚屾椂鍦ㄥ悓涓€鍏冪礌涓婁娇鐢╲-if鍜寁-for銆傚緢鏄庢樉杩欐槸鍏充簬婧愮爜浠g爜鐢熸垚閮ㄥ垎鐨勯噸瑕佽鏄庯紝鍙互娓呮鐨勭湅鍒版槸鍏堝鐞唙-if杩樻槸v-for锛岃€寁ue2鍜寁ue3鐨勯『搴忓垰濂界浉鍙嶏紝鎵€浠ユ湁浜涚棁鐘舵槸涓嶄竴鏍风殑锛屼絾鏄棤璁烘槸浠€涔坴ue2.x婧愮爜鍒嗘瀽閮戒笉鑳芥妸瀹冧滑鍐欏湪涓€璧凤紝鍦ㄧ紪璇憊ue妯℃澘鐨勬椂鍊欙紝浼氭妸commandsystem杞崲鎴愬彲鎵ц鐨剅enderfunction銆傚啓涓€涓猵鏍囩锛屽悓鏃朵娇鐢╲-if鍜寁-for{{item.title}}
鍒涘缓涓€涓獀ue瀹炰緥锛屽瓨鍌╥sShow鍜宨tems鏁版嵁constapp=newVue({el:"#app",data(){return{items:[{title:"foo"},{title:"baz"}]}},computed:{isShow(){returnthis.items&&this.items.length>0}}})妯℃澘鎸囦护鐨勪唬鐮佸皢鍦ㄦ覆鏌撳嚱鏁颁腑鐢熸垚锛屽苟涓旀覆鏌撳嚱鏁板彲浠ラ€氳繃app.$options.render茠anonymous(){with(this){return_c('div',{attrs:{"id":"app"}},_l((items),function(item){return(isShow)?_c('p',[_v("\n"+_s(item.title)+"\n")]):_e()}),0)}}_l鏄痸ue鐨勫垪琛ㄦ覆鏌撳嚱鏁板唴閮ㄤ細杩涜if鍒ゆ柇锛屽垵姝ュ緱鍑虹粨璁猴細v-for鐨勪紭鍏堢骇楂樹簬v-if锛岀劧鍚庡皢v-for鍜寁-if鏀惧湪涓嶅悓鐨勬爣绛?divid="app">
{{item.title}} 鐒跺悗杈撳嚭娓叉煋鍑芥暟茠anonymous(){with(this){return_c('div',{attrs:{"id":"app"}},[(isShow)?[_v("\n"),_l((items),function(item){return_c('p',[_v(_s(item.title))])})]:_e()],2)}}杩欐椂鍊欐垜浠彲浠ョ湅鍒板綋v-for鍜寁-濡傛灉浣滅敤浜庝笉鍚岀殑鏍囩锛屾槸鍏堝仛鍒ゆ柇锛屽啀娓叉煋鍒楄〃銆傛垜浠煡鐪嬩竴涓媣ue鐨勬簮鐮佷綅缃細\vue-dev\src\compiler\codegen\index.jsexportfunctiongenElement(el:ASTElement,state:CodegenState):string{if(el.parent){el.pre=el.鍓峾|el.parent.pre}if(el.staticRoot&&!el.staticProcessed){returngenStatic(el,state)}elseif(el.once&&!el.onceProcessed){returngenOnce(el,state)}elseif(el.for&&!el.forProcessed){returngenFor(el,state)}elseif(el.if&&!el.ifProcessed){returngenIf(el,state)}elseif(el.tag==='template'&&!el.slotTarget&&!state.pre){杩斿洖genChildren(el,state)||'void0'}elseif(el.tag==='slot'){returngenSlot(el,state)}else{//缁勪欢鎴栧厓绱?..}鍒ゆ柇if鏃讹紝v-for鍏堜簬v-if鍒ゆ柇鏈€缁堢粨璁猴細v-for姣攙-if鏈夋洿楂樼殑浼樺厛绾с€倂ue3.0鐨勭壒鎬т綘鐭ラ亾鍚楋紵Vue3.0鍗冲皢鍙戝竷銆俈ue3.0鐨勭洰鏍囨槸璁¬ue鏍稿績鏇村皬銆佹洿蹇€佹洿寮哄ぇ銆傚洜姝わ紝Vue3.0澧炲姞浜嗕互涓嬫柊鐗规€э細(1)鐩戞帶鏈哄埗鐨勫彉鍖?.0灏嗗甫鏉ュ熀浜庝唬鐞嗙殑瑙傚療鑰呭疄鐜帮紝Proxy鎻愪緵浜嗗弽搴斿紡璺熻釜鐨勫叏璇█瑕嗙洊銆傝繖鏍峰氨娑堥櫎浜哣ue2涓熀浜嶰bject.defineProperty瀹炵幇鐨勫緢澶氶檺鍒讹細鍙兘鐩戞帶灞炴€э紝涓嶈兘鐩戞帶瀵硅薄妫€娴嬪睘鎬х殑澧炲垹鏀规煡锛涙暟缁勭储寮曞拰闀垮害鍙樺寲锛涙敮鎸丮ap銆丼et銆乄eakMap鍜學eakSet銆傛柊鐨勮瀵熻€呰繕鎻愪緵浠ヤ笅鍔熻兘锛氱敤浜庡垱寤哄彲瑙傚療瀵硅薄鐨勫叕鍏盇PI銆傝繖涓轰腑灏忓瀷鍦烘櫙鎻愪緵浜嗕竴涓畝鍗曡交閲忕殑璺ㄧ粍浠剁姸鎬佺鐞嗘柟妗堛€傞粯璁ゆ儏鍐典笅浣跨敤寤惰繜瑙傚療銆傚湪2.x涓紝鏃犺鍙嶅簲鏁版嵁鏈夊澶э紝閮戒細鍦ㄥ惎鍔ㄦ椂瑙傚療鍒般€傚鏋滄偍鐨勬暟鎹泦寰堝ぇ锛岃繖鍙兘浼氬湪搴旂敤绋嬪簭鍚姩鏃跺紩鍏ユ槑鏄剧殑寮€閿€銆傚湪3.x涓紝浠呰瀵熺敤浜庡憟鐜板簲鐢ㄧ▼搴忔渶鍒濆彲瑙侀儴鍒嗙殑鏁版嵁銆傛洿绮剧‘鐨勬洿鏀归€氱煡銆傚湪2.x涓紝閫氳繃Vue.set寮哄埗涓€涓柊灞炴€у皢瀵艰嚧渚濊禆浜庤瀵硅薄鐨勮瀵熻€呮敹鍒版洿鏀归€氱煡銆傚湪3.x涓紝鍙湁渚濊禆浜庣壒瀹氬睘鎬х殑瑙傚療鑰呮墠浼氭敹鍒伴€氱煡銆備笉鍙彉鐨勫彲瑙傚療瀵硅薄锛氭垜浠彲浠ュ垱寤哄€肩殑鈥滀笉鍙彉鈥濈増鏈紙鐢氳嚦宓屽灞炴€э級锛岄櫎闈炵郴缁熸殏鏃跺湪鍐呴儴鈥滆В閿佲€濆畠浠€傝鏈哄埗鍙敤浜庡喕缁損rop浼犻€掓垨Vuex鐘舵€佹爲涔嬪鐨勬洿鏀广€傛洿濂界殑璋冭瘯锛氭垜浠彲浠ヤ娇鐢ㄦ柊鐨剅enderTracked鍜宺enderTriggered閽╁瓙鍑嗙‘璺熻釜缁勪欢閲嶆柊娓叉煋鐨勬椂闂村拰鍘熷洜銆?2)template妯℃澘娌℃湁澶х殑鍙樺寲锛屽彧鏄痵copeslot鍙戠敓浜嗗彉鍖栥€?.x鏈哄埗瀵艰嚧scopeslot鍙樺寲锛岀埗缁勪欢浼氶噸鏂版覆鏌擄紝鑰?.0灏唖copeslot鏀逛负function鏂瑰紡锛屽彧褰卞搷瀛愮粍浠剁殑閲嶆柊娓叉煋锛屾彁鍗囨覆鏌撴€ц兘銆傚悓鏃讹紝瀵逛簬render鍔熻兘鏂归潰锛寁ue3.0涔熶細杩涜涓€绯诲垪鐨勬敼鍔紝鏂逛究澶у鐩存帴浣跨敤api鐢熸垚vdom鐨勪範鎯€?3)鍩轰簬瀵硅薄鐨勭粍浠跺0鏄庢柟寮弙ue2.x涓殑缁勪欢閫氳繃澹版槑鐨勬柟寮忎紶鍏ヤ竴绯诲垪閫夐」锛屼笌TypeScript鐨勭粨鍚堥渶瑕侀€氳繃涓€浜涜楗板櫒鏉ュ畬鎴愩€傝櫧鐒跺彲浠ュ疄鐜板姛鑳斤紝浣嗘槸姣旇緝绻佺悙銆傚湪3.0涓紝缁勪欢鐨勫0鏄庢柟寮忔敼涓轰簡绫诲紡鐨勫啓娉曪紝鏂逛究涓嶵ypeScript缁撳悎銆傚彟澶栵紝vue鐨勬簮鐮佷篃鏄敤TypeScript鍐欑殑銆傚叾瀹炲綋浠g爜鐨勫姛鑳芥瘮杈冨鏉傜殑鏃跺€欙紝灏卞繀椤昏鏈変竴涓潤鎬佺被鍨嬬郴缁熸潵鍋氫竴浜涜緟鍔╃鐞嗐€傜幇鍦╲ue3.0涔熷畬鍏ㄧ敤TypeScript閲嶅啓浜嗭紝杩欎娇寰桾ypeScript鍜屽澶栨毚闇茬殑API缁撳悎璧锋潵鏇村姞瀹规槗銆傞潤鎬佺被鍨嬬郴缁熷浜庣淮鎶ゅ鏉備唬鐮佺‘瀹炴槸蹇呰鐨勩€?4)鍏朵粬鏂归潰鐨勫彉鍖杤ue3.0鐨勫彉鍖栨瘮杈冨叏闈紝涓婇潰鍙秹鍙婂埌涓昏鐨勪笁涓柟闈紝杩樻湁涓€浜涘叾浠栫殑鍙樺寲锛氭敮鎸佽嚜瀹氫箟娓叉煋鍣紝璁﹚eex鍙互浣跨敤鑷畾涔夋覆鏌撳櫒鏉ユ墿灞曪紝鑰屼笉鏄洿鎺ork婧愮爜鏀广€傛敮鎸丗ragment锛堝涓牴鑺傜偣锛夊拰Portal锛堝湪dom鍏朵粬閮ㄥ垎娓叉煋缁勪欢鍐呭锛夌粍浠讹紝骞跺鐞嗕竴浜涚壒娈婂満鏅€傚熀浜巘reeshaking浼樺寲锛屾彁渚涗簡鏇村鐨勫唴缃嚱鏁般€倂ue涓娇鐢ㄤ簡鍝簺璁捐妯″紡1.宸ュ巶妯″紡鈥斺€斾紶鍏ュ弬鏁板垱寤哄疄渚嬭櫄鎷烡OM鏍规嵁涓嶅悓鐨勫弬鏁拌繑鍥炲熀纭€鏍囩鍜岀粍浠禫node鐨刅node2.鍗曚緥妯″紡鈥斺€旀暣涓▼搴忓彧鏈変竴涓疄渚媣uex鍜寁ue-router鐨勬彃浠舵敞鍐屾柟娉昳nstall鍒ゆ柇濡傛灉绯荤粺涓湁瀹炰緥鍒欑洿鎺ヨ繑鍥?.鍙戝竷-璁㈤槄妯″紡锛坴ue浜嬩欢鏈哄埗锛?.瑙傚療鑰呮ā寮忥紙鍝嶅簲寮忔暟鎹師鐞嗭級5.瑁呴グ妯″紡锛?@Decorator鐢ㄦ硶)6.绛栫暐妯″紡绛栫暐妯″紡鏄寚瀵硅薄鏈変竴瀹氱殑琛屼负锛屼絾鏄湪涓嶅悓鐨勫満鏅笅锛岃涓烘湁涓嶅悓鐨勫疄鐜版柟妗堚€斺€旀瘮濡俹ptions鐨勫悎骞剁瓥鐣ue妯℃澘缂栬瘧鍘熺悊Vue鐨勭紪璇戣繃绋嬫槸灏嗘ā鏉胯浆鎹负娓叉煋鍑芥暟鐨勮繃绋嬨€傜涓€姝ワ紝灏嗘ā鏉垮瓧绗︿覆杞崲涓篹lementASTs锛坧arser锛夌浜屾锛屾爣璁癆ST鐨勯潤鎬佽妭鐐癸紝涓昏鐢ㄤ簬铏氭嫙DOM娓叉煋浼樺寲锛坥ptimizer锛夌涓夋锛屼娇鐢╡lementASTs鐢熸垚renderfunctioncodestrings(codegenerator)鐩稿叧浠g爜瑙乪xportfunctioncompileToFunctions(template){//鎴戜滑闇€瑕佸皢html瀛楃涓茶浆涓簉ender鍑芥暟//1.灏唄tml浠g爜杞负ast璇硶鏍慳st鐢ㄤ簬鎻忚堪浠g爜鏈韩褰㈡垚涓€妫垫爲涓嶄粎鍙互鎻忚堪html杩樺彲浠ユ弿杩癱ss鍜宩s璇硶鐨勭粨鏋?/寰堝搴撻兘鐢╝st姣斿webpackbabeleslint绛塴etast=parse(template);//2.浼樺寲闈欐€佽妭鐐?/杩欎釜姣旇緝鏈夋剰鎬濊兘鍘绘簮鐮佺湅鐪嬶紝涓嶅奖鍝嶆牳蹇冨姛鑳藉氨涓嶅幓瀹炵幇//if(options.optimize!==false){//浼樺寲锛圓ST锛岄€夐」锛夛紱//}//3.閫氳繃ast閲嶆柊鐢熸垚浠g爜//鎴戜滑鏈€缁堢敓鎴愮殑浠g爜闇€瑕佸拰render鍑芥暟涓€鏍?/绫讳技_c('div',{id:"app"},_c('div',undefined,_v("hello"+_s(name)),_c('span',undefined,_v("world"))))//_c浠h〃鍒涘缓鍏冪礌_v浠h〃鍒涘缓鏂囨湰_s浠h〃TextJson.stringify--灏嗗璞¤В鏋愭垚鏂囨湰letcode=generate(ast);//浣跨敤with璇硶灏嗚寖鍥存洿鏀逛负this锛岀劧鍚庤皟鐢ㄦ覆鏌撳嚱鏁般€傚彲浠ヤ娇鐢╟all鏉ユ敼鍙榯his锛屾柟渚夸唬鐮佷腑鐨勫彉閲忓彇鍊糽etrenderFn=newFunction(`with(this){return${code}}`);returnrenderFn;}涓轰粈涔堝湪Vue3.0涓娇鐢ㄤ簡Proxy鑰屾斁寮冧簡Object.defineProperty锛烿ue缁勪欢涔嬮棿鏈夊摢浜涢€氫俊鏂瑰紡锛烿ue3.0鍜?.0鐨勫搷搴斿紡鍘熺悊鏈変粈涔堝尯鍒紵vue涓娇鐢ㄤ簡鍝簺璁捐妯″紡锛烿ue鐨勭敓鍛藉懆鏈熸柟娉曟湁鍝簺锛熸偍閫氬父鍦ㄥ摢涓€姝ュ彂閫佽姹傦紵浣犲浣犵殑Vue椤圭洰鍋氫簡鍝簺浼樺寲锛熶綘鐭ラ亾nextTick鍚楋紵vuecli椤圭洰涓璼rc鐩綍涓嬪悇涓枃浠跺す鍜屾枃浠剁殑鐢ㄦ硶浣犵煡閬搉extTick鍚楋紵v-model鐨勫師鐞嗭紵Vue缁勪欢涔嬮棿鏈夊摢浜涢€氫俊鏂瑰紡锛熸洿澶氶潰璇曢璇风偣鍑伙細馃憠寮€鍙戣€呯綉绔?-缁煎悎鍓嶇甯歌vue闈㈣瘯棰?/p>