7.Vue------$refs与$el详解 ------vue知识积累

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

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

简述三者区别:

  • ref :是 元素的属性,用于设置在元素上
  • $refs :是 ref 的集合,集合里面包含了当前.vue中的所有 ref用于获取普通元素中的 DOM 以及 子组件中方法/参数的
  • $el :是 用于获取组件内 DOM(包括子组件,当前.vue组件,以及父组件)

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

<template>
  <div class="content">
    <div>
      <el-button type="success"  @click="handleSubmit">
        确定
      </el-button>
      <!-- 设定 ref="passA" elementui组件按钮-->
      <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)
},

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 比照,可以更好的理解

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

子组件:

<template>

    <div>
      <div class="border">
        <div>我是子组件</div>  
        <input v-model="value" />
      </div>
    </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>

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

<template>
  <div class="content">
    <!-- elementui中的组件按钮 -->
    <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岁
        })
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/935520.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

医院门诊预约挂号管理系统设计与实现

文末获取源码和万字论文&#xff0c;制作不易&#xff0c;感谢点赞支持。 医院门诊预约挂号管理系统设计与实现 摘 要 本医院门诊预约挂号管理系统是针对目前医院门诊预约挂号管理的实际需求&#xff0c;从实际工作出发&#xff0c;对过去的医院门诊预约挂号管理系统存在的问题…

学习记录,泛型界限1

泛型界限 上限 泛型的上限&#xff0c;下限。对类型的更加具体的约束&#xff01; 如果给某个泛型设置了上界&#xff1a;这里的类型必须是上界 如果给某个泛型设置了下界&#xff1a;这里的类型必须是下界

OpenAI直播发布第4天:ChatGPT Canvas全面升级,免费开放!

大家好&#xff0c;我是木易&#xff0c;一个持续关注AI领域的互联网技术产品经理&#xff0c;国内Top2本科&#xff0c;美国Top10 CS研究生&#xff0c;MBA。我坚信AI是普通人变强的“外挂”&#xff0c;专注于分享AI全维度知识&#xff0c;包括但不限于AI科普&#xff0c;AI工…

[工具升级问题] 钉钉(linux版)升级带来的小麻烦

本文由Markdown语法编辑器编辑完成。 1. 背景: 今日钉钉又发布了新的升级版本。由于我工作时使用的是Ubuntu 20.04版本&#xff0c;收到的升级推送信息是&#xff0c;可以升级到最新的7.6.25-Release版本。根据钉钉官方给出的历次更新版说明&#xff0c;这个新的版本&#xf…

DPDK用户态协议栈-TCP Posix API 2

tcp posix api send发送 ssize_t nsend(int sockfd, const void *buf, size_t len, __attribute__((unused))int flags) {ssize_t length 0;void* hostinfo get_host_fromfd(sockfd);if (hostinfo NULL) {return -1;}struct ln_tcp_stream* stream (struct ln_tcp_stream…

【网络开发-socket编程】

1 socket 简介 socket&#xff08;套接字&#xff09;是linux下的一种进程间通信机制&#xff0c;使用socket的IPC可以使得不同主机之间通信&#xff0c;也可以是同一台主机的不同程序之间。socket通常是客户端<------>服务端的通信模式&#xff0c;多个客户端可以同时连…

Python实现中国象棋

探索中国象棋 Python 代码实现&#xff1a;从规则逻辑到游戏呈现 中国象棋&#xff0c;这款源远流长的棋类游戏&#xff0c;承载着深厚的文化底蕴与策略智慧。如今&#xff0c;借助 Python 与 Pygame 库&#xff0c;我们能够在数字世界中复刻其魅力&#xff0c;深入探究代码背后…

TensorFlow深度学习实战(1)——神经网络与模型训练过程详解

TensorFlow深度学习实战&#xff08;1&#xff09;——神经网络与模型训练过程详解 0. 前言1. 神经网络基础1.1 神经网络简介1.2 神经网络的训练1.3 神经网络的应用 2. 从零开始构建前向传播2.1 计算隐藏层节点值2.2 应用激活函数2.3 计算输出层值2.4 计算损失值2.4.1 在连续变…

vue-router路由传参的两种方式(params 和 query )

一、vue-router路由传参问题 1、概念&#xff1a; A、vue 路由传参的使用场景一般应用在父路由跳转到子路由时&#xff0c;携带参数跳转。 B、传参方式可划分为 params 传参和 query 传参&#xff1b; C、而 params 传参又可分为在 url 中显示参数和不显示参数两种方式&#x…

数据库同步中间件DBSyncer安装配置及使用

1、介绍 DBSyncer&#xff08;英[dbsɪŋkɜː]&#xff0c;美[dbsɪŋkɜː 简称dbs&#xff09;是一款开源的数据同步中间件&#xff0c;提供MySQL、Oracle、SqlServer、PostgreSQL、Elasticsearch(ES)、Kafka、File、SQL等同步场景。支持上传插件自定义同步转换业务&#xf…

基于python快速部署属于你自己的页面智能助手

文章目录 前言一、实现目标二、代码解析2.1目录结构2.2 后端&#xff1a;Flask 服务器的搭建2.2.1 安装 Flask2.2.2 创建 Flask 应用 2.3 实现聊天界面与消息交互2.3.1 创建聊天界面 三、跨域问题的解决3.1 安装 flask-cors3.2 在 Flask 中启用 CORS 五 效果展示 前言 AI 聊天机…

Docker在Ubuntu和CentOS系统下的安装

目录 1. 各版本平台支持情况2. 在Ubuntu系统下安装docker3. 常见报错4. Docker的镜像源修改5. Docker目录修改6. 在CentOS系统下安装docker 1. 各版本平台支持情况 &#xff08;1&#xff09;平台支持情况如下&#xff1a; Server 版本 桌面版本 2. 在Ubuntu系统下安装docker…

深入解析强化学习中的 Generalized Advantage Estimation (GAE)

中文版 深入解析强化学习中的 Generalized Advantage Estimation (GAE) 1. 什么是 Generalized Advantage Estimation (GAE)? 在强化学习中&#xff0c;计算策略梯度的关键在于 优势函数&#xff08;Advantage Function&#xff09; 的设计。优势函数 ( A ( s , a ) A(s, a…

【开源】基于SpringBoot框架的个性化的旅游网站 (计算机毕业设计)+万字毕业论文 T025

系统合集跳转 源码获取链接 一、系统环境 运行环境: 最好是java jdk 1.8&#xff0c;我们在这个平台上运行的。其他版本理论上也可以。 IDE环境&#xff1a; Eclipse,Myeclipse,IDEA或者Spring Tool Suite都可以 tomcat环境&#xff1a; Tomcat 7.x,8.x,9.x版本均可 操作系统…

java web 实验五 Servlet控制层设计(设计性)

实验五 Servlet控制层设计&#xff08;设计性&#xff09; //代码放在资源包里了 实验目的 熟悉Servlet的基本语法。掌握采用HTML、JS、JDBC、JSP、Servlet和四层结构的综合应用。实验要求 本实验要求每个同学单独完成&#xff1b;调试程序要记录调试过程中出现的问题及解决…

汽车保养系统+ssm

摘 要 由于APP软件在开发以及运营上面所需成本较高&#xff0c;而用户手机需要安装各种APP软件&#xff0c;因此占用用户过多的手机存储空间&#xff0c;导致用户手机运行缓慢&#xff0c;体验度比较差&#xff0c;进而导致用户会卸载非必要的APP&#xff0c;倒逼管理者必须改…

仿iOS日历、飞书日历、Google日历的日模式

仿iOS日历、飞书日历、Google日历的日模式&#xff0c;24H内事件可自由上下拖动、自由拉伸。 以下是效果图&#xff1a; 具体实现比较简单&#xff0c;代码如下&#xff1a; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color;…

网易云信荣获“HarmonyOS NEXT SDK星河奖”

近日&#xff0c;鸿蒙生态伙伴 SDK 开发者论坛在北京举行。 网易云信凭借在融合通信领域的技术创新和鸿蒙生态贡献&#xff0c;荣获鸿蒙生态“HarmonyOS NEXT SDK星河奖”。 会上&#xff0c;华为鸿蒙正式推出 SDK 生态繁荣伙伴支持计划&#xff0c;旨在为 SDK 领域伙伴和开发…

Electromagnetic Tracking Smart Car based on STM32F401 or GD32F450ZGT6

Electromagnetic Smart Car1 基于梁山派的电磁循迹智能车的主控芯片来自立创梁山派板载的国产兆易创新GD32F450ZGT6&#xff0c;整车采用模块化开发&#xff0c;由电源模块、L298N驱动模块、电磁循迹模块、梁山派、调试模块和显示模块组成。 嵌入式软件开发环境是&#xff1a;K…

Windows下Docker Desktop+k8s安装和部署程序

Windows下Docker Desktopk8s安装和部署程序 一、安装Docker DesktopKubernetes 1.需要安装windows版的docker 安装 Docker Desktop&#xff0c;启用Hyper-V、虚拟机平台和容器 https://www.docker.com/get-started/ 2.启用Kubernetes 打开Docker-Desktop&#xff0c;启用…