ref 有三種用法:
1、ref 加在普通的元素上,用this.ref.name 獲取到的是dom元素
2、ref 加在子組件上,用this.ref.name 獲取到的是組件實例,可以使用組件的所有方法。
3、如何利用 v-for 和 ref 獲取一組數組或者dom 節點
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0"> <title>ref</title> <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js" type="text/javascript" charset="utf-8"></script> </head> <body> <div id="app"> <ul> <li v-for="item in list" ref="refContent"> {{item}}</li> </ul> </div> </body> </html> <script type="text/javascript" charset="utf-8"> var app = new Vue({ el: "#app", data: { list: ['馬芸', '麻花藤', '王劍琳', '李佳成'], }, created: function() { this.$nextTick(() => { console.log(this); // #app vue實例 console.log(this.$refs.refContent); // <p>標簽dom元素 ref在外面的元素上</p>} ) }) }, }); </script>
1、ref 需要在dom渲染完成后才會有,在使用的時候確保dom已經渲染完成。比如在生命周期 mounted(){} 鈎子中調用,或者在 this.$nextTick(()=>{}) 中調用。
2、如果ref 是循環出來的,有多個重名,那么ref的值會是一個數組 ,此時要拿到單個的ref 只需要循環就可以了。
1.ref作用在外面元素上
在學習 jq 時,我們首要任務就是學習選擇的使用,因為選擇可以極其方便幫助我們獲取節點查找dom,因為我們要通過dom展示處理數據。而在Vue中,我們的編程理念發生了變化,變為了數據驅動dom;但有時我們因為某些情況不得不脫離數據操作dom,因此vue為我們提供了 ref 屬性獲取dom節點;
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0"> <title>ref</title> <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js" type="text/javascript" charset="utf-8"></script> </head> <body> <div id="app" v-on:click="consoleRef"> <p ref="outsideDomRef">ref在外面的元素上</p> </div> </body> </html> <script type="text/javascript" charset="utf-8"> var app = new Vue({ el: "#app", methods: { //用來獲取具有ref屬性的節點對象 consoleRef: function() { console.log(this); // #app vue實例 console.log(this.$refs.outsideDomRef); // <p>標簽dom元素 ref在外面的元素上</p> } }, }); </script>
2.ref作用在外面組件上
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0"> <title>ref</title> <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js" type="text/javascript" charset="utf-8"></script> </head> <body> <div id="app" v-on:click="consoleRef"> <component-father ref="outsideComponentRef"></component-father> </div> </body> </html> <script type="text/javascript" charset="utf-8"> var refoutsidecomponentTem = { template: "<div class='childComp'><p>ref在外面的組件上</p></div>" }; var app = new Vue({ el: "#app", components: { "component-father": refoutsidecomponentTem }, methods: { consoleRef: function() { console.log(this); // #app vue實例 console.log(this.$refs.outsideComponentRef); // div.childComp vue實例,組件實例 } } }); </script>
3.ref使用在里面的元素上--局部注冊組件
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0"> <title>ref</title> <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js" type="text/javascript" charset="utf-8"></script> </head> <body> <div id="app"> <component-father></component-father> </div> </body> </html> <script type="text/javascript" charset="utf-8"> var refinsidedomTem = { template: "<div class='childComp' v-on:click='consoleRef'>" + "<p ref='insideDomRef'>ref在組件里面的元素上,我是子組件</p>" + "</div>", methods: { consoleRef: function() { console.log(this); // div.childComp vue實例 console.log(this.$refs.insideDomRef); // <p>ref在組件里面的元素上,我是子組件</p> } } }; var app = new Vue({ el: "#app", components: { "component-father": refinsidedomTem } }); </script>
4.ref使用在里面的元素上--全局注冊組件
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0"> <title>ref</title> <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js" type="text/javascript" charset="utf-8"></script> </head> <body> <div id="app"> <ref-inside-dom></ref-inside-dom> </div> </body> </html> <script type="text/javascript" charset="utf-8"> Vue.component("ref-inside-dom", { template: "<div class='insideFather'> " + "<input type='text' ref='insideDomRefAll' v-on:input='showinsideDomRef'>" + "<p>ref在里面的元素上--全局注冊 </p> " + "</div>", methods: { showinsideDomRef: function() { console.log(this); //這里的this其實還是div.insideFather console.log(this.$refs.insideDomRefAll); // <input type="text"> } } }); var app = new Vue({ el: "#app", }); </script>