最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

vue3 $attrs和inheritAttrs的用法說明

 更新時間:2022年04月28日 17:10:02   作者:hao_0413  
這篇文章主要介紹了vue3 $attrs和inheritAttrs的用法說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

$attrs和inheritAttrs用法

  • $attrs屬性解釋:包含了父作用域中不作為組件 props 或自定義事件的 attribute 綁定和事件。當(dāng)一個組件沒有聲明任何prop 時,這里會包含所有父作用域的綁定,并且可以通過 v-bind="$attrs" 傳入內(nèi)部組件——這在創(chuàng)建高階的組件時會非常有用。
  • inheritAttrs屬性解釋:如果你不希望組件的根元素繼承特性,你可以在組件的選項中設(shè)置 inheritAttrs: false

可能不是很好理解,我們可以舉個例子來驗證一下。

在父組件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>

子組件 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>

小結(jié):

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

  • 當(dāng)設(shè)置inheritAttrs:true時,子組件的頂層標(biāo)簽元素中會渲染出父組件傳遞過來的屬性(例如:type="text"等)
  • 當(dāng)設(shè)置inheritAttrs: false時,子組件的頂層標(biāo)簽元素中不會渲染出父組件傳遞過來的屬性
  • 不管inheritAttrs為true或者false,子組件中都能通過$attrs屬性獲取到父組件中傳遞過來的屬性。

$attrs和inheritAttrs實例

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

<!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>

控制臺打印是當(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個值,但是實際使用props接收的只有v1,v2和v3作為attributes在DOM里面渲染了。

上圖的devtool 也可以說明,另外就是控制臺也同時證明了。

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

grandSon組件只是接收v3作為prop

father prop:v1,attributes: v2,v3

son prop:v2 ,attributes:v3,some

grandSon prop:v3,,attributes: some

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

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

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

`inheritAttrs`屬性默認(rèn)是true,所以能看到上面的結(jié)論,attrs會往下傳,當(dāng)設(shè)置為false的時候就不會在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,控制臺的打印沒變:

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

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

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

devtool這里依然可以看到attrs

但是看源代碼:

<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都不存在了。

所以綜合總結(jié)一下:

$attrs就是給組件傳值排除了作為prop的那部分(比如father的v2,v3),包括了(class,id)inheritAttrs只是用來控制attrs是否在DOM中渲染。

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 使用Plotly.js在Vue中創(chuàng)建交互式散點圖的示例代碼

    使用Plotly.js在Vue中創(chuàng)建交互式散點圖的示例代碼

    Plotly.js是一個功能強(qiáng)大的JavaScript庫,用于創(chuàng)建交互式數(shù)據(jù)可視化,它支持各種圖表類型,包括散點圖、折線圖和直方圖,在Vue.js應(yīng)用程序中,Plotly.js可用于創(chuàng)建動態(tài)且引人入勝的數(shù)據(jù)可視化,本文介紹了使用Plotly.js在Vue中創(chuàng)建交互式散點圖,需要的朋友可以參考下
    2024-07-07
  • vue使用 better-scroll的參數(shù)和方法詳解

    vue使用 better-scroll的參數(shù)和方法詳解

    這篇文章主要介紹了vue使用 better-scroll的參數(shù)和方法詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-01-01
  • 用vue設(shè)計一個日歷表

    用vue設(shè)計一個日歷表

    這篇文章主要介紹了如何用vue設(shè)計一個日歷表,幫助大家更好的理解和學(xué)習(xí)vue框架,感興趣的朋友可以了解下
    2020-12-12
  • vue3?HTTP請求中的axios示例詳解

    vue3?HTTP請求中的axios示例詳解

    Axios?是一個簡單的基于?promise?的?HTTP?客戶端,適用于瀏覽器和?node.js。Axios?在具有非常可擴(kuò)展的接口的小包中提供了一個簡單易用的庫,這篇文章主要介紹了vue3-HTTP請求之a(chǎn)xios,需要的朋友可以參考下
    2022-12-12
  • Vue3中ref與reactive的詳解與擴(kuò)展

    Vue3中ref與reactive的詳解與擴(kuò)展

    在vue3中對響應(yīng)式數(shù)據(jù)的聲明官方給出了ref()和reactive()這兩種方式,下面這篇文章主要給大家介紹了關(guān)于Vue3中ref與reactive的相關(guān)資料,需要的朋友可以參考下
    2021-06-06
  • Vue3?PC端頁面開發(fā)規(guī)范及說明

    Vue3?PC端頁面開發(fā)規(guī)范及說明

    這篇文章主要介紹了Vue3?PC端頁面開發(fā)規(guī)范及說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • vue路由傳參的基本實現(xiàn)方式小結(jié)【三種方式】

    vue路由傳參的基本實現(xiàn)方式小結(jié)【三種方式】

    這篇文章主要介紹了vue路由傳參的基本實現(xiàn)方式,結(jié)合實例形式總結(jié)分析了vue.js路由傳參的三種實現(xiàn)方式,包括params顯示傳參、不顯示參數(shù)以及query顯示參數(shù)傳參,需要的朋友可以參考下
    2020-02-02
  • Vue.set()實現(xiàn)數(shù)據(jù)動態(tài)響應(yīng)的方法

    Vue.set()實現(xiàn)數(shù)據(jù)動態(tài)響應(yīng)的方法

    這篇文章主要介紹了Vue.set()實現(xiàn)數(shù)據(jù)動態(tài)響應(yīng)的相關(guān)知識,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2018-02-02
  • Vue中created和mounted使用詳解

    Vue中created和mounted使用詳解

    Vue中生命周期包括多個階段,如created和mounted,每階段有特定鉤子函數(shù),生命周期與瀏覽器渲染過程密切相關(guān),了解這些可以優(yōu)化頁面渲染和數(shù)據(jù)處理,created階段適用于數(shù)據(jù)初始化,而mounted階段適合進(jìn)行DOM操作和頁面渲染后的處理
    2024-10-10
  • 解決vue-pdf的簽章不顯示問題記錄

    解決vue-pdf的簽章不顯示問題記錄

    文章介紹了使用vue-pdf@4.3.0時遇到的上傳特殊PDF文件無法正常預(yù)覽的問題,通過查看控制臺報錯信息,發(fā)現(xiàn)是因為缺少字體導(dǎo)致的,解決方法是修改pdfjs-dist庫的代碼,注釋掉隱藏電子簽章的代碼,為了在生產(chǎn)環(huán)境中應(yīng)用這個修改,使用了patch-package插件,感興趣的朋友一起看看吧
    2024-11-11

最新評論

万州区| 营山县| 大渡口区| 隆子县| 四子王旗| 孟津县| 滦平县| 建平县| 遂昌县| 大庆市| 太仆寺旗| 伊宁县| 怀来县| 高陵县| 平利县| 伊吾县| 墨竹工卡县| 璧山县| 大埔区| 边坝县| 琼海市| 漯河市| 公主岭市| 北流市| 丰县| 乌审旗| 专栏| 武山县| 黑龙江省| 博客| 华宁县| 平南县| 双柏县| 清水县| 永定县| 河曲县| 陇川县| 龙岩市| 温宿县| 铅山县| 汉阴县|