二、基礎(chǔ)知識

  1. v-bind="{ a: 1, b: 1 }"這種寫法可以將對象里的所有屬性綁定
  2. v-on="onChange($event, ...arguments)"這種寫法可以傳事件對象為第一個參數(shù)尚粘,其他參數(shù)依次往后傳遞离赫。
  3. v-show不能放在template上使用魂迄,也不能和v-else使用注服,為false時元素會加上display:none
  4. v-for可以和template標(biāo)簽一起使用
<template v-for="item in list"></template>
  1. 數(shù)組更新檢測
  • push()
  • pop()
  • shift()
  • unshift()
  • splice()
  • sort()
  • reserve()
  1. v-for中的key是什么作用?
    官方的解釋:
  • key屬性主要用在Vue的虛擬DOM算法澎埠,在新舊nodes對比時辨識VNodes虽缕;
  • 如果不使用key,Vue會使用一種最大限度減少動態(tài)元素并且盡可能的嘗試就地修改/復(fù)用相同類型元素的算法蒲稳;
  • 而使用key時氮趋,它會基于key的變化重新排列元素順序,并且會移除/銷毀key不存在的元素江耀;

Vue事實上會對于有key和沒有key會調(diào)用兩個不同的方法剩胁;有key,那么就使用 patchKeyedChildren方法祥国;沒有key昵观,那么久使用 patchUnkeyedChildren方法;

沒有key的過程如下:

  • c和d來說它們事實上并不需要有任何的改動舌稀;
  • 但是因為我們的c被f所使用了啊犬,所有后續(xù)所有的內(nèi)容都要一次進(jìn)行改動,并且最后進(jìn)行新增壁查;


    image.png

有key的diff算法如下:
第一步的操作是從頭開始進(jìn)行遍歷觉至、比較:

  • a和b是一致的會繼續(xù)進(jìn)行比較;
  • c和f因為key不一致睡腿,所以就會break跳出循環(huán)语御;
image.png

第二步的操作是從尾部開始進(jìn)行遍歷领斥、比較:


image.png

第三步是如果舊節(jié)點遍歷完畢,但是依然有新的節(jié)點沃暗,那么就新增節(jié)點:


image.png

第四步是如果新的節(jié)點遍歷完畢,但是依然有舊的節(jié)點何恶,那么就移除舊節(jié)點:
image.png

第五步是最特色的情況孽锥,中間還有很多未知的或者亂序的節(jié)點:



所以我們可以發(fā)現(xiàn),Vue在進(jìn)行diff算法的時候细层,會盡量利用我們的key來進(jìn)行優(yōu)化操作:
  • 在沒有key的時候我們的效率是非常低效的惜辑;
  • 在進(jìn)行插入或者重置順序的時候,保持相同的key可以讓diff算法更加的高效疫赎;
  1. 源碼如何對computedd的setter和getter處理呢盛撑?
    事實上非常的簡單,Vue源碼內(nèi)部只是做了一個邏輯判斷而已捧搞;


    image.png
  2. watch監(jiān)聽對象


    image.png
  • 使用一個選項deep進(jìn)行更深層的偵聽抵卫;
  • 使用immediate選項, 望一開始的就會立即執(zhí)行一次
  1. watch其他監(jiān)聽器的寫法:
watch: {
  a: 'onChange'
},
methods: {
  onChange (val, old) {}
}

還可以在created的生命周期中胎撇,使用 this.$watchs 來偵聽:

  • 第一個參數(shù)是要偵聽的源
  • 第二個參數(shù)是偵聽的回調(diào)函數(shù)callback介粘;
  • 第三個參數(shù)是額外的其他選項,比如deep晚树、immediate姻采;
image.png
  1. v-model的原理
    v-model的原理其實是背后有兩個操作:
  • v-bind綁定value屬性的值;
  • v-on綁定input事件監(jiān)聽到函數(shù)中爵憎,函數(shù)會獲取最新的值賦值到綁定的屬性中慨亲;
  1. v-model修飾符
  • lazy
    如果我們在v-model后跟上lazy修飾符,那么會將綁定的事件切換為 change 事件宝鼓,只有在提交時(比如回車)
    才會觸發(fā)刑棵;
  • number
    如果我們希望轉(zhuǎn)換為數(shù)字類型,那么可以使用 .number 修飾符愚铡,在我們進(jìn)行邏輯判斷時铐望,如果是一個string類型,在可以轉(zhuǎn)化的情況下會進(jìn)行隱式轉(zhuǎn)換的
  • trim
    如果要自動過濾用戶輸入的守衛(wèi)空白字符茂附,可以給v-model添加 trim 修飾符
  1. 當(dāng)我們傳遞給一個組件某個屬性正蛙,但是該屬性并沒有定義對應(yīng)的props或者emits時,就稱之為 非Prop的Attribute营曼,常見的包括class乒验、style、id屬性等蒂阱。當(dāng)組件有單個根節(jié)點時锻全,非Prop的Attribute將自動添加到根節(jié)點的Attribute中狂塘,如果我們不希望組件的根元素繼承attribute,可以在組件中設(shè)置 inheritAttrs: false鳄厌【浜担可以通過 $attrs來訪問所有的 非props的attribute,多個根節(jié)點的attribute如果沒有顯示的綁定瓷炮,那么會報警告咧七,我們必須手動的指定要綁定到哪一個屬性上。

  2. 子組件向父組件emit事件:
    vue3新增申明emits:
    可以是一個數(shù)組:
    emits: ["add", "sub", "addN"]
    也可以是對象用來驗證參數(shù)歪泳,只是起到警告作用萝勤,驗證不通過依然會傳給父組件:

 emits: {
      add: null,
      sub: null,
      addN: (num, name, age) => {
        console.log(num, name, age);
        if (num > 10) {
          return true
        }
        return false;
      }
},
  1. 非父子組件的通信
  • Provide和Inject
    父組件
    provide() {
        return {
          name: "why",
          age: 18,
          length: computed(() => this.names.length) // ref對象 .value
        }
      },
    
    子組件
<template>
 <div>
   HomeContent: {{name}} - {{age}} - {{length.value}}
 </div>
</template>

<script>
 export default {
   inject: ["name", "age", "length"],
 }
</script>

<style scoped>

</style>
  • 全局事件總線mitt庫
    npm install mitt
import mitt from 'mitt';
const emitter = mitt();
export default emitter;

      btnClick() {
        console.log("about按鈕的點擊");
        emitter.emit("why", {name: "why", age: 18});
      }

    created() {
      emitter.on("why", (info) => {
        console.log("why:", info);
      });

      emitter.on("kobe", (info) => {
        console.log("kobe:", info);
      });

      emitter.on("*", (type, info) => {
        console.log("* listener:", type, info);
      })
    }
  1. 異步組件的使用
const AsyncCategory = defineAsyncComponent(() => import("./AsyncCategory.vue"))

  const AsyncCategory = defineAsyncComponent({
    loader: () => import("./AsyncCategory.vue"),
    loadingComponent: Loading,
    // errorComponent,
    // 在顯示loadingComponent組件之前, 等待多長時間
    delay: 2000,
    /**
     * err: 錯誤信息,
     * retry: 函數(shù), 調(diào)用retry嘗試重新加載
     * attempts: 記錄嘗試的次數(shù)
     */
    onError: function(err, retry, attempts) {

    }
  })
  1. 組件的v-model
    組件的v-model實際做了兩件事:
    <hy-input v-model="message"></hy-input>
   <!-- 綁定兩個v-model -->
    <hy-input v-model="message" v-model:title="title"></hy-input>
    <hy-input :modelValue="message" @update:model-value="message = $event"></hy-input>

組件需要$emit(update:modelValue)。

配合組件自己的input的v-model使用:

<template>
  <div>
    <input v-model="value">
    
  </div>
</template>

<script>
  export default {
    props: {
      modelValue: String
    },
    emits: ["update:modelValue"],
    computed: {
      value: {
        set(value) {
          this.$emit("update:modelValue", value);
        },
        get() {
          return this.modelValue;
        }
      }
    },
    methods: {
      btnClick(event) {
        this.$emit("update:modelValue", event.target.value);
      }
    }
  }
</script>

<style scoped>

</style>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末呐伞,一起剝皮案震驚了整個濱河市敌卓,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌伶氢,老刑警劉巖趟径,帶你破解...
    沈念sama閱讀 216,919評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異癣防,居然都是意外死亡舵抹,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,567評論 3 392
  • 文/潘曉璐 我一進(jìn)店門劣砍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來惧蛹,“玉大人,你說我怎么就攤上這事刑枝∠闵ぃ” “怎么了?”我有些...
    開封第一講書人閱讀 163,316評論 0 353
  • 文/不壞的土叔 我叫張陵装畅,是天一觀的道長靠娱。 經(jīng)常有香客問我,道長掠兄,這世上最難降的妖魔是什么像云? 我笑而不...
    開封第一講書人閱讀 58,294評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮蚂夕,結(jié)果婚禮上迅诬,老公的妹妹穿的比我還像新娘。我一直安慰自己婿牍,他們只是感情好侈贷,可當(dāng)我...
    茶點故事閱讀 67,318評論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著等脂,像睡著了一般俏蛮。 火紅的嫁衣襯著肌膚如雪撑蚌。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,245評論 1 299
  • 那天搏屑,我揣著相機(jī)與錄音争涌,去河邊找鬼。 笑死辣恋,一個胖子當(dāng)著我的面吹牛亮垫,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播抑党,決...
    沈念sama閱讀 40,120評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼撵摆!你這毒婦竟也來了底靠?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,964評論 0 275
  • 序言:老撾萬榮一對情侶失蹤特铝,失蹤者是張志新(化名)和其女友劉穎暑中,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鲫剿,經(jīng)...
    沈念sama閱讀 45,376評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡鳄逾,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,592評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了灵莲。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片雕凹。...
    茶點故事閱讀 39,764評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖政冻,靈堂內(nèi)的尸體忽然破棺而出枚抵,到底是詐尸還是另有隱情,我是刑警寧澤明场,帶...
    沈念sama閱讀 35,460評論 5 344
  • 正文 年R本政府宣布汽摹,位于F島的核電站,受9級特大地震影響苦锨,放射性物質(zhì)發(fā)生泄漏逼泣。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,070評論 3 327
  • 文/蒙蒙 一舟舒、第九天 我趴在偏房一處隱蔽的房頂上張望拉庶。 院中可真熱鬧,春花似錦秃励、人聲如沸砍的。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,697評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽廓鞠。三九已至帚稠,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間床佳,已是汗流浹背滋早。 一陣腳步聲響...
    開封第一講書人閱讀 32,846評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留砌们,地道東北人杆麸。 一個月前我還...
    沈念sama閱讀 47,819評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像浪感,于是被迫代替她去往敵國和親昔头。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,665評論 2 354

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