vue.js踩坑之ref引用細節(jié)點講解
ref引用細節(jié)點講解
vue.js組件之H5頁面,DOM標簽或者組件中,通過ref="自定義name名稱"引用的細節(jié)點
要點簡介:[ 見下文案例 ]
- 使用is=" "解決H5出現(xiàn)的標簽解析bug 。
- 子組件中 使用data,data必須是 一個 函數(shù)!
- DOM標簽中,引用ref定義的name:獲得的是該DOM元素;如下文的: this.$refs.hello.innerHtml
- 組件中,引用ref:獲得的是該DOM對象。如下文的: this.$refs.name2.number
vue不建議我們在代碼里面操作DOM,但是,在處理一些極其復雜的動畫效果,不操作DOM,單單靠vue的數(shù)據(jù)綁定是無法完成實際需求的效果的。這就需要我們必須操作DOM。如何操作呢?
通過ref引用的形式,來操作DOM
下面我們給一個需求:當點擊div的時候,div里面的內(nèi)容被打印出來。
步驟如下
1.首先起一個引用的名字,比如hello:
ref='hello'
通過引用名稱拿到該ref對應DOM里面的內(nèi)容。
重要代碼如下
<body>
?? ?<div id="app">
?? ??? ?<div?
?? ??? ??? ?ref="hello"
?? ??? ??? ?@click="handleClick"
?? ??? ?>
?? ??? ??? ?hello , 通過ref命名引用 操作DOM元素 !
?? ??? ?</div>
?? ?</div>
?? ??? ?<script>
?? ??? ?var app = new Vue({
?? ??? ? ?el: '#app',
?? ??? ? ?methods: {
?? ??? ? ??? ?handleClick: function() {?? ??? ? ??? ??? ??? ??? ?alert(this.$refs.hello.innerHTML);
?? ??? ? ??? ?}
?? ??? ? ?}
?? ??? ?})
?? ?</script>
</body>注意:this.$refs指頁面所有引用。
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>下面我們再給一個需求:數(shù)字的求和運算。
全部代碼如下:
<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)聽變化
?? ??? ??? ? ??? ?}
?? ??? ??? ?}
?? ??? ?})
?? ??? ?
?? ??? ?//父組件
?? ??? ?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是個對象!
這里使用了父子通信$emit(),不懂沒關(guān)系,可以翻典籍或查看對應的講解博客。
ref引用及插槽
ref引用
ref被用來給元素或子組件注冊引用信息。引用信息將會注冊在父組件的$refs對象上。如果在普通的DOM元素上使用,引用指向的就是DOM元素;如果用在子組件上,引用就指向組件實例。(可用于訪問子組件實例或子元素)
<p ref='p'>hello</p> <child-component ref='child'></child-component>
當v-for用于元素或組件的時候,引用的信息將是包含DOM節(jié)點或組件實例的數(shù)組。
注意:因為ref本身是作為渲染結(jié)果被創(chuàng)建的,在初始渲染的時候你還不能訪問它們,因為它們還不存在。
ref引用DOM元素
引用ref引用頁面上的DOM元素:

點擊按鈕后效果如圖:

ref引用組件實例
要使用 ref 引用頁面上的組件實例:父組件訪問子組件實例
RefCom1組件:

子組件RefCom2:

實現(xiàn)效果:

實現(xiàn)標簽的按需切換
通過布爾值 inputVisible 來控制組件中的文本框與按鈕的按需切換,希望文本框顯示出來后立即獲得焦點。
補充: this.$nextTick(cb)方法
組件的$nextTick(callback)方法,會把callback回調(diào)函數(shù)推遲到下一個DOM更新周期之后執(zhí)行。通俗講,就是等組件的DOM異步地重新渲染完成后,再執(zhí)行callback回調(diào)函數(shù),從而能保證callback回調(diào)函數(shù)可以操作到最新的DOM元素。


插槽
編譯作用域:父組件模板的所有東西都會在父級作用域內(nèi)編譯,子組件模板的所有東西都會在子級作用域內(nèi)編譯。
插槽(slot):是vue為組件的封裝者提供的能力。允許在封裝組件時,把不確定的,希望由用戶指定的部分定義為插槽。插槽將父組件的內(nèi)容與子組件的模板相混合,從而彌補了視圖的不足。
如果父組件沒有插入內(nèi)容,那么slot的內(nèi)容就作為默認出現(xiàn);若父組件插入了內(nèi)容,則slot的內(nèi)容將被插入的內(nèi)容替換掉。
匿名插槽
在封裝組件時,可以通過<slot>元素定義插槽,從而為用戶與理由內(nèi)容占位符。匿名插槽(默認插槽),有且只有一個。
例如:
子組件:

父組件:

補充:
(1)如果在封裝組件時沒有預留任何<slot>插槽,則用戶提供的內(nèi)容都會被丟棄。
(2)后備內(nèi)容:如果沒有為插槽提供內(nèi)容,那么后備內(nèi)容會生效。

具名插槽
如果在封裝組件時需要預留多個插槽節(jié)點,則需要為每個 <slot> 插槽指定具體的 name 名稱。這種帶有具體名稱的插槽叫做“具名插槽”。
例如:
SlotSon組件:

SlotFather組件:


作用域插槽
在封裝組件的過程中,可以為預留的<slot>插槽綁定props數(shù)據(jù),這種帶有props數(shù)據(jù)的<slot>叫做“作用域插槽”。
例如:
SlotSon2組件:(通過插槽給父組件傳遞數(shù)據(jù))

SlotFather組件:接收插槽傳過來的數(shù)據(jù),賦給插槽內(nèi)容

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
vue-cli創(chuàng)建的項目中的gitHooks原理解析
這篇文章主要介紹了vue-cli創(chuàng)建的項目中的gitHooks原理解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-02-02

