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

vue $attrs和$listeners的使用與區(qū)別

 更新時(shí)間:2022年02月10日 09:40:32   作者:wangqinquan  
本文主要介紹了vue $attrs和$listeners的使用與區(qū)別,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

首先讓我們看一下這張圖,表示了一個(gè)多級(jí)關(guān)聯(lián)的組件嵌套

為什么要用$attrs$listeners

先讓我們來想一種情況,就是組件A跟組件C怎么通信,我們可以有多少中解決方案?

  • 看到這種情況,大多數(shù)人應(yīng)該會(huì)想到用vuex來進(jìn)行數(shù)據(jù)通信吧,但是如果項(xiàng)目中多個(gè)組件中的共享狀態(tài)很少,且項(xiàng)目比較小,全局?jǐn)?shù)據(jù)通信也很少,那我們用vuex來實(shí)現(xiàn)這個(gè)功能,就感覺有點(diǎn)殺雞用牛刀了
  • 我們可以使用組件B來做通信的中轉(zhuǎn)站,當(dāng)組件A需要把數(shù)據(jù)傳到組件C時(shí),組件A通過props將數(shù)據(jù)傳給組件B,然后組件B再用props傳給組件C,這是一種解決方案,但是如果嵌套的組件過多,就會(huì)導(dǎo)致代碼冗余且繁瑣,維護(hù)就比較困難,而且如果組件C也要將數(shù)據(jù)傳給組件A,也要一層一層往上傳遞,就更麻煩了
  • 自定義一個(gè)Vue數(shù)據(jù)總線,這種適合組件跨級(jí)傳遞數(shù)據(jù),但是缺點(diǎn)是碰到多人合作時(shí),會(huì)導(dǎo)致代碼的維護(hù)性較低,代碼可讀性也較低
  • 還有一種解決方案,就是用provide inject,但是這種方式,官方不推薦,因?yàn)?strong>這個(gè)方法真的是太不好管控了,比如說我在根組件provide了this,孫孫重孫組件去使用了this里面的一個(gè)變量,這時(shí)候很難去跟蹤到這個(gè)變量的出處了,而且你也并不知道,項(xiàng)目中哪個(gè)組件有用到這個(gè)變量,有沒有在其他組件中進(jìn)行改變,所以這個(gè)api在項(xiàng)目中很少人使用,但是很多人拿來寫組件用

在很多開發(fā)情況下,我們只是想把組件A的數(shù)據(jù)傳給組件C,如果用props來進(jìn)行組件通信的話,雖然可以實(shí)現(xiàn),但是代碼可讀性上不強(qiáng),且難維護(hù)。

所以這時(shí)候,我們的主角$attrs$listeners 就出現(xiàn)了

$attrs$listeners 的用法

在vue2.4中,為了解決該需求,引入了$attrs$listeners, 新增了inheritAttrs 選項(xiàng)。 在版本2.4以前,默認(rèn)情況下父作用域的不被認(rèn)作props的屬性屬性百年孤獨(dú),將會(huì)“回退”且作為普通的HTML特性應(yīng)用在子組件的根元素上。如下列的例子

父組件的代碼:

<template>
  <div>
    <child-dom :foo="foo" :bar="bar"></child-dom>
  </div>
</template>
?
<script>
import ChildDom from "../components/attrs/ChildDom.vue";
export default {
  components: {
    ChildDom,
  },
  data() {
    return {
      foo: "foo",
      bar: "bar",
    };
  },
};
</script>

子組件的代碼:

<template>
  <div>
    <p>foo:{{ foo }}</p>
  </div>
</template>
?
<script>
export default {
  props: ["foo"],
};
</script>

我們先看一下這樣寫的時(shí)候,控制臺(tái)打印出來的dom結(jié)構(gòu)是這樣的:

在2.4中新增選項(xiàng)inheritAttrs,inheritAttrs的默認(rèn)值為true, 將inheritAttrs的值設(shè)為false, 這些默認(rèn)的行為會(huì)禁止掉。但是通過實(shí)例屬性 $attrs ,可以將這些特性生效,且可以通過v-bind 綁定到子組件的非根元素上。

將子組件的代碼修改一下:

<template>
  <div>
    <p>foo:{{ foo }}</p>
    <p>attrs: {{ $attrs }}</p>
    <dom-child v-bind="$attrs"></dom-child>
  </div>
</template>
?
<script>
import DomChild from "./DomChild.vue";
export default {
  props: ["foo"],
  inheritAttrs: false,
  components: {
    DomChild,
  },
};
</script>

然后在加一個(gè)孫組件

<template>
  <div>
    <p>bar:{{ bar }}</p>
  </div>
</template>
?
<script>
export default {
  props: ["bar"],
};
</script>

頁(yè)面顯示如下:

從上面的代碼,可以看出使用$attrsinheritAttrs 屬性能夠使用簡(jiǎn)潔的代碼,將組件A的數(shù)據(jù)傳遞給 組件C,該場(chǎng)景的使用范圍還是挺廣的。

那我們現(xiàn)在來看看組件C怎么傳值給組件A?

vue2.4版本新增了$listeners 屬性,我們?cè)诮M件B上 綁定 v-on=”$listeners”, 在組件A中,監(jiān)聽組件C觸發(fā)的事件。就能把組件C發(fā)出的數(shù)據(jù),傳遞給組件A。

修改一下父組件的代碼:

<template>
  <div>
    <child-dom :foo="foo" :bar="bar" @upFoo="update"></child-dom>
  </div>
</template>
?
<script>
import ChildDom from "../components/attrs/ChildDom.vue";
export default {
  components: {
    ChildDom,
  },
  data() {
    return {
      foo: "foo",
      bar: "bar",
    };
  },
  methods: {
    update(val) {
      this.foo = val;
      console.log("update success");
    },
  },
};
</script>

子組件代碼:

<template>
  <div>
    <p>foo:{{ foo }}</p>
    <p>attrs: {{ $attrs }}</p>
    <dom-child v-bind="$attrs" v-on="$listeners"></dom-child>
  </div>
</template>
?
<script>
import DomChild from "./DomChild.vue";
export default {
  props: ["foo"],
  inheritAttrs: false,
  components: {
    DomChild,
  },
};
</script>

孫組件代碼:

<template>
  <div>
    <p>bar:{{ bar }}</p>
    <button @click="startUpFoo">我要更新foo</button>
  </div>
</template>
?
<script>
export default {
  props: ["bar"],
  methods: {
    startUpFoo() {
      this.$emit("upFoo", "foooooooooooo");
      console.log("startUpFoo");
    },
  },
};
</script>

運(yùn)行結(jié)果:

現(xiàn)在我們應(yīng)該清楚了$attrs,$listerners,inheritAttrs 的作用了吧

到此這篇關(guān)于vue $attrs和$listeners的使用與區(qū)別的文章就介紹到這了,更多相關(guān)vue $attrs $listeners內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 在Vue中使用highCharts繪制3d餅圖的方法

    在Vue中使用highCharts繪制3d餅圖的方法

    本篇文章主要介紹了在Vue中使用highCharts繪制3d餅圖的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-02-02
  • Vue刷新當(dāng)前組件的五種方式

    Vue刷新當(dāng)前組件的五種方式

    本文介紹了五種刷新Vue當(dāng)前組件的方法:使用location.reload()、路由刷新、v-if或key屬性、beforeRouteUpdate導(dǎo)航守衛(wèi)以及$forceUpdate,每種方法都有其適用場(chǎng)景和優(yōu)缺點(diǎn),需要的朋友可以參考下
    2025-02-02
  • 如何讓vue長(zhǎng)列表快速加載

    如何讓vue長(zhǎng)列表快速加載

    這篇文章主要介紹了如何讓vue長(zhǎng)列表快速加載,幫助大家更好的理解和學(xué)習(xí)使用vue框架,感興趣的朋友可以了解下
    2021-03-03
  • 解決vue axios跨域 Request Method: OPTIONS問題(預(yù)檢請(qǐng)求)

    解決vue axios跨域 Request Method: OPTIONS問題(預(yù)檢請(qǐng)求)

    這篇文章主要介紹了解決vue axios跨域 Request Method: OPTIONS問題(預(yù)檢請(qǐng)求),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • vue mvvm數(shù)據(jù)響應(yīng)實(shí)現(xiàn)

    vue mvvm數(shù)據(jù)響應(yīng)實(shí)現(xiàn)

    這篇文章主要介紹了vue mvvm數(shù)據(jù)響應(yīng)實(shí)現(xiàn)的方法,幫助大家更好的理解和使用vue,感興趣的朋友可以了解下
    2020-11-11
  • VUE 實(shí)現(xiàn)element upload上傳圖片到阿里云

    VUE 實(shí)現(xiàn)element upload上傳圖片到阿里云

    這篇文章主要介紹了VUE 實(shí)現(xiàn)element upload上傳圖片到阿里云,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • Vue中KeepAlive內(nèi)置緩存使用詳解

    Vue中KeepAlive內(nèi)置緩存使用詳解

    KeepAlive 是 vue 中的內(nèi)置組件,當(dāng)多個(gè)組件動(dòng)態(tài)切換時(shí)可以對(duì)實(shí)例狀態(tài)進(jìn)行緩存,本文就來詳細(xì)的介紹一下Vue中KeepAlive內(nèi)置緩存使用,感興趣的可以了解一下
    2023-10-10
  • vue如何根據(jù)數(shù)值判斷顏色

    vue如何根據(jù)數(shù)值判斷顏色

    這篇文章主要介紹了vue如何根據(jù)數(shù)值判斷顏色問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • Vue3中Vuex狀態(tài)管理學(xué)習(xí)實(shí)戰(zhàn)示例詳解

    Vue3中Vuex狀態(tài)管理學(xué)習(xí)實(shí)戰(zhàn)示例詳解

    這篇文章主要為大家介紹了Vue3中Vuex狀態(tài)管理學(xué)習(xí)實(shí)戰(zhàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • 詳解vue-router基本使用

    詳解vue-router基本使用

    本篇文章主要介紹了詳解vue-router基本使用,詳細(xì)的介紹了vue-router的概念和用法,有興趣的可以了解一下。
    2017-04-04

最新評(píng)論

临泽县| 酒泉市| 永吉县| 内黄县| 建瓯市| 澜沧| 大英县| 鄂托克前旗| 沿河| 凤冈县| 大荔县| 寿阳县| SHOW| 南阳市| 七台河市| 太和县| 广平县| 贵州省| 万安县| 会东县| 若尔盖县| 石屏县| 隆尧县| 瓦房店市| 安福县| 海晏县| 自贡市| 乐山市| 贵德县| 苏尼特右旗| 星座| 浏阳市| 泰顺县| 刚察县| 石楼县| 满洲里市| 如东县| 盈江县| 惠安县| 莱西市| 龙山县|