日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Vue vm.$attrs使用場景詳解

瀏覽:174日期:2023-02-02 09:56:17

1、vm.$attrs簡介

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

2、場景介紹

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

<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屬性我么是沒有用的,那么下瀏覽器渲染出來是什么樣呢?如下圖:

Vue vm.$attrs使用場景詳解

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

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

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

渲染效果如下:

Vue vm.$attrs使用場景詳解

不繼承的情況.png

補充:說一下$attrs的使用

有一個頁面由父組件,子組件,孫子組件構成,如下:

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

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

Vue vm.$attrs使用場景詳解

如果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的優勢到底在哪

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

<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屬性

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

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

在Vue2.4.0之前版本,組件內未被注冊的屬性將作為普通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',那渲染到頁面會是什么樣?渲染圖如下:

Vue vm.$attrs使用場景詳解

默認情況.png

看到沒,父組件傳遞的type='text'覆蓋了input 上type='number',這豈不是把我的input數據類型都給改變了,這豈不是有問題,這不是我想要的!!!!看到這里明白了嗎?回頭去體會下上面官網的原話!!!

需求:我需要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>

頁面渲染圖如下:

Vue vm.$attrs使用場景詳解

需求.png

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

順道補充一下:$listeners

父組件-子組件-孫子組件,,,,現在我要你在孫子組件里改變父組件的值,怎么改?有很多方法啦,但是$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>

頁面渲染如下:

Vue vm.$attrs使用場景詳解

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

到此這篇關于vm.$attrs使用場景詳解的文章就介紹到這了,更多相關vm.$attrs使用內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Vue
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
美日韩精品视频| 国产欧美一区二区三区精品酒店| 色爱av综合网| 99在线精品免费视频九九视| 国产第一亚洲| 欧美久久精品| 最新亚洲国产| 国产精品呻吟| 99在线观看免费视频精品观看| 精品国产黄a∨片高清在线| 国产精品啊啊啊| 亚洲精品在线二区| 婷婷精品在线| 91亚洲自偷观看高清| 美女视频一区在线观看| 日韩成人亚洲| 国产网站在线| 日本a级不卡| 久久精品国产999大香线蕉| 麻豆mv在线观看| 1024精品一区二区三区| 日韩精品一区二区三区免费观看| 激情综合亚洲| 噜噜噜躁狠狠躁狠狠精品视频| 妖精视频成人观看www| 精品国产一区二区三区2021| 国产videos久久| 97精品久久| 久久精品高清| 91一区二区| 国产成人精品三级高清久久91| 天堂av在线一区| 精品免费视频| 亚洲精品一二三**| 欧美日韩视频网站| 男女性色大片免费观看一区二区| 国产999精品在线观看 | 日本综合精品一区| 播放一区二区| 久久香蕉网站| 国产精品一卡| 蜜臀久久久久久久| 欧美va天堂在线| 91视频一区| 国产欧美日韩一级| 日韩午夜视频在线| 欧美资源在线| 国产乱码精品一区二区三区四区 | 日韩高清一区在线| 亚洲激情精品| 98精品久久久久久久| 美女黄网久久| 国产精品字幕| 人人精品久久| 国产婷婷精品| 日韩二区三区在线观看| 精品日韩一区| 日韩国产一二三区| 欧美网站在线| 欧美成a人国产精品高清乱码在线观看片在线观看久 | 亚洲18在线| 亚洲国产一区二区在线观看| 国产亚洲午夜| 久久国产88| 91欧美在线| 米奇777超碰欧美日韩亚洲| 久久亚洲道色| 不卡中文一二三区| 综合一区在线| 尹人成人综合网| 精品国产免费人成网站| 国产成人精品三级高清久久91| 蜜桃一区二区三区在线观看| 久久精品播放| av资源中文在线| 日韩在线观看一区| 激情婷婷亚洲| 视频一区二区欧美| 国产日韩免费| 日韩va亚洲va欧美va久久| 美美哒免费高清在线观看视频一区二区| 在线成人直播| 日本午夜精品一区二区三区电影| 精品三级av| 免费视频一区二区| 精品视频国内| 九色精品91| 国产美女亚洲精品7777| 波多视频一区| 在线观看一区| 欧美aa在线观看| 日韩极品在线观看| 欧美一区二区性| 国产欧美三级| 91精品国产福利在线观看麻豆| 美女91精品| 国产 日韩 欧美一区| 日本电影久久久| 亚洲激情中文在线| 国语对白精品一区二区| 免费日韩av片| 中文字幕在线高清| 欧美日本精品| 亚洲男女自偷自拍| 久久久夜精品| 91av亚洲| 国产精品手机在线播放| 亚洲欧美日韩综合国产aⅴ| 成人国产综合| 日本不卡在线视频| 奶水喷射视频一区| 日本不良网站在线观看| 久久精品999| 日本精品国产| 一二三区精品| 先锋亚洲精品| 国产亚洲精品久久久久婷婷瑜伽| 色爱综合av| 日韩啪啪电影网| 在线亚洲人成| 成人va天堂| 日本а中文在线天堂| 国内揄拍国内精品久久| 国产精品久久777777毛茸茸| 狠狠干综合网| 不卡中文一二三区| 午夜精品网站| 亚洲国产一区二区在线观看 | se01亚洲视频| 99久久九九| 国产精品亚洲欧美日韩一区在线| 精品1区2区3区4区| 日韩在线a电影| 日本不卡一二三区黄网| 欧美韩一区二区| 国产网站在线| 欧美日韩国产亚洲一区| 丝瓜av网站精品一区二区| 欧美在线资源| 亚洲久久在线| 久久精品国产久精国产| 成人看片网站| 一区二区三区午夜视频| 免费观看亚洲天堂| 国产精品免费不| 精品一区二区三区视频在线播放| 精品黄色一级片| 91一区二区| 一区在线免费观看| 亚洲精品三级| 精品一区二区三区在线观看视频| 精品久久久久中文字幕小说| 国产成人精品亚洲线观看| 韩日一区二区| 亚洲香蕉视频| 女生影院久久| 91亚洲精品在看在线观看高清| 国户精品久久久久久久久久久不卡| 六月丁香综合在线视频| 日韩不卡在线| 国产日韩免费| 亚洲永久字幕| 9999国产精品| 日韩高清成人在线| 国产模特精品视频久久久久| 成人亚洲一区二区| 国产精品亚洲欧美一级在线| 久久夜色精品| 色天使综合视频| 老司机精品视频网| 日韩成人精品一区二区三区 | 丝袜a∨在线一区二区三区不卡| 日韩精品免费一区二区夜夜嗨 | 国产精品成人自拍| 日本aⅴ精品一区二区三区| 国产高清一区二区| 欧美日韩精品免费观看视完整| 美日韩一区二区三区| 久久五月天小说| 国产精品99视频| 国产欧洲在线| 日韩在线麻豆| 激情五月综合| 亚洲午夜久久久久久尤物| 日韩在线不卡| av高清一区| 色婷婷精品视频| 波多野结衣一区| 天使萌一区二区三区免费观看| 久久婷婷久久| 成人美女视频| 999精品一区| 婷婷激情久久| 91精品婷婷色在线观看| 精品成人免费一区二区在线播放| 久久久久国产一区二区| 黄色免费成人| 视频一区欧美精品| 亚洲精品裸体| 激情婷婷综合|