SIMONDOMAIN 2020-05-29
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 只需要循环就可以了。
在学习 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>
<!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>
<!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>
<!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>
background-color: blue;background-color: yellow;<input type="button" value="变蓝" @click="changeColorT