ref和$refs的使用

Posted by CodingWithAlice on March 25, 2020

ref和$refs的使用

场景:获取某个DOM元素进行事件的触发(调试时使用,触发click)。

参考:vue官方说明文档+慕课视频+网络博客

总结:用ref进行引用命名,$refs是所有引用的名称,尤其注意循环中ref的使用(数组)。

  • 标签上面使用ref通过this.$refs.名字 获取到的是标签对应的DOM元素this.$refs.hello.innerHTML

  • 组件上面使用ref通过this.$refs.名字 获取到的是子组件的引用,可以使用组件的所有方法this.$refs.counter1.number,this.$refs.方法()

  • 如果ref 是循环出来的,有多个重名,那么ref的值会是一个数组

    若是通过 :ref =某变量 添加ref ,如果想获取该ref时需要加 [0],如this.$refs[refsArrayItem] [0]

    如果不是:ref =某变量的方式而是 ref =某字符串时则不需要加,this.$refs[refsArrayItem]。

  • 注意:ref 需要在Dom渲染完成后才会有,在使用的时候确保Dom已经渲染完成。比如在生命周期 mounted钩子中调用,或者在 this.$nextTick(()=>{}) 中调用。

            <div 
                ref='hello' 
                @click='handleDivClick'
            >
                hello world
            </div>
    
            var vm = new Vue({
                el: '#root',
                methods: {
                    handleDivClick: function () {
                        alert(this.$refs.hello.innerHTML)//获取到DOM元素中的内容
                    }
                }
            })
    

    案例:计数器

        <div id='root1'>
            <counter ref='counter1' @change='handleChange'></counter>
            <counter ref='counter2' @change='handleChange'></counter>
            <div></div>
        </div>
    
     		Vue.component('counter',{
                template:'<div @click="handleClick"></div>',
                data:function(){
                    return{
                        number:0
                    }
                },
                methods:{
                    handleClick:function(){
                        this.number++
                 // 这里涉及到子组件向父组件传值的内容,用emit触发一个change事件,在父组件进行监听
                        this.$emit('change')
                    }
                }
            })
            var vm = new Vue({
                el:'#root1',
                data:{
                    total:0
                },
                methods:{
                    handleChange:function(){
                        this.total=this.$refs.counter1.number + this.$refs.counter2.number
                    }
                }
            })