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

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Vue vm.$attrs使用場(chǎng)景詳解

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

1、vm.$attrs簡(jiǎn)介

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

2、場(chǎng)景介紹

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

<parent-component :passdown='passdown'><child-component :passdown='passdown'><grand-child-component :passdown='passdown'>....

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

假如我們需要傳遞的屬性只有1,2個(gè)還行,但是如果我們要傳遞的有幾個(gè)或者10來(lái)個(gè)的情況,這會(huì)是什么樣的場(chǎng)景,我們會(huì)在每個(gè)組件不停的props,每個(gè)必須寫(xiě)很多遍。有沒(méi)有其它方便的寫(xiě)法?有,通過(guò)vuex的父子組件通信,的確這個(gè)是一個(gè)方法,但是還有其它的方法,這個(gè)就是我們要說(shuō)的。通過(guò)inheritAttrs選項(xiàng),以及實(shí)例屬性$attrs

3、實(shí)例:

<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>這是個(gè)h1標(biāo)題{{title}}</div>`, props:[’title’], data(){ return{ mag:’111’ } }, created:function(){ console.log(this.$attrs)//注意這里 } } }}</script>

上邊的代碼,我們?cè)诮M件里只是用了title這個(gè)屬性,massgae屬性我么是沒(méi)有用的,那么下瀏覽器渲染出來(lái)是什么樣呢?如下圖:

Vue vm.$attrs使用場(chǎng)景詳解

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

如果我們?cè)谧咏M件里設(shè)置 inheritAttrs: false:

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

渲染效果如下:

Vue vm.$attrs使用場(chǎng)景詳解

不繼承的情況.png

補(bǔ)充:說(shuō)一下$attrs的使用

有一個(gè)頁(yè)面由父組件,子組件,孫子組件構(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>

上面的代碼在頁(yè)面的效果是如下圖

Vue vm.$attrs使用場(chǎng)景詳解

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

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

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

假如我們要做一個(gè)頁(yè)面,有父組件,子組件,孫子組件,如下:

<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的值通過(guò)props傳遞到子組件,子組件在通過(guò)props把a(bǔ)ge的值傳遞到孫子組件,到這里看明白了吧,孫子組件需要的age在子組件里沒(méi)有用到,但是為了能讓孫子組件獲取到,你必須從父組件 傳到子組件,在在子組件傳遞到孫子組件。

但是用$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屬性外所有由父組件傳遞下來(lái)的屬性。如果孫子組件也想獲取到name屬性那么,在綁定個(gè)name如下,

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

細(xì)細(xì)體會(huì)下是不是這個(gè)道理。實(shí)在不行的話敲一敲代碼自己試驗(yàn)下,你就會(huì)豁然開(kāi)朗。

補(bǔ)充一下:inheritAttrs屬性

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

注意:這個(gè)選項(xiàng)不影響 class 和 style 綁定。

在Vue2.4.0之前版本,組件內(nèi)未被注冊(cè)的屬性將作為普通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>

上面代碼你覺(jué)得input上會(huì)怎么顯示? 父組件傳遞了type='text',子組件里input 上type='number',那渲染到頁(yè)面會(huì)是什么樣?渲染圖如下:

Vue vm.$attrs使用場(chǎng)景詳解

默認(rèn)情況.png

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

需求:我需要input 上type='number'類(lèi)型不變,但是我還是要取到父組件的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>

頁(yè)面渲染圖如下:

Vue vm.$attrs使用場(chǎng)景詳解

需求.png

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

順道補(bǔ)充一下:$listeners

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

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

頁(yè)面渲染如下:

Vue vm.$attrs使用場(chǎng)景詳解

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

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

標(biāo)簽: Vue
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产亚洲网站| 嫩草伊人久久精品少妇av杨幂 | 久久精品免视看国产成人| 亚洲网址在线观看| 天堂成人免费av电影一区| 伊人久久成人| 国产午夜精品一区二区三区欧美 | 欧美日韩中文字幕一区二区三区| 日韩精品视频中文字幕| 蜜臀av性久久久久蜜臀aⅴ流畅 | 日韩精品久久理论片| 日本成人中文字幕在线视频| 日韩1区2区日韩1区2区| 精品国产中文字幕第一页| 国产精品麻豆久久| 亚洲成av人片一区二区密柚| 日韩一区二区久久| 日韩国产精品久久久久久亚洲| 久久福利在线| 欧美日韩在线观看视频小说| 欧美日韩少妇| 亚洲精品一级| 精品日韩在线| 99国产精品私拍| 国产麻豆一区二区三区| 91看片一区| 日韩精品成人| 久久影院一区| 久久a爱视频| 久久不射网站| 三上悠亚国产精品一区二区三区| 亚洲少妇诱惑| 日韩电影免费在线观看| 欧美一级久久| 99国产精品自拍| 日韩电影在线视频| 日本高清久久| 亚洲激情欧美| 久久久精品日韩| 欧美激情网址| 日韩高清三区| 视频在线在亚洲| 欧美精品一区二区久久| 国产一区二区精品久| 日本免费新一区视频| 最新日韩av| 亚洲v在线看| 欧美日韩免费观看视频| 欧美精品导航| 国产精品一区二区三区av| 视频在线在亚洲| 久久久一本精品| 国产精品久久观看| 国产剧情一区| 国产欧美在线观看免费| 中文字幕日韩亚洲| 三级在线观看一区二区| 欧美日韩日本国产亚洲在线 | 天堂va在线高清一区| 最新国产精品久久久| 六月天综合网| 亚洲欧美在线综合| 青青草91视频| 久久国产精品色av免费看| 久久xxxx精品视频| 亚洲综合中文| 日本午夜免费一区二区| 国产日韩亚洲欧美精品| 久久国产三级| 91日韩在线| 亚洲夜间福利| 国产农村妇女精品一二区| 美女久久网站| 青草久久视频| 日韩av专区| 一级欧洲+日本+国产| 久久亚洲国产精品一区二区| 亚洲免费福利一区| 国产精品一页| 美女久久久久久| 日韩一区二区三区在线看| 欧洲激情综合| 亚洲精品电影| 亚洲欧美网站在线观看| 久久gogo国模啪啪裸体| 中文字幕色婷婷在线视频| 亚洲日本三级| 日本91福利区| 色乱码一区二区三区网站| 日韩精彩视频在线观看| 免费亚洲婷婷| 婷婷激情图片久久| 欧美有码在线| 亚洲网站视频| 丝袜脚交一区二区| 精品资源在线| 国产欧美日本| 免费一级欧美在线观看视频| 国产99精品| 国产精品亚洲综合久久| 亚洲天堂久久| 国产一区二区色噜噜| 久久国产福利| 午夜影院一区| 亚洲区国产区| 播放一区二区| 国产精品久av福利在线观看| 亚洲欧美日韩综合国产aⅴ| 国产一区二区视频在线看| 午夜一区在线| 日韩精品不卡一区二区| 国产三级一区| 日本少妇一区二区| 亚洲久久一区| 美女国产精品| 久久福利精品| 影音国产精品| av一区二区高清| 日韩精品一卡| 久久精品二区三区| 成人日韩在线| 日韩中文在线播放| 久久亚洲国产| 秋霞国产精品| 首页国产精品| 亚洲美女久久精品| 激情国产在线| 日韩精品永久网址| 中文字幕在线视频久| 久久这里只有| 91日韩免费| 激情综合网站| 中文字幕一区二区三区日韩精品 | 中文字幕在线官网| 美女视频免费精品| 精品资源在线| 另类专区亚洲| 午夜电影亚洲| 亚洲一区二区三区久久久| 蜜臀av性久久久久蜜臀aⅴ流畅| 日av在线不卡| 国产精品久久久久久久久久久久久久久 | 国产理论在线| 欧美成人基地| 在线亚洲成人| 国产精品一区亚洲| 久久人人97超碰国产公开结果| 午夜在线精品偷拍| 国产麻豆一区二区三区| 免费一二一二在线视频| 99riav1国产精品视频| 亚洲va久久| 国产盗摄——sm在线视频| 99热免费精品| 久久中文字幕一区二区三区| 99精品在线观看| 日韩av资源网| 91精品国产福利在线观看麻豆| 亚洲伊人精品酒店| 亚洲精品成人图区| 午夜精品影视国产一区在线麻豆| 国产精品1luya在线播放| 中文在线不卡| 不卡一二三区| 国产欧美日韩一区二区三区在线| 久久久久国产精品一区三寸| 亚洲狼人精品一区二区三区| 国内自拍视频一区二区三区| 亚洲免费网址| 在线日韩av| 97精品视频在线看| 国产无遮挡裸体免费久久 | 精品美女在线视频| 日韩精品国产精品| 视频在线观看91| 婷婷成人在线| 色偷偷偷在线视频播放| 国产精品亚洲成在人线| 视频在线观看一区二区三区| 欧美日韩水蜜桃| 麻豆一区二区三区| 青青草国产成人99久久| 丝袜美腿亚洲一区| 久久亚洲欧美| 蜜桃视频在线观看一区二区| 激情婷婷亚洲| 国产二区精品| 在线视频亚洲| 蜜桃视频第一区免费观看| 99久久婷婷这里只有精品| 97视频热人人精品免费| 国产videos久久| 精品国产不卡一区二区| 欧美极品中文字幕| 精品国产乱码| 麻豆久久一区二区| 福利一区在线| 欧美va亚洲va日韩∨a综合色| 亚洲播播91| 欧美成人综合|