zerojs前端面試題系列--vue3篇(4)

1. Vue3中的可選鏈運算符(?.)和空值合并運算符(??)是什么牍颈?它們有什么作用至扰?

可選鏈運算符(?.)和空值合并運算符(??)是Vue 3.x中新增的兩種運算符揩晴。

可選鏈運算符(?.)是一種簡化代碼的運算符春哨,它能夠訪問深層次的嵌套對象屬性和方法泌参,而不需要進(jìn)行繁瑣的空值判斷瘟判。如果訪問的屬性或方法不存在,它會返回undefined而不會拋出錯誤震捣。

例如,以下代碼可以通過可選鏈運算符(?.)來避免類型錯誤:

const user = {
  name: 'John',
  address: {
    city: 'New York',
    street: null
  }
}

const streetName = user.address.street?.name; // undefined

空值合并運算符(??)是一種用于處理null或undefined的運算符。如果對左側(cè)的表達(dá)式進(jìn)行求值,結(jié)果為null或undefined灰署,那么它會返回右側(cè)的表達(dá)式。

例如辜伟,以下代碼可以通過空值合并運算符(??)來設(shè)置默認(rèn)值:

const name = user.name ?? 'Anonymous'; // 'John'
const street = user.address.street?.name ?? 'Main Street'; // 'Main Street'

綜上所述氓侧,可選鏈運算符(?.)和空值合并運算符(??)可以讓我們更方便地處理undefined、null和深層次嵌套的屬性和方法导狡,提高代碼的可讀性和可維護(hù)性。

2. Vue3中處理的組件通信方式有哪些偎痛?

在Vue3中旱捧,可以使用以下幾種方式來處理組件傳值:

  1. Props:通過在父組件中使用props屬性來向子組件傳遞數(shù)據(jù)。子組件接收props時踩麦,需要在setup()方法中使用props參數(shù)來獲取枚赡。

  2. Emit:子組件可以通過$emit方法向父組件發(fā)送事件。父組件可以使用v-on指令監(jiān)聽子組件發(fā)出的事件谓谦,并在事件處理函數(shù)中獲取子組件傳遞的數(shù)據(jù)贫橙。

  3. v-model:使用v-model指令可以讓父組件通過雙向綁定來修改子組件中的數(shù)據(jù),同時也可以監(jiān)聽子組件發(fā)出的事件反粥。

  4. Refs:可以使用ref屬性來獲取子組件的引用卢肃,從而直接訪問子組件中的數(shù)據(jù)和方法。

  5. Provide/Inject:可以使用provideinject來在父組件和其所有子孫組件之間共享數(shù)據(jù)和方法才顿。

  6. EventBus:可以使用Vue實例作為事件總線莫湘,在不同的組件中分發(fā)和監(jiān)聽事件。

  7. Vuex/Pinia:狀態(tài)管理工具可以讓應(yīng)用程序中的所有組件共享和管理一個全局狀態(tài)郑气,從而實現(xiàn)組件間的數(shù)據(jù)共享和通信幅垮。其中Vuex是Vue官方提供的狀態(tài)管理庫,而Pinia是一個輕量級的狀態(tài)管理庫尾组。

3. 在vue3的setup方法中忙芒,返回一個對象時,需要注意哪些問題讳侨?返回一個渲染函數(shù)時呵萨,又有哪些注意事項?

在 Vue3 的 setup 方法中爷耀,如果返回一個對象甘桑,則需要注意以下幾點:

  1. 返回的對象中的屬性會變成組件實例的響應(yīng)式數(shù)據(jù),因此需要確保返回的對象屬性和值都是響應(yīng)式數(shù)據(jù)。

  2. 如果需要在 setup 方法中使用組件實例的 this跑杭,可以通過 getCurrentInstance() 方法獲取當(dāng)前組件實例铆帽。

  3. 返回的對象中也可以包含一些函數(shù)或計算屬性,它們也可以訪問到響應(yīng)式數(shù)據(jù)德谅。

舉個例子:

import { ref } from 'vue';

export default {
  setup() {
    const count = ref(0);
    const increment = () => {
      count.value++;
    };
    const fullName = computed(() => {
      return `${firstName.value} ${lastName.value}`;
    });
    const firstName = ref('Tom');
    const lastName = ref('Smith');
    return {
      count,
      increment,
      fullName,
      firstName,
      lastName
    };
  }
};

在上面的例子中爹橱,返回的對象包含了一個響應(yīng)式數(shù)據(jù) count 和一個修改它的方法 increment,還有一個計算屬性 fullName 和兩個其它的響應(yīng)式數(shù)據(jù) firstNamelastName窄做。

如果返回一個渲染函數(shù)愧驱,則需要注意以下幾點:

  1. 渲染函數(shù)中需要返回一個 VNode 對象,可以使用 h 函數(shù)創(chuàng)建椭盏。

  2. 可以訪問到響應(yīng)式數(shù)據(jù)和方法组砚。

  3. 不能訪問到組件實例的 this

舉個例子:

import { ref, h } from 'vue';

export default {
  setup() {
    const count = ref(0);
    const increment = () => {
      count.value++;
    };
    return () => {
      return h('div', {}, [
        h('p', `Count: ${count.value}`),
        h('button', { onClick: increment }, 'Increment')
      ]);
    };
  }
};

在上面的例子中掏颊,返回一個渲染函數(shù)糟红,根據(jù) count 的值渲染一個包含它和一個按鈕的 div 元素。其中乌叶,increment 方法可以在按鈕的 onClick 事件中使用盆偿。

4. 在Vue3中如何實現(xiàn)遞歸組件?

在Vue 3.0中實現(xiàn)遞歸組件有兩種方法:

  1. 使用template模板定義遞歸組件

可以在組件中使用template模板以遞歸的方式引用組件自身准浴。例如:

<template>
  <div>
    <div>{{name}}</div>
    <div v-if="children">
      <my-component v-for="(child, index) in children" :key="index" :name="child.name" :children="child.children" />
    </div>
  </div>
</template>

<script>
export default {
  name: 'MyComponent',
  props: {
    name: String,
    children: Array
  },
}
</script>
  1. 使用render函數(shù)定義遞歸組件

可以使用render函數(shù)遞歸渲染組件并引用組件自身事扭。例如:

<script>
export default {
  name: 'MyComponent',
  props: {
    name: String,
    children: Array
  },
  render() {
    return h(
      'div',
      [
        h('div', this.name),
        this.children && h(
          'div',
          this.children.map(child => {
            return h(MyComponent, { props: child })
          })
        )
      ]
    )
  }
}
</script>

5. Vue3中的虛擬DOM是如何工作的?它和Vue2相比有哪些不同乐横?

Vue3的虛擬DOM和Vue2的虛擬DOM實現(xiàn)的基本原理是相同的求橄,都是通過將DOM樹映射到JavaScript對象上,然后比較新舊虛擬DOM來確定需要更新的元素晰奖。不同的是谈撒,Vue3的虛擬DOM引入了一些優(yōu)化措施,使其更加高效匾南。下面是Vue3中虛擬DOM的一些特點:

  1. Fragment

Vue3中的虛擬DOM支持Fragment啃匿,即可以同時渲染多個根節(jié)點。這樣可以避免在渲染列表等場景下產(chǎn)生多余的包裹節(jié)點蛆楞,提升了性能和渲染效率溯乒。

  1. 靜態(tài)提升

Vue3中的虛擬DOM引入了靜態(tài)提升的概念,即對于靜態(tài)節(jié)點豹爹,在編譯時會將其提升為全局變量裆悄,這樣可以避免每次渲染時重復(fù)創(chuàng)建相同的靜態(tài)節(jié)點,提升渲染效率臂聋。

  1. 動態(tài)Props緩存

在Vue3中光稼,動態(tài)Props的值會在首次渲染時緩存或南,避免不必要的重新計算和渲染,提升渲染效率艾君。

  1. Teleport

Vue3中新增了Teleport組件采够,可以在組件外部渲染內(nèi)容,這個內(nèi)容會被掛在到body下冰垄,可以用于實現(xiàn)彈出框和對話框等場景蹬癌,避免嵌套多余DOM節(jié)點,提升渲染效率虹茶。

總的來說逝薪,Vue3的虛擬DOM改進(jìn)了一些性能瓶頸,提升了渲染效率蝴罪,使得Vue應(yīng)用性能更加出色董济。

6. Vue3的靜態(tài)提升是什么?

Vue3的靜態(tài)提升是基于編譯器優(yōu)化的一種技術(shù)洲炊,其主要原理是將模板中的靜態(tài)節(jié)點在編譯期間進(jìn)行標(biāo)記感局,并將其生成為一段靜態(tài)渲染函數(shù),這段渲染函數(shù)的執(zhí)行效率更高暂衡,因為它不需要重復(fù)生成和更新靜態(tài)節(jié)點。

具體來說崖瞭,靜態(tài)節(jié)點指的是在組件的渲染過程中不需要進(jìn)行變化的節(jié)點狂巢,比如純文本節(jié)點、靜態(tài)屬性節(jié)點等书聚。在編譯期間唧领,編譯器會根據(jù)模板對靜態(tài)節(jié)點進(jìn)行標(biāo)記,并將其轉(zhuǎn)換為渲染函數(shù)中的靜態(tài)節(jié)點雌续。這些靜態(tài)節(jié)點會在組件初始化時就已經(jīng)生成并保存在緩存中斩个,在渲染過程中直接從緩存中獲取,避免了重復(fù)生成和更新的過程驯杜。

此外受啥,Vue3的編譯器還對動態(tài)節(jié)點進(jìn)行了優(yōu)化,將其轉(zhuǎn)換為更高效的渲染函數(shù)鸽心,在渲染過程中只需要針對動態(tài)節(jié)點進(jìn)行更新滚局,大大提高了組件的渲染效率和性能。

總的來說顽频,Vue3的靜態(tài)提升機(jī)制是基于編譯期間對模板進(jìn)行優(yōu)化的一種技術(shù)藤肢,其主要目的是提高組件的渲染效率,從而提升整個應(yīng)用程序的性能糯景。

舉個例子嘁圈,假設(shè)有如下模板:

<div>
  <p class="title">Static Title</p>
  <p>{{ dynamicText }}</p>
</div>

在編譯時省骂,Vue3會發(fā)現(xiàn)<p class="title">Static Title</p>是一個靜態(tài)節(jié)點,它的 class 和文本內(nèi)容不會被改變最住,因此這個節(jié)點可以被提前創(chuàng)建钞澳,并存儲在一個常量中。而另一個<p>{{ dynamicText }}</p>是一個動態(tài)節(jié)點温学,每次渲染時內(nèi)容都會被改變略贮,因此它不能被提前創(chuàng)建。

通過靜態(tài)提升仗岖,Vue3可以顯著提高渲染性能逃延,特別是當(dāng)頁面中存在大量靜態(tài)節(jié)點或?qū)傩詴r。

小程序刷題

搜索: zerojs零技術(shù)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末轧拄,一起剝皮案震驚了整個濱河市揽祥,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌檩电,老刑警劉巖拄丰,帶你破解...
    沈念sama閱讀 222,807評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異俐末,居然都是意外死亡料按,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,284評論 3 399
  • 文/潘曉璐 我一進(jìn)店門卓箫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來载矿,“玉大人,你說我怎么就攤上這事烹卒∶瓶” “怎么了?”我有些...
    開封第一講書人閱讀 169,589評論 0 363
  • 文/不壞的土叔 我叫張陵旅急,是天一觀的道長逢勾。 經(jīng)常有香客問我,道長藐吮,這世上最難降的妖魔是什么溺拱? 我笑而不...
    開封第一講書人閱讀 60,188評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮炎码,結(jié)果婚禮上盟迟,老公的妹妹穿的比我還像新娘。我一直安慰自己潦闲,他們只是感情好攒菠,可當(dāng)我...
    茶點故事閱讀 69,185評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著歉闰,像睡著了一般辖众。 火紅的嫁衣襯著肌膚如雪卓起。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,785評論 1 314
  • 那天凹炸,我揣著相機(jī)與錄音戏阅,去河邊找鬼。 笑死啤它,一個胖子當(dāng)著我的面吹牛奕筐,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播变骡,決...
    沈念sama閱讀 41,220評論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼离赫,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了塌碌?” 一聲冷哼從身側(cè)響起渊胸,我...
    開封第一講書人閱讀 40,167評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎台妆,沒想到半個月后翎猛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,698評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡接剩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,767評論 3 343
  • 正文 我和宋清朗相戀三年切厘,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片懊缺。...
    茶點故事閱讀 40,912評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡迂卢,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出桐汤,到底是詐尸還是另有隱情,我是刑警寧澤靶壮,帶...
    沈念sama閱讀 36,572評論 5 351
  • 正文 年R本政府宣布怔毛,位于F島的核電站,受9級特大地震影響腾降,放射性物質(zhì)發(fā)生泄漏拣度。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,254評論 3 336
  • 文/蒙蒙 一螃壤、第九天 我趴在偏房一處隱蔽的房頂上張望抗果。 院中可真熱鬧,春花似錦奸晴、人聲如沸冤馏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,746評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽逮光。三九已至代箭,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間涕刚,已是汗流浹背嗡综。 一陣腳步聲響...
    開封第一講書人閱讀 33,859評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留杜漠,地道東北人极景。 一個月前我還...
    沈念sama閱讀 49,359評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像驾茴,于是被迫代替她去往敵國和親盼樟。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,922評論 2 361

推薦閱讀更多精彩內(nèi)容

  • 前段時間總結(jié)的部分面試題沟涨,有需要的可以看下哈~~?? 什么是構(gòu)造函數(shù) 用 new 關(guān)鍵字來調(diào)用的函數(shù)恤批,稱為構(gòu)造函數(shù)。...
    誰在花里胡哨閱讀 583評論 0 3
  • 1. Vue3中如何使用模板引用變量($refs)裹赴? 在Vue3中喜庞,使用模板引用變量需要使用ref函數(shù)。具體步驟如...
    zerojs閱讀 110評論 0 0
  • 1. 什么是Vue3棋返,與Vue2有哪些不同延都? Vue3是Vue.js的下一個主要版本,是一個更加現(xiàn)代化睛竣、高性能晰房、更...
    zerojs閱讀 134評論 0 0
  • 1. 請說說Vue的生命周期,和vue2的有什么區(qū)別射沟? Vue 的生命周期可以分為8個階段:創(chuàng)建前后殊者、掛載前后、更...
    zerojs閱讀 141評論 0 0
  • 一验夯、xue的生命周期是什么 vue每個組件都是獨立的猖吴,,每個組件都有一個屬于他的生命周期挥转,從一個組件創(chuàng)建海蔽、數(shù)據(jù)初始...
    康娜閱讀 851評論 0 0