程序员scholar 程序员scholar
首页
  • Java 基础

    • JavaSE
    • JavaIO
    • JavaAPI速查
  • Java 高级

    • JUC
    • JVM
    • Java新特性
    • 设计模式
  • Web 开发

    • Servlet
    • Java网络编程
  • Web 标准

    • HTML
    • CSS
    • JavaScript
  • 前端框架

    • Vue2
    • Vue3
    • Vue3 + TS
    • 微信小程序
    • uni-app
  • 工具与库

    • jQuery
    • Ajax
    • Axios
    • Webpack
    • Vuex
    • WebSocket
    • 第三方登录
  • 后端与语言扩展

    • ES6
    • Typescript
    • node.js
  • Element-UI
  • Apache ECharts
  • 数据结构
  • HTTP协议
  • HTTPS协议
  • 计算机网络
  • Linux常用命令
  • Windows常用命令
  • SQL数据库

    • MySQL
    • MySQL速查
  • NoSQL数据库

    • Redis
    • ElasticSearch
  • 数据库

    • MyBatis
    • MyBatis-Plus
  • 消息中间件

    • RabbitMQ
  • 服务器

    • Nginx
  • Spring框架

    • Spring6
    • SpringMVC
    • SpringBoot
    • SpringSecurity
  • SpringCould微服务

    • SpringCloud基础
    • 微服务之DDD架构思想
  • 日常必备

    • 开发常用工具包
    • Hutoll工具包
    • IDEA常用配置
    • 开发笔记
    • 日常记录
    • 项目部署
    • 网站导航
    • 产品学习
    • 英语学习
  • 代码管理

    • Maven
    • Git教程
    • Git小乌龟教程
  • 运维工具

    • Docker
    • Jenkins
    • Kubernetes
  • 算法笔记

    • 算法思想
    • 刷题笔记
  • 面试问题常见

    • 十大经典排序算法
    • 面试常见问题集锦
关于
GitHub (opens new window)
首页
  • Java 基础

    • JavaSE
    • JavaIO
    • JavaAPI速查
  • Java 高级

    • JUC
    • JVM
    • Java新特性
    • 设计模式
  • Web 开发

    • Servlet
    • Java网络编程
  • Web 标准

    • HTML
    • CSS
    • JavaScript
  • 前端框架

    • Vue2
    • Vue3
    • Vue3 + TS
    • 微信小程序
    • uni-app
  • 工具与库

    • jQuery
    • Ajax
    • Axios
    • Webpack
    • Vuex
    • WebSocket
    • 第三方登录
  • 后端与语言扩展

    • ES6
    • Typescript
    • node.js
  • Element-UI
  • Apache ECharts
  • 数据结构
  • HTTP协议
  • HTTPS协议
  • 计算机网络
  • Linux常用命令
  • Windows常用命令
  • SQL数据库

    • MySQL
    • MySQL速查
  • NoSQL数据库

    • Redis
    • ElasticSearch
  • 数据库

    • MyBatis
    • MyBatis-Plus
  • 消息中间件

    • RabbitMQ
  • 服务器

    • Nginx
  • Spring框架

    • Spring6
    • SpringMVC
    • SpringBoot
    • SpringSecurity
  • SpringCould微服务

    • SpringCloud基础
    • 微服务之DDD架构思想
  • 日常必备

    • 开发常用工具包
    • Hutoll工具包
    • IDEA常用配置
    • 开发笔记
    • 日常记录
    • 项目部署
    • 网站导航
    • 产品学习
    • 英语学习
  • 代码管理

    • Maven
    • Git教程
    • Git小乌龟教程
  • 运维工具

    • Docker
    • Jenkins
    • Kubernetes
  • 算法笔记

    • 算法思想
    • 刷题笔记
  • 面试问题常见

    • 十大经典排序算法
    • 面试常见问题集锦
关于
GitHub (opens new window)
npm

(进入注册为作者充电)

  • Vue2

    • Vue简介
    • Vue 基础使用
    • Vue的基础指令
    • 过滤器(Filters)
    • 侦听器(Watch)
    • 计算属性(computed)
    • vue-cli
    • vue.config.js配置
    • Vue组件
    • 生命周期和数据共享
    • Vue 组件实例与数据代理 (this)
    • $refs 引用
      • 1. 什么是 ref 引用
      • 2. 使用 ref 引用 DOM 元素
      • 3. 使用 ref 引用组件实例
      • 4. 控制文本框和按钮的按需切换
      • 5. 让文本框自动获得焦点
      • 6. this.$nextTick(callback) 方法
    • 动态组件
    • 插槽 (Slots)
    • 混入 (Mixin)
    • 自定义指令 (directives)
    • 插件 (Plugins)
    • 初识Vue-router
    • Vue-router的常见用法
  • Vue3

  • vue3 + TS 项目集成

  • Vue全家桶
  • Vue2
scholar
2024-07-31
目录

$refs 引用

# $refs 引用

# 1. 什么是 ref 引用

ref 用来辅助开发者在不依赖于 jQuery 的情况下,获取 DOM 元素或组件的引用。每个 Vue 的组件实例上,都包含一个 $refs 对象,里面存储着对应的 DOM 元素或组件的引用。默认情况下,组件的 $refs 指向一个空对象。

ref 的语法格式如下:

<!-- 在模板中 -->
<element ref="name"></element>
1
2

通过在模板中的元素上添加 ref 属性,并指定一个名字,就可以在 Vue 组件实例的 $refs 对象中访问到该元素或组件实例。

使用 `ref` 的典型场景包括:

  1. 访问子组件的方法和数据:在父组件中直接调用子组件的方法,或访问子组件的数据。
  2. 操作 DOM 元素:当需要直接操作某个 DOM 元素时,可以通过 ref 获取该元素的引用。
  3. 与第三方库结合:在某些情况下,可能需要与不遵循 Vue 哲学的第三方库进行整合,此时可以通过 ref 直接操作 DOM。

# 2. 使用 ref 引用 DOM 元素

如果想要使用 ref 引用页面上的 DOM 元素,可以按照如下的方式进行操作:



 







 




<template>
  <div>
    <input type="text" ref="inputElement"> <!-- 在 input 元素上添加 ref="inputElement" -->
  </div>
</template>

<script>
export default {
  mounted() {
    // 在组件挂载后访问 DOM 元素引用
    this.$refs.inputElement.focus(); // 让 input 元素获得焦点
  }
};
</script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14

在上面的示例中,我们在 input 元素上添加了 ref="inputElement",然后在 mounted 钩子中通过 this.$refs.inputElement 访问该元素,并调用其 focus 方法,使其获得焦点。

# 3. 使用 ref 引用组件实例

  • 如果想要在父组件中直接调用子组件的方法,或访问子组件的数据,可以在子组件或元素上添加 ref 属性。
  • 然后在父组件的 mounted 钩子或其他生命周期钩子中,通过 this.$refs 获取子组件实例(VueComponent)。



 












 
 




<template>
  <div>
    <!-- 在自定义组件上使用 ref -->
    <child-component ref="childComponent"></child-component> <!-- 在自定义组件上添加 ref="childComponent" -->
  </div>
</template>

<script>
import ChildComponent from './ChildComponent.vue';

export default {
  components: {
    ChildComponent
  },
  mounted() {
    // 在组件挂载后访问组件实例引用
    console.log(this.$refs.childComponent); // 打印子组件实例
    this.$refs.childComponent.someMethod(); // 调用子组件的方法
  }
};
</script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

在上面的示例中,我们在 child-component 组件上添加了 ref="childComponent",然后在 mounted 钩子中通过 this.$refs.childComponent 访问该组件实例,并调用其方法。

# 4. 控制文本框和按钮的按需切换

通过布尔值 inputVisible 来控制组件中的文本框与按钮的按需切换。示例代码如下:



 
 







 



 
 
 
 
 
 




<template>
  <div>
    <button v-if="!inputVisible" @click="showInput">显示文本框</button> <!-- 当 inputVisible 为 false 时显示按钮 -->
    <input v-else type="text" ref="inputElement"> <!-- 当 inputVisible 为 true 时显示文本框 -->
  </div>
</template>

<script>
export default {
  data() {
    return {
      inputVisible: false // 控制文本框显示的布尔值,初始值为 false
    };
  },
  methods: {
    showInput() {
      this.inputVisible = true; // 将 inputVisible 设置为 true,显示文本框
      this.$nextTick(() => {
        this.$refs.inputElement.focus(); // 在下一个 DOM 更新周期后让文本框获得焦点
      });
    }
  }
};
</script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

在上面的示例中,我们通过 v-if 和 v-else 指令控制文本框和按钮的显示与隐藏。当按钮被点击时,调用 showInput 方法,将 inputVisible 设置为 true,并使用 $nextTick 在下一个 DOM 更新周期之后让文本框获得焦点。

# 5. 让文本框自动获得焦点

当文本框展示出来之后,如果希望它立即获得焦点,则可以为其添加 ref 引用,并调用原生 DOM 对象的 focus 方法即可。示例代码如下:



 
 







 



 
 
 
 
 
 




<template>
  <div>
    <button v-if="!inputVisible" @click="showInput">显示文本框</button> <!-- 当 inputVisible 为 false 时显示按钮 -->
    <input v-else type="text" ref="inputElement"> <!-- 当 inputVisible 为 true 时显示文本框 -->
  </div>
</template>

<script>
export default {
  data() {
    return {
      inputVisible: false // 控制文本框显示的布尔值,初始值为 false
    };
  },
  methods: {
    showInput() {
      this.inputVisible = true; // 将 inputVisible 设置为 true,显示文本框
      this.$nextTick(() => {
        this.$refs.inputElement.focus(); // 在下一个 DOM 更新周期后让文本框获得焦点
      });
    }
  }
};
</script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

在上面的示例中,当按钮被点击时,文本框显示出来并自动获得焦点。

# 6. this.$nextTick(callback) 方法

$nextTick 方法用于在下一个 DOM 更新周期之后执行指定的回调函数。这是为了确保对最新的 DOM 结构进行操作,因为 Vue 的 DOM 更新是异步的。语法结构如下:

this.$nextTick(callback);
1

何时使用

当你在 Vue 组件中更改数据后,可能需要立即对更新后的 DOM 元素进行操作。这时候,$nextTick 就派上用场了。使用 $nextTick 可以确保 DOM 完成更新后,再执行回调函数。

使用场景

  • 动态生成的列表:例如,通过 Vue 生成的 list,希望在生成后立即对 DOM 进行某些操作(如聚焦某个元素)。
  • 动画和过渡效果:在数据变更引发的 DOM 更新后执行动画。
  • 检测和调试:在数据更新引发 DOM 改变后,验证 DOM 结构。

以下是一个示例,展示如何在更新文本后立即操作最新的 DOM 元素:



 
 







 





 
 
 
 





<template>
  <div>
    <button @click="updateText">更新文本</button> <!-- 当按钮被点击时,调用 updateText 方法 -->
    <p ref="textElement">{{ text }}</p> <!-- 使用 ref 引用 p 元素 -->
  </div>
</template>

<script>
export default {
  data() {
    return {
      text: '初始文本' // 定义初始文本内容
    };
  },
  methods: {
    updateText() {
      this.text = '更新后的文本'; // 更新文本内容
      this.$nextTick(() => {
        // 在 DOM 更新完成后操作最新的 DOM 元素
        console.log(this.$refs.textElement.innerText); // 输出更新后的文本内容
      });
    }
  }
};
</script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

注意事项

  • $nextTick 不适用于所有的场合。若你仅仅是为了在数据更新后执行一些逻辑,而不依赖 DOM 状态的变化,则不必使用 $nextTick。
  • $nextTick 的作用域问题:要确保在组件上下文中调用,以便正确获取到组件实例的 refs 和其他实例属性。
编辑此页 (opens new window)
上次更新: 2025/01/30, 23:55:43
Vue 组件实例与数据代理 (this)
动态组件

← Vue 组件实例与数据代理 (this) 动态组件→

Theme by Vdoing | Copyright © 2019-2025 程序员scholar
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式