首页 > 其他分享 >VUE $refs 与 $el 详解

VUE $refs 与 $el 详解

时间:2022-12-02 17:22:41浏览次数:71  
标签:el VUE console log DOM refs 组件

$refs 与 $el 是什么? 作用是什么? ref,$refs,$el ,三者之间的关系是什么?

ref (给元素或者子组件注册引用信息) 就像你要给元素设置样式,就需要先给元素设定一个 class 一样,同理,你想获取哪个元素的 DOM,就给这个元素先设定一个 ref,其实这里和 JS 中的 document.各种方法获取 DOM 差不多,不过 ref 是访问 VUE 虚拟出来的DOM,这样可以有效的减少性能消耗

简述三者区别:

ref :是 元素的属性,用于设置在元素上

$refs :是 ref 的集合,集合里面包含了当前.vue中的所有 ref

用于获取普通元素中的 DOM 以及 子组件中方法/参数的

$el :是 用于获取组件内 DOM(包括子组件,当前.vue组件,以及父组件)

case 1:点击按钮“确定”触发其他元素上的事件

<template>
  <div class="content">
    <div>
      <el-button type="success"  @click="handleSubmit">
        確定
      </el-button>
      <!-- 设定 ref="passA" -->
      <el-button ref="passA" type="success" @click="handlePassA">
        被触发 A
      </el-button>
    </div>
    <!-- 设定 ref="passB" -->
    <div style="height:40px; width:100px; background: burlywood;" 
    ref="passB" @click="handlePassB">
      被触发 B
    </div>
  </div>
</template>
handleSubmit(){
    /*
    * 有同学看到这里会问:咦,博主,你这里写法为什么不同呀?
    * 嗯,这位同学不错,问到正题上了,避免了你在实际运用中出现问题
    * 因为 ref="passA" 的按钮,它是 element ui 提供的组件,
    * 组件本身不是 DOM,所以需要 .$el 的帮助后才能提取组件的 DOM
    * 反之,对于提取普通元素上的 DOM ,就不需要了
    */
    this.$refs.passA.$el.click()
    this.$refs.passB.click()
 
    console.log(this.$refs)
},
handlePassA(){
    console.log('我是 PassA, 我报触发了')
    console.log('我自己的高度 =>',this.$refs.passA.$el.offsetHeight)
},
handlePassB(){
    console.log('我是 PassB, 我报触发了')
    console.log('我自己的高度 =>',this.$refs.passB.offsetHeight)
},

 

 

 

case 2:页面加载,获取当前.vue文件中整体元素高度

mounted(){
    /*
    * 这里通过 this.$el 直接获取当前.vue文件整体 DOM
    */
    console.log(this.$el)
    console.log('我是 当前.vue文件 整体的高度 =>',this.$el.offsetHeight)
    console.log('我是 PassB 我自己的高度 =>',this.$refs.passB.offsetHeight)
},

 

 

  这里通过 class=“content” 与上图中控制台输出的 整体DOM最外层的 calss 比照,可以更好的理解

 

 

 

case 3:父组件,调用子组件内的方法/参数(这里的例子是页面加载直接调用)

<template>
    <div class="border">
        <div>我是子组件</div>  
        <input v-model="value">
    </div>
</template>
 
<script>
    import {mapGetters} from 'vuex'
    export default {
        name: 'user-defined',
        data() {
            return {
                value: 0,
                list: [1,2,3,4]
            }
        },
        methods: {
            handleAddNum(){
                console.log('我是子组件里的方法')
                this.value = this.value + 1;
                // 获取父组件DOM
                let parentDom = this.$parent.$el;
            }
    }
}
</script>
<style scoped lang="scss">
.border{
    width: 300px;
    height: 200px;
    border: 1px solid red;
}
</style>
<template>
  <div class="content">
    <div>
      <el-button type="success"  @click="handleSubmit">
        確定
      </el-button>
      <!-- 设定 ref="passA" -->
      <el-button ref="passA" type="success" @click="handlePassA">
        被触发 A
      </el-button>
    </div>
    <!-- 设定 ref="passB" -->
    <div style="height:40px; width:100px; background: burlywood;" 
    ref="passB" @click="handlePassB">
      被触发 B
    </div>
    <!-- 子组件 设定 ref="userDefined" -->
    <user-defined ref="userDefined"></user-defined>
  </div>
</template>
 
<script>
import userDefined from './user-defined.vue' // waves directive
import {mapGetters} from 'vuex'
 
export default {
    name: 'AdminPassword',
    components: {
        userDefined
    },
    mounted(){
        // 调用 子组件方法
        this.$refs.userDefined.handleAddNum()
        // 调用 子组件list参数
        console.log(this.$refs.userDefined.list)
        // 输出 $refs 内的集合
        console.log(this.$refs)
    },
    methods: {
        handleSubmit(){
            this.$refs.passA.$el.click()
            this.$refs.passB.click()
 
            console.log(this.$refs)
        },
        handlePassA(){
            console.log('我是 PassA, 我报触发了')
            console.log('我自己的高度 =>',this.$refs.passA.$el.offsetHeight)
        },
        handlePassB(){
            console.log('我是 PassB, 我报触发了')
            console.log('我自己的高度 =>',this.$refs.passB.offsetHeight)
        },
    }
}
</script>

 

case 4:什么情况/场景中使用 this.$nextTick(()=>{}),它的作用是什么?

<template>
  <div class="content">
    <el-button type="success"  @click="handleSubmit">
      获取下方div中文本
    </el-button>
    <!-- 设定 ref="myDiv" -->
    <div ref="myDiv" style="width: 100px; height: 40px; border: 1px solid red;">
      {{text}}
    </div>
  </div>
</template>
data(){
    return{
        text: '我今年12岁'
    }
},
methods: {
    handleSubmit(){
        /*
        * 为什么我打印出来的不是 【我今年13岁】 呢?
        * 因为 DOM 的值还没有更新完毕,所以这里打印的依然是【我今年12岁】
        */
        this.text = '我今年13岁'
        console.log('打印 =>',this.$refs.myDiv.innerHTML) // 打印结果:我今年12岁
    }
}

 

 

created(){
    console.log('created =>',this.$refs.myDiv)
    /*
     * 因为生命周期执行顺序的缘故,vue 实例刚刚创建完毕 , DOM 还没有进行渲染,所以
     * 打印结果:created => undefined
     * 如果你在这里输出 this.$refs.myDiv.innerHTML 控制台还会报错,提示 myDiv 不存在
     */
    this.$nextTick(()=>{
        console.log('created =>',this.$refs.myDiv.innerHTML)
        /*
         * this.$nextTick 监视 DOM 的更新
         * 会进入 红灯停状态,DOM 更新完毕后,就会进入 绿灯行驶状态
         * 打印结果:created => 我今年12岁
         */
    })
},
methods: {
    handleSubmit(){
        this.text = '我今年13岁'
        /*
        * this.$nextTick 的作用是什么?
        * 它的作用类似:前方道路正在施工,施工完毕后可正常行驶
        * DOM 更新完毕后,就会执行 this.$nextTick 内的代码
        */
        this.$nextTick(()=>{
            console.log('打印 =>',this.$refs.myDiv.innerHTML) // 打印结果:我今年13岁
        })
    }
}

 

 

 原文

标签:el,VUE,console,log,DOM,refs,组件
From: https://www.cnblogs.com/caihongmin/p/16945063.html

相关文章

  • vue多个方法的异步请求
    1、async和awaitasync/await是一种建立在Promise之上的编写异步或非阻塞代码的新方法。async是异步的意思,而await是asyncwait的简写,即异步等待。1//假设这是......
  • 【Django】Django model中的 class Meta 详解
     Model元数据就是"不是一个字段的任何数据"--比如排序选项,admin选项等等.下面是所有可能用到的Meta选项.没有一个选项是必需的.是否添加classMeta到你......
  • label smoothing理论推导
    我们知道,softmax容易使模型过度自信过拟合,labelsmoothing作为一种改善方案可以提高模型的泛化能力。label_smoothing上篇博客推导过反向求导的结果如下​​softmax求导/lab......
  • SpringBoot+ElasticSearch 实现模糊查询,批量CRUD,排序,分页,高亮!
    导入elasticsearch依赖创建高级客户端基本用法创建、判断存在、删除索引对文档的CRUD批量CRUD数据查询所有、模糊查询、分页查询、排序、高亮显示总结大致流程......
  • vue3自定义修饰符
    v-model 有一些内置的修饰符,例如 .trim,.number 和 .lazy都是对输入的数据做过滤处理vue也可以自定义实现创建一个自定义的修饰符 capitalize,它会自动将 v-model......
  • how to config `node.js` version in vercel All In One
    howtoconfignode.jsversioninvercelAllInOneNode.jsengines&package.json{"engines":{"node":"^8||^10"}}{"engines":{......
  • vue3 实现自定义 v-model
    在vue中,form表单输入可以通过v-model实现双向数据绑定,例如:<inputv-model="text"/>{{text}}在表单中输入时,页面展示的data-text也会相应改变如果是封装......
  • 算法工程师资料分享(算法基础 推荐算法 编程 python java c++ shell sql 数据结构 竞
    关注公众号:后厂村搬砖工。回复:学习资料汇总即可领取目录一、算法基础1.1学习路线1.2学习资料推荐二、编程能力2.1Python编程2.2Java编程2.3C++编程2.4Shell......
  • shell 编程变量使用心得
    类型示例用途大写的变量名IP表示常量,比如,用来记录输入和输出文件名小写变量名mac一般变量左边下划线_mac临时的中间变量,只引用一次的变量右边下......
  • python3读写excel之xlrd和xlwt
    最新要处理excel文件,于是整理了下python3中常用操作excel的包的用法pip用法#查看已安装piplist#安装包pipinstallxlrd#安装指定版本pipinstallxlrd==1.2.......