vue.js踩坑之ref引用細(xì)節(jié)點(diǎn)講解
ref引用細(xì)節(jié)點(diǎn)講解
vue.js組件之H5頁(yè)面,DOM標(biāo)簽或者組件中,通過(guò)ref="自定義name名稱(chēng)"引用的細(xì)節(jié)點(diǎn)
要點(diǎn)簡(jiǎn)介:[ 見(jiàn)下文案例 ]
- 使用is=" "解決H5出現(xiàn)的標(biāo)簽解析bug 。
- 子組件中 使用data,data必須是 一個(gè) 函數(shù)!
- DOM標(biāo)簽中,引用ref定義的name:獲得的是該DOM元素;如下文的: this.$refs.hello.innerHtml
- 組件中,引用ref:獲得的是該DOM對(duì)象。如下文的: this.$refs.name2.number
vue不建議我們?cè)诖a里面操作DOM,但是,在處理一些極其復(fù)雜的動(dòng)畫(huà)效果,不操作DOM,單單靠vue的數(shù)據(jù)綁定是無(wú)法完成實(shí)際需求的效果的。這就需要我們必須操作DOM。如何操作呢?
通過(guò)ref引用的形式,來(lái)操作DOM
下面我們給一個(gè)需求:當(dāng)點(diǎn)擊div的時(shí)候,div里面的內(nèi)容被打印出來(lái)。
步驟如下
1.首先起一個(gè)引用的名字,比如hello:
ref='hello'
通過(guò)引用名稱(chēng)拿到該ref對(duì)應(yīng)DOM里面的內(nèi)容。
重要代碼如下
<body> ?? ?<div id="app"> ?? ??? ?<div? ?? ??? ??? ?ref="hello" ?? ??? ??? ?@click="handleClick" ?? ??? ?> ?? ??? ??? ?hello , 通過(guò)ref命名引用 操作DOM元素 ! ?? ??? ?</div> ?? ?</div> ?? ??? ?<script> ?? ??? ?var app = new Vue({ ?? ??? ? ?el: '#app', ?? ??? ? ?methods: { ?? ??? ? ??? ?handleClick: function() {?? ??? ? ??? ??? ??? ??? ?alert(this.$refs.hello.innerHTML); ?? ??? ? ??? ?} ?? ??? ? ?} ?? ??? ?}) ?? ?</script> </body>
注意:this.$refs指頁(yè)面所有引用。
2.如果是引用組件呢?
我們先看一段代碼:
<body> ?? ?<div id="app"> ?? ??? ?<counter></counter> ?? ??? ?<counter></counter> ?? ?</div> ?? ??? ? ?? ?<script> ?? ??? ?Vue.component('counter', { ?? ??? ??? ?template: '<button @click="handleClick">{{number}}</button>', ?? ??? ??? ?data: function() { ?? ??? ??? ??? ?return { ?? ??? ??? ??? ??? ?number: 0 ?? ??? ??? ??? ?} ?? ??? ??? ?}, ?? ??? ??? ?methods: { ?? ??? ??? ? ??? ?handleClick: function() {?? ??? ? ??? ??? ??? ??? ??? ? ?? ??? ??? ? ??? ??? ?this.number ++; ?? ??? ??? ? ??? ?} ?? ??? ??? ?} ?? ??? ?}) ?? ??? ?var app = new Vue({ ?? ??? ? ?el: '#app', ?? ??? ?}) ?? ?</script> </body>
下面我們?cè)俳o一個(gè)需求:數(shù)字的求和運(yùn)算。
全部代碼如下:
<body> ?? ?<div id="app"> ?? ??? ?<counter ref="name2" @change="handleChange"></counter> ?? ??? ?<counter ref="name3" @change="handleChange"></counter> ?? ??? ?<div>{{total}}</div> ?? ?</div> ?? ??? ? ?? ?<script> ?? ??? ?//子組件 ?? ??? ?Vue.component('counter', { ?? ??? ??? ?template: '<button @click="handleClick">{{number}}</button>', ?? ??? ??? ?data: function() { ?? ??? ??? ??? ?return { ?? ??? ??? ??? ??? ?number: 0 ?? ??? ??? ??? ?} ?? ??? ??? ?}, ?? ??? ??? ?methods: { ?? ??? ??? ? ??? ?handleClick: function() {?? ??? ? ??? ??? ??? ??? ??? ? ?? ??? ??? ? ??? ??? ?this.number ++; ?? ??? ??? ? ??? ??? ?this.$emit('change')//父組件中監(jiān)聽(tīng)變化 ?? ??? ??? ? ??? ?} ?? ??? ??? ?} ?? ??? ?}) ?? ??? ? ?? ??? ?//父組件 ?? ??? ?var app = new Vue({ ?? ??? ??? ?el: '#app', ?? ??? ??? ?data: { ?? ??? ??? ??? ?total: 0 ?? ??? ??? ?}, ?? ??? ??? ?methods: { ?? ??? ??? ??? ?handleChange: function() {? ?? ??? ??? ??? ??? ?console.log(this.$refs.name2.number); ?? ??? ??? ??? ??? ?console.log(this.$refs.name3.number); ?? ??? ??? ??? ??? ?this.total = this.$refs.name2.number + this.$refs.name3.number; ?? ??? ??? ??? ?} ?? ??? ??? ?} ?? ??? ?}) ?? ?</script> </body>
注意:
this.$refs.name2是個(gè)對(duì)象!
這里使用了父子通信$emit(),不懂沒(méi)關(guān)系,可以翻典籍或查看對(duì)應(yīng)的講解博客。
ref引用及插槽
ref引用
ref被用來(lái)給元素或子組件注冊(cè)引用信息。引用信息將會(huì)注冊(cè)在父組件的$refs對(duì)象上。如果在普通的DOM元素上使用,引用指向的就是DOM元素;如果用在子組件上,引用就指向組件實(shí)例。(可用于訪問(wèn)子組件實(shí)例或子元素)
<p ref='p'>hello</p> <child-component ref='child'></child-component>
當(dāng)v-for用于元素或組件的時(shí)候,引用的信息將是包含DOM節(jié)點(diǎn)或組件實(shí)例的數(shù)組。
注意:因?yàn)閞ef本身是作為渲染結(jié)果被創(chuàng)建的,在初始渲染的時(shí)候你還不能訪問(wèn)它們,因?yàn)樗鼈冞€不存在。
ref引用DOM元素
引用ref引用頁(yè)面上的DOM元素:
點(diǎn)擊按鈕后效果如圖:
ref引用組件實(shí)例
要使用 ref 引用頁(yè)面上的組件實(shí)例:父組件訪問(wèn)子組件實(shí)例
RefCom1組件:
子組件RefCom2:
實(shí)現(xiàn)效果:
實(shí)現(xiàn)標(biāo)簽的按需切換
通過(guò)布爾值 inputVisible 來(lái)控制組件中的文本框與按鈕的按需切換,希望文本框顯示出來(lái)后立即獲得焦點(diǎn)。
補(bǔ)充: this.$nextTick(cb)方法
組件的$nextTick(callback)方法,會(huì)把callback回調(diào)函數(shù)推遲到下一個(gè)DOM更新周期之后執(zhí)行。通俗講,就是等組件的DOM異步地重新渲染完成后,再執(zhí)行callback回調(diào)函數(shù),從而能保證callback回調(diào)函數(shù)可以操作到最新的DOM元素。
插槽
編譯作用域:父組件模板的所有東西都會(huì)在父級(jí)作用域內(nèi)編譯,子組件模板的所有東西都會(huì)在子級(jí)作用域內(nèi)編譯。
插槽(slot):是vue為組件的封裝者提供的能力。允許在封裝組件時(shí),把不確定的,希望由用戶(hù)指定的部分定義為插槽。插槽將父組件的內(nèi)容與子組件的模板相混合,從而彌補(bǔ)了視圖的不足。
如果父組件沒(méi)有插入內(nèi)容,那么slot的內(nèi)容就作為默認(rèn)出現(xiàn);若父組件插入了內(nèi)容,則slot的內(nèi)容將被插入的內(nèi)容替換掉。
匿名插槽
在封裝組件時(shí),可以通過(guò)<slot>元素定義插槽,從而為用戶(hù)與理由內(nèi)容占位符。匿名插槽(默認(rèn)插槽),有且只有一個(gè)。
例如:
子組件:
父組件:
補(bǔ)充:
(1)如果在封裝組件時(shí)沒(méi)有預(yù)留任何<slot>插槽,則用戶(hù)提供的內(nèi)容都會(huì)被丟棄。
(2)后備內(nèi)容:如果沒(méi)有為插槽提供內(nèi)容,那么后備內(nèi)容會(huì)生效。
具名插槽
如果在封裝組件時(shí)需要預(yù)留多個(gè)插槽節(jié)點(diǎn),則需要為每個(gè) <slot> 插槽指定具體的 name 名稱(chēng)。這種帶有具體名稱(chēng)的插槽叫做“具名插槽”。
例如:
SlotSon組件:
SlotFather組件:
作用域插槽
在封裝組件的過(guò)程中,可以為預(yù)留的<slot>插槽綁定props數(shù)據(jù),這種帶有props數(shù)據(jù)的<slot>叫做“作用域插槽”。
例如:
SlotSon2組件:(通過(guò)插槽給父組件傳遞數(shù)據(jù))
SlotFather組件:接收插槽傳過(guò)來(lái)的數(shù)據(jù),賦給插槽內(nèi)容
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Vue項(xiàng)目中使用setTimeout存在的潛在問(wèn)題及解決
這篇文章主要介紹了Vue項(xiàng)目中使用setTimeout存在的潛在問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-01-01vue導(dǎo)出word純前端的實(shí)現(xiàn)方式
這篇文章主要介紹了vue導(dǎo)出word純前端的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-04-04vue-cli創(chuàng)建的項(xiàng)目中的gitHooks原理解析
這篇文章主要介紹了vue-cli創(chuàng)建的項(xiàng)目中的gitHooks原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02vue 中常見(jiàn)的時(shí)間格式轉(zhuǎn)換
這篇文章主要介紹了vue 中常見(jiàn)的時(shí)間格式轉(zhuǎn)換,需要的朋友可以參考下2022-05-05Vue如何實(shí)現(xiàn)驗(yàn)證碼輸入交互
這篇文章主要介紹了Vue實(shí)現(xiàn)驗(yàn)證碼輸入交互的示例,幫助大家更好的理解和使用vue,感興趣的朋友可以了解下2020-12-12