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里面的內容被打印出來。
步驟如下
1.首先起一個引用的名字,比如hello:
ref='hello'
通過引用名稱拿到該ref對應DOM里面的內容。
重要代碼如下
<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(),不懂沒關系,可以翻典籍或查看對應的講解博客。
ref引用及插槽
ref引用
ref被用來給元素或子組件注冊引用信息。引用信息將會注冊在父組件的$refs對象上。如果在普通的DOM元素上使用,引用指向的就是DOM元素;如果用在子組件上,引用就指向組件實例。(可用于訪問子組件實例或子元素)
<p ref='p'>hello</p> <child-component ref='child'></child-component>
當v-for用于元素或組件的時候,引用的信息將是包含DOM節(jié)點或組件實例的數(shù)組。
注意:因為ref本身是作為渲染結果被創(chuàng)建的,在初始渲染的時候你還不能訪問它們,因為它們還不存在。
ref引用DOM元素
引用ref引用頁面上的DOM元素:
點擊按鈕后效果如圖:
ref引用組件實例
要使用 ref 引用頁面上的組件實例:父組件訪問子組件實例
RefCom1組件:
子組件RefCom2:
實現(xiàn)效果:
實現(xiàn)標簽的按需切換
通過布爾值 inputVisible 來控制組件中的文本框與按鈕的按需切換,希望文本框顯示出來后立即獲得焦點。
補充: this.$nextTick(cb)方法
組件的$nextTick(callback)方法,會把callback回調函數(shù)推遲到下一個DOM更新周期之后執(zhí)行。通俗講,就是等組件的DOM異步地重新渲染完成后,再執(zhí)行callback回調函數(shù),從而能保證callback回調函數(shù)可以操作到最新的DOM元素。
插槽
編譯作用域:父組件模板的所有東西都會在父級作用域內編譯,子組件模板的所有東西都會在子級作用域內編譯。
插槽(slot):是vue為組件的封裝者提供的能力。允許在封裝組件時,把不確定的,希望由用戶指定的部分定義為插槽。插槽將父組件的內容與子組件的模板相混合,從而彌補了視圖的不足。
如果父組件沒有插入內容,那么slot的內容就作為默認出現(xiàn);若父組件插入了內容,則slot的內容將被插入的內容替換掉。
匿名插槽
在封裝組件時,可以通過<slot>元素定義插槽,從而為用戶與理由內容占位符。匿名插槽(默認插槽),有且只有一個。
例如:
子組件:
父組件:
補充:
(1)如果在封裝組件時沒有預留任何<slot>插槽,則用戶提供的內容都會被丟棄。
(2)后備內容:如果沒有為插槽提供內容,那么后備內容會生效。
具名插槽
如果在封裝組件時需要預留多個插槽節(jié)點,則需要為每個 <slot> 插槽指定具體的 name 名稱。這種帶有具體名稱的插槽叫做“具名插槽”。
例如:
SlotSon組件:
SlotFather組件:
作用域插槽
在封裝組件的過程中,可以為預留的<slot>插槽綁定props數(shù)據(jù),這種帶有props數(shù)據(jù)的<slot>叫做“作用域插槽”。
例如:
SlotSon2組件:(通過插槽給父組件傳遞數(shù)據(jù))
SlotFather組件:接收插槽傳過來的數(shù)據(jù),賦給插槽內容
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
vue-cli創(chuàng)建的項目中的gitHooks原理解析
這篇文章主要介紹了vue-cli創(chuàng)建的項目中的gitHooks原理解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-02-02