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

Vue vm.$attrs使用場景詳解

 更新時間:2020年03月08日 10:18:54   作者:_littleTank_  
這篇文章主要介紹了vm.$attrs使用場景詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

1、vm.$attrs簡介

首先我們來看下vue官方對vm.$attrs的介紹:
包含了父作用域中不作為 prop 被識別 (且獲取) 的特性綁定 (class 和 style 除外)。當一個組件沒有聲明任何 prop 時,這里會包含所有父作用域的綁定 (class 和 style 除外),并且可以通過 v-bind="$attrs" 傳入內(nèi)部組件——在創(chuàng)建更高層次的組件時非常有用。
猛一看有點看不明白....

2、場景介紹

vue中一個比較令人煩惱的事情是屬性只能從父組件傳遞給子組件。這也就意味著當你想向嵌套層級比較深組件數(shù)據(jù)傳遞,只能由父組件傳遞給子組件,子組件再傳遞給孫子組件...像下面這樣:

<parent-component :passdown="passdown">

<child-component :passdown="passdown">

<grand-child-component :passdown="passdown">

....

就這樣一層一層的往下傳遞passdown這個變量,最后才能用{{passdown}}。

假如我們需要傳遞的屬性只有1,2個還行,但是如果我們要傳遞的有幾個或者10來個的情況,這會是什么樣的場景,我們會在每個組件不停的props,每個必須寫很多遍。有沒有其它方便的寫法?有,通過vuex的父子組件通信,的確這個是一個方法,但是還有其它的方法,這個就是我們要說的。通過inheritAttrs選項,以及實例屬性$attrs

3、實例:

<template>
 <div class="home">
  <mytest :title="title" :massgae="massgae"></mytest>
 </div>
</template>
<script>
export default {
 name: 'home',
 data () {
  return {
   title:'title1111',
   massgae:'message111'
  }
 },
 components:{
  'mytest':{
   template:`<div>這是個h1標題{{title}}</div>`,
   props:['title'],
   data(){
    return{
     mag:'111'
    }
   },
   created:function(){
    console.log(this.$attrs)//注意這里
   }
  }
 }
}
</script>

上邊的代碼,我們在組件里只是用了title這個屬性,massgae屬性我么是沒有用的,那么下瀏覽器渲染出來是什么樣呢?如下圖:


我們看到:組件內(nèi)未被注冊的屬性將作為普通html元素屬性被渲染,如果想讓屬性能夠向下傳遞,即使prop組件沒有被使用,你也需要在組件上注冊。這樣做會使組件預期功能變得模糊不清,同時也難以維護組件的DRY。在Vue2.4.0,可以在組件定義中添加inheritAttrs:false,組件將不會把未被注冊的props呈現(xiàn)為普通的HTML屬性。但是在組件里我們可以通過其$attrs可以獲取到?jīng)]有使用的注冊屬性,如果需要,我們在這也可以往下繼續(xù)傳遞。

如果我們在子組件里設置 inheritAttrs: false:

components:{
  'mytest':{
   template:`<div>這是個h1標題{{title}}</div>`,
   props:['title'],
   inheritAttrs: false,
   data(){
    return{
     mag:'111'
    }
   },
   created:function(){
    console.log(this.$attrs)//注意這里
   }
  }

渲染效果如下:

不繼承的情況.png

補充:說一下$attrs的使用

有一個頁面由父組件,子組件,孫子組件構(gòu)成,如下:

<template>
  <div style="padding:50px;">
    <childcom :name="name" :age="age" :sex="sex"></childcom>
  </div>
</template>
<script>
export default {
  'name':'test',
  props:[],
  data(){
    return {
      'name':'張三',
      'age':'30',
      'sex':'男'
    }
  },
  components:{
    'childcom':{
      template:`<div>
        <div>{{name}}</div>
        <grandcom v-bind="$attrs"></grandcom>
      </div>`,
      props:['name'],
      components: {
        'grandcom':{
          template:`<div>{{$attrs}}</div>`,
        }
      }
    }
  }
}
</script>

上面的代碼在頁面的效果是如下圖

如果attrs被綁定在子組件childcom上后,我們就可以在孫子組件grandcom里獲取到this.$attrs的值。這個{{$attrs}}的值是父組件中傳遞下來的props(除了子組件childcom組件中props聲明的)。

記住孫子組件grandcom里獲取到this.$attrs的值是除了子組件childcom聲明的元素!記住是除了子組件childcom聲明的元素!例如上面的代碼我在子組件childcom組件的props里聲明了name,那么我在孫子組件grandcom里獲取到的$attrs就不包含name屬性,那么this.$attrs = { 'age':'30', 'sex':'男'}。

說一下$attrs的優(yōu)勢到底在哪

假如我們要做一個頁面,有父組件,子組件,孫子組件,如下:

<template>
  <div>
    <childcom></childcom>
  </div>
</template>
<script>
export default {
  'name':'test',
  props:[],
  data(){
    return {
      'name':'張三',
      'age':'30',
      'sex':'男'
    }
  },
  components:{
    'childcom':{
      template:`<div>
        <div>我是子組件</div>
        <grandcom></grandcom>
      </div>`,
      components: {
        'grandcom':{
          template:`<div>我是孫子組件</div>`,
        }
      }
    }
  }
}
</script>

如上代碼,假如我想在子組件想獲取到父組件的name屬性值,在孫子組件獲取父組件的age屬性值,用props的話就必須在父組件把name和age的值通過props傳遞到子組件,子組件在通過props把age的值傳遞到孫子組件,到這里看明白了吧,孫子組件需要的age在子組件里沒有用到,但是為了能讓孫子組件獲取到,你必須從父組件 傳到子組件,在在子組件傳遞到孫子組件。

但是用$attrs就不用那么麻煩,如下:

<template>
  <div>
    <childcom :name="name" :age="age" :sex="sex"></childcom>
  </div>
</template>
<script>
export default {
  'name':'test',
  props:[],
  data(){
    return {
      'name':'張三',
      'age':'30',
      'sex':'男'
    }
  },
  components:{
    'childcom':{
      props:['name'],
      template:`<div>
        <div>我是子組件  {{name}}</div>
        <grandcom v-bind="$attrs"></grandcom>
      </div>`,
      components: {
        'grandcom':{
          template:`<div>我是孫子組件{{$attrs.age}}</div>`,
        }
      }
    }
  }
}
</script>

子組件綁定了"$attrs",孫子組件就能獲取到除了name屬性外所有由父組件傳遞下來的屬性。如果孫子組件也想獲取到name屬性那么,在綁定個name如下,

 <grandcom v-bind="$attrs" :name="name"></grandcom>

細細體會下是不是這個道理。實在不行的話敲一敲代碼自己試驗下,你就會豁然開朗。

補充一下:inheritAttrs屬性

關(guān)于inheritAttrs這個屬性跟獲取到$attrs的值沒有關(guān)系,inheritAttrs通常在編寫基礎組件時候會用到。官網(wǎng)原話:默認情況下父作用域的不被認作 props 的特性綁定 (attribute bindings) 將會“回退”且作為普通的 HTML 特性應用在子組件的根元素上。當撰寫包裹一個目標元素或另一個組件的組件時,這可能不會總是符合預期行為。通過設置 inheritAttrs 到 false,這些默認行為將會被去掉。而通過 (同樣是 2.4 新增的) 實例屬性 $attrs 可以讓這些特性生效,且可以通過 v-bind 顯性的綁定到非根元素上。

注意:這個選項不影響 class 和 style 綁定。

在Vue2.4.0之前版本,組件內(nèi)未被注冊的屬性將作為普通html元素屬性被渲染。

inheritAttrs到底有啥用?到底用在哪里?看下邊代碼,

<template>
  <childcom :name="name" :age="age" type="text"></childcom>
</template>
<script>
export default {
  'name':'test',
  props:[],
  data(){
    return {
      'name':'張三',
      'age':'30',
      'sex':'男'
    }
  },
  components:{
    'childcom':{
      props:['name','age'],
      template:`<input type="number" style="border:1px solid blue">`,
    }
  }
}
</script>

上面代碼你覺得input上會怎么顯示? 父組件傳遞了type="text",子組件里input 上type="number",那渲染到頁面會是什么樣?渲染圖如下:

默認情況.png

看到?jīng)],父組件傳遞的type="text"覆蓋了input 上type="number",這豈不是把我的input數(shù)據(jù)類型都給改變了,這豈不是有問題,這不是我想要的?。。?!看到這里明白了嗎?回頭去體會下上面官網(wǎng)的原話?。?!

需求:我需要input 上type="number"類型不變,但是我還是要取到父組件的type="text"的值,那么代碼如下:

<template>
  <childcom :name="name" :age="age" type="text"></childcom>
</template>
<script>
export default {
  'name':'test',
  props:[],
  data(){
    return {
      'name':'張三',
      'age':'30',
      'sex':'男'
    }
  },
  components:{
    'childcom':{
      inheritAttrs:false,
      props:['name','age'],
      template:`<input type="number" style="border:1px solid blue">`,
      created () {
        console.log(this.$attrs.type)
      }
    }
  }
}
</script>

頁面渲染圖如下:

需求.png

到這,我想大家都明白了inheritAttrs的作用了吧。默認情況下vue會把父作用域的不被認作 props 的特性綁定 且作為普通的 HTML 特性應用在子組件的根元素上。綁定就綁定,顯示就顯示,沒啥大不了的,但是怕就怕遇到一些特殊的,就比如上面的input的情況,這個時候inheritAttrs:false的作用就出來啦。

順道補充一下:$listeners

父組件-子組件-孫子組件,,,,現(xiàn)在我要你在孫子組件里改變父組件的值,怎么改?有很多方法啦,但是$listeners給我們提供了一個新的思路。話不多說,直接上代碼

<template>
  <div>
    <childcom :name="name" :age="age" :sex="sex" @testChangeName="changeName"></childcom>
  </div>
</template>
<script>
export default {
  'name':'test',
  props:[],
  data(){
    return {
      'name':'張三',
      'age':'30',
      'sex':'男'
    }
  },
  components:{
    'childcom':{
      props:['name'],
      template:`<div>
        <div>我是子組件  {{name}}</div>
        <grandcom v-bind="$attrs" v-on="$listeners"></grandcom>
      </div>`,
      
      components: {
        'grandcom':{
          template:`<div>我是孫子組件-------<button @click="grandChangeName">改變名字</button></div>`,
          methods:{
            grandChangeName(){
              this.$emit('testChangeName','kkkkkk')
            }
          }
        }
      }
    }
  },
  methods:{
    changeName(val){
      this.name = val
    }
  }
}
</script>

頁面渲染如下:

$listeners可以讓你在孫子組件改變父組件的值,是不是很方便............

到此這篇關(guān)于vm.$attrs使用場景詳解的文章就介紹到這了,更多相關(guān)vm.$attrs使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Vue配合Django使用方式

    Vue配合Django使用方式

    Vue.js是前端三大框架之一,以其輕巧、高性能的特性脫穎而出,Vue.js專注于構(gòu)建數(shù)據(jù)驅(qū)動的Web界面,采用漸進式設計,易于上手,支持組件化開發(fā),核心功能包括響應式數(shù)據(jù)綁定和視圖組件的組合,Vue還提供了生命周期、事件綁定等多種功能,支持ES6語法
    2024-09-09
  • vue在table表中懸浮顯示數(shù)據(jù)及右鍵菜單

    vue在table表中懸浮顯示數(shù)據(jù)及右鍵菜單

    這篇文章主要為大家詳細介紹了vue在table表中懸浮顯示數(shù)據(jù)及右鍵菜單,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • 手把手教你Vue3?按需引入?Echarts的過程(收藏)

    手把手教你Vue3?按需引入?Echarts的過程(收藏)

    新項目采用?Vue3?作為前端項目框架,避免不了要使用?echarts,但是在使用的時候,出現(xiàn)了與?Vue2?使用不一樣的地方,所以特別記下來,希望給到有需要的同學一些幫助
    2023-10-10
  • vue項目動態(tài)渲染input,綁定的參數(shù)不實時更新問題

    vue項目動態(tài)渲染input,綁定的參數(shù)不實時更新問題

    這篇文章主要介紹了vue項目動態(tài)渲染input,綁定的參數(shù)不實時更新問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • VUE+Element實現(xiàn)增刪改查的示例源碼

    VUE+Element實現(xiàn)增刪改查的示例源碼

    這篇文章主要介紹了VUE+Element實現(xiàn)增刪改查的示例源碼,幫助大家更好的理解和使用vue,感興趣的朋友可以了解下
    2020-11-11
  • Vue3+Element+Ts實現(xiàn)表單的基礎搜索重置等功能

    Vue3+Element+Ts實現(xiàn)表單的基礎搜索重置等功能

    本文主要介紹了Vue3+Element+Ts實現(xiàn)表單的基礎搜索重置等功能,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • Vue.js中用v-bind綁定class的注意事項

    Vue.js中用v-bind綁定class的注意事項

    關(guān)于數(shù)據(jù)綁定一個常見需求就是操作元素的class列表和它的內(nèi)聯(lián)樣式。因為它們都是屬性,我們可以用 v-bind 處理它們,但是使用v-bind綁定class的時候我們要有一些注意事項,下面這篇文章就給大家分享了下要注意的方面,希望能對大家有所幫助,下面來一起看看吧。
    2016-12-12
  • 使用sessionStorage解決vuex在頁面刷新后數(shù)據(jù)被清除的問題

    使用sessionStorage解決vuex在頁面刷新后數(shù)據(jù)被清除的問題

    localStorage沒有時間期限,除非將它移除,sessionStorage即會話,當瀏覽器關(guān)閉時會話結(jié)束,有時間期限,具有自行百度。本文使用的是sessionStorage解決vuex在頁面刷新后數(shù)據(jù)被清除的問題,需要的朋友可以參考下
    2018-04-04
  • Avue?組件庫的使用初體驗

    Avue?組件庫的使用初體驗

    這篇文章主要為大家介紹了Avue?組件庫的使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-08-08
  • vue+echarts定時重新繪制以達到刷新的動效問題

    vue+echarts定時重新繪制以達到刷新的動效問題

    這篇文章主要介紹了vue+echarts定時重新繪制以達到刷新的動效問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-06-06

最新評論

赤水市| 上饶市| 沙湾县| 富民县| 广州市| 维西| 耒阳市| 康乐县| 包头市| 天等县| 塘沽区| 和林格尔县| 甘洛县| 融水| 微博| 榆中县| 临夏县| 加查县| 蓝田县| 新龙县| 郧西县| 来宾市| 常山县| 晋州市| 长沙市| 张家港市| 浦东新区| 富川| 汝城县| 墨玉县| 南溪县| 九江县| 康保县| 石渠县| 淳化县| 绥中县| 独山县| 淮安市| 大英县| 阿图什市| 崇左市|