溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

vue3?$attrs和inheritAttrs怎么用

發(fā)布時(shí)間:2022-04-29 09:09:11 來源:億速云 閱讀:806 作者:iii 欄目:開發(fā)技術(shù)

今天小編給大家分享一下vue3 $attrs和inheritAttrs怎么用的相關(guān)知識(shí)點(diǎn),內(nèi)容詳細(xì),邏輯清晰,相信大部分人都還太了解這方面的知識(shí),所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

    $attrs和inheritAttrs用法

    • $attrs屬性解釋:包含了父作用域中不作為組件 props 或自定義事件的 attribute 綁定和事件。當(dāng)一個(gè)組件沒有聲明任何prop 時(shí),這里會(huì)包含所有父作用域的綁定,并且可以通過 v-bind="$attrs" 傳入內(nèi)部組件——這在創(chuàng)建高階的組件時(shí)會(huì)非常有用。

    • inheritAttrs屬性解釋:如果你不希望組件的根元素繼承特性,你可以在組件的選項(xiàng)中設(shè)置 inheritAttrs: false

    可能不是很好理解,我們可以舉個(gè)例子來驗(yàn)證一下。

    在父組件app.vue中

    <template>
      <div>
        <MyInput type="text" placeholder="輸入用戶名" v-model="state.text" />
        <MyInput type="password" placeholder="輸入密碼"  v-model="state.pass"  />
      </div>
    </template>
    <script setup>
    import MyInput from "@/components/myInput.vue";
    import { reactive } from "vue";
    const state = reactive({
      text: "",
      pass: "",
    });
    </script>

    子組件 myInput.vue 設(shè)置 inheritAttrs: true(默認(rèn))

    <template>
      <div class="input">
        <input v-bind="$attrs" v-model="modelValue" />
      </div>
    </template>
    <script>
    export default {
      props: {
        modelValue: [String, Number],
      },
    };
    </script>

    vue3?$attrs和inheritAttrs怎么用

    子組件 myInput.vue 設(shè)置 inheritAttrs: false

    <template>
      <div class="input">
        <input v-bind="$attrs" v-model="modelValue"/>
      </div>
    </template>
    <script>
    export default {
      inheritAttrs: false,
      props: {
        modelValue: [String, Number],
      },
    };
    </script>

    vue3?$attrs和inheritAttrs怎么用

    小結(jié):

    由上述例子可以看出,子組件的props中未注冊父組件傳遞過來的屬性。

    • 當(dāng)設(shè)置inheritAttrs:true時(shí),子組件的頂層標(biāo)簽元素中會(huì)渲染出父組件傳遞過來的屬性(例如:type="text"等)

    • 當(dāng)設(shè)置inheritAttrs: false時(shí),子組件的頂層標(biāo)簽元素中不會(huì)渲染出父組件傳遞過來的屬性

    • 不管inheritAttrs為true或者false,子組件中都能通過$attrs屬性獲取到父組件中傳遞過來的屬性。

    $attrs和inheritAttrs實(shí)例

    官網(wǎng)的文檔簡短而又不清晰,實(shí)在是看不懂,只好自己找代碼驗(yàn)證來看看是什么意思:

    <!DOCTYPE html>
    <html lang="en">
     
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Document</title>
        <script src="https://cdn.bootcdn.net/ajax/libs/vue/3.1.5/vue.global.js"></script>
    </head>
     
    <body>
        <div id="app">
            <father :v1="'value1'" :v2="'value2'" :v3="'value3'"></father>
        </div>
    </body>
     
    </html>
    <script>
    const app = Vue.createApp({
        data() {
            return {}
        },
    })
    app.component('father', {
     // inheritAttrs: false,
        props: ['v1'],
        template: ` <div><p>v1 is {{v1}}</p>
    		  <son v-bind='$attrs' :some="1"></son>
    	       </div>`,
        created() {
            console.log('father:', this.$attrs)
        }
    })
    app.component('son', {
        // inheritAttrs: false,
        props: ['v2'],
        template: `<div><p>v2 is {{v2}}</p>
                         <grandSon v-bind='$attrs'></grandSon>
                  </div>`,
        created() {
            console.log('son:', this.$attrs)
        }
    })
    app.component('grandSon', {
        props: ['v3'],
        template: `<p>v3 is {{v3}}</p>`,
        created() {
            console.log('grandSon:', this.$attrs)
        }
    })
    app.mount('#app')
    </script>

    頁面顯示的結(jié)果:

    v1 is value1 

    v2 is value2 

    v3 is value3

    頁面源代碼:

    <div id="app" data-v-app="">
       <div v2="value2" v3="value3"> <!-- 這是father -->
          <p>v1 is value1</p>
          <div v3="value3" some="1">  <!-- 這是 son-->
              <p>v2 is value2</p>
               <p some="1">v3 is value3</p>  <!-- 這是 grandSon -->
          </div>
       </div>
    </div>

    控制臺(tái)打印是當(dāng)前組件的$attrs:

    father: Proxy {v2: "value2", v3: "value3", __vInternal: 1}

    son: Proxy {v3: "value3", some: 1, __vInternal: 1}

    grandSon: Proxy {some: 1, __vInternal: 1}

    首選,father組件被傳入了3個(gè)值,但是實(shí)際使用props接收的只有v1,v2和v3作為attributes在DOM里面渲染了。

    vue3?$attrs和inheritAttrs怎么用

    上圖的devtool 也可以說明,另外就是控制臺(tái)也同時(shí)證明了。

    同樣son組件只是接收v2作為prop:

    vue3?$attrs和inheritAttrs怎么用

    grandSon組件只是接收v3作為prop

    vue3?$attrs和inheritAttrs怎么用

    father prop:v1,attributes: v2,v3

    son prop:v2 ,attributes:v3,some

    grandSon prop:v3,,attributes: some

    發(fā)現(xiàn)無論是father傳入的3個(gè)值v1,v2,v3還是son又傳入的值':some=1',

    只要不被prop傳入下一層組件,那么一定是在下一層組件的$attrs,也就是說不被作為prop的值會(huì)傳入下一個(gè)組件作為attrs的一員。一個(gè)組件的attrs由父組件傳遞以及自己自帶的組合而成。

    上面說的是$attrs,那么inheritAttrs則說的是attrs繼承,這里的繼承是控制DOM渲染,不繼承也就是不渲染了,但是實(shí)際還是存在這個(gè)attrs的。

    `inheritAttrs`屬性默認(rèn)是true,所以能看到上面的結(jié)論,attrs會(huì)往下傳,當(dāng)設(shè)置為false的時(shí)候就不會(huì)在DOM渲染從上一層繼承來的attrs。

    修改一下代碼:

    app.component('father', {
       inheritAttrs: false,    // 不繼承
        props: ['v1'],
        template: ` <div><p>v1 is {{v1}}</p>
    		  <son v-bind='$attrs' :some="1"></son>
    	       </div>`,
        created() {
            console.log('father:', this.$attrs)
        }
    })

    father組件這不繼承attrs,控制臺(tái)的打印沒變:

    father: Proxy {v2: "value2", v3: "value3", __vInternal: 1}

    son: Proxy {v3: "value3", some: 1, __vInternal: 1}

    grandSon: Proxy {some: 1, __vInternal: 1}

    devtool這里依然可以看到attrs

    vue3?$attrs和inheritAttrs怎么用

    但是看源代碼:

    <div id="app" data-v-app="">
      <div>                          <!-- 這里是 father --> <!-- 看這行 -->
        <p>v1 is value1</p>
        <div v3="value3" some="1">     <!-- 這里是 son-->
          <p>v2 is value2</p>
          <p some="1">v3 is value3</p>   <!-- 這里是 grandSon-->
          </div>
        </div>
    </div>

    DOM渲染里面的v2,v3 attrs都不存在了。

    以上就是“vue3 $attrs和inheritAttrs怎么用”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會(huì)為大家更新不同的知識(shí),如果還想學(xué)習(xí)更多的知識(shí),請關(guān)注億速云行業(yè)資訊頻道。

    向AI問一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI