首页 > 其他分享 >vue的ref引用

vue的ref引用

时间:2023-06-09 09:34:29浏览次数:40  
标签:vue DOM cb refs 更新 引用 组件 ref

ref引用

ref

  • 在vue中,不需要操作dom,只需要维护数据。

  • ref在不需要依赖jquery的情况下,获取dom元素或组件的引用。

  • 每个vue的组件实例上,都包含一个 $refs 对象,里面存储着对应dom元素或组件的引用。

  • 默认情况下,组件的$refs指向一个空对象。

  • ref可以父传子,也可以子传父。

  • 在命名时最好将ref作为后缀。

  • console info(VueComponent)$开头的都是vue内置的成员。

<h1 ref="myh1">App 根组件</h1>

//console:
$refs:
myh1:h1 //myh1指向元素h1 //this.$refs.myh1 即指向元素h1
[[Prototype]]:Object

示例


<template>
<!-- 引用 DOM 元素 -->
<p ref="pp">这是段落</p>
<button @click="getRef">获取 DOM 元素</button>

<!-- 引用子组件 -->
<son ref="sonRef"></son>//注意引用子组件是在父组件的子组件标签上使用ref。
<button @click="getComponent">获取子组件实例引用</button>
</template>

<script>
methods: {
 getRef() {
   // 获取元素的引用
   console.log(this.$refs.pp)
   this.$refs.pp.style.color = 'red'
},
 getComponent() {
   console.log(this.$refs.sonRef)
   // 可以访问子组件的数据和方法
   this.$refs.sonRef.count = 1
   this.$refs.sonRef.add()
}
}
</script>

this.$nextTick(cb)

含义

this.$nextTick(cb) 是 Vue 实例的一个方法,用于在 DOM更新渲染完成后 执行回调函数 cb。在 Vue 中,数据的变化可能会导致 DOM 的更新,但是 DOM 的更新并不是实时的,而是异步的,所以有时候需要在 DOM 更新后执行一些操作,比如访问更新后的 DOM 元素或执行其他操作。

this.$nextTick(cb) 的作用是将回调函数 cb 推入到 Vue 的更新队列中,等到 DOM 更新完成后再执行。这样可以确保在回调函数中访问到最新的 DOM 元素。

常见的用法场景包括:

  • 在更新数据后立即访问更新后的 DOM 元素。

  • 在 Vue 的生命周期钩子函数中进行 DOM 操作,确保操作发生在 DOM 更新后。

  • 在异步操作中,等待 DOM 更新完成后再执行后续操作。

需要注意的是,this.$nextTick(cb) 是异步的,回调函数 cb 的执行顺序是在当前 JavaScript 执行完成后、DOM 更新前。

语法

this.$nextTick(() => {
 // 在 DOM 更新后执行回调函数
 // 可以访问更新后的 DOM 元素
 // 执行其他操作
});

示例

<template>
...
<input type="text" v-if="inputVisible" ref="showInput" @blur="loseBlur">
<button v-else @click="changeInput">show input</button>
...
</template>
<script>
 export default {
   data() {
     return {
       inputVisible: false
    },
       methods: {
         //点击按钮,展示输入框。
         changeInput() {
           this.inputVisible = true
           //console.info(this.$refs.showInput)
           //this.$refs.showInput.focus()
           //展示输入框时展示焦点
           this.$nextTick(() => {
             console.info(this.$refs.showInput);
             this.$refs.showInput.focus();
          });
        },
           //失去焦点,隐藏输入框
           loseBlur() {
             this.inputVisible = false
          },
      },
  },
</script>

TypeError

TypeError: Cannot read properties of undefined (reading 'focus')

当遇到类似的错误,表达的意思即为‘focus’之前的那个为undefined,在这里即为showInput

提示

this.$refs.showInput.focus()写在updated函数里可以实现效果但会报错:

因为updated是只要数据变化就会重新渲染,这会导致每一次数据变化都会使focus,然而很多时候只有按钮没有input。

标签:vue,DOM,cb,refs,更新,引用,组件,ref
From: https://www.cnblogs.com/yxxcl51/p/17468227.html

相关文章

  • FireFox网页截图
    1.进入“扩展和主题”(Ctrl+Shift+A)2.搜索并安装“截图-完整网页长截图” 3.安装后可以在“管理扩展快捷键”中设置快捷键 默认是Ctrl+Shift+S 4.使用快捷键或在“扩展”中打开截图即可使用,可直接截取整个网页。 ......
  • C++面试八股文:C++中指针、引用、解引用和取地址有什么不同?
    C++面试八股文:C++中指针、引用、解引用和取地址有什么不同?某日小二参加XXX科技公司的C++工程师开发岗位2面:面试官:指针、引用、解引用和取地址是C++中的重要概念,请问它们在语法和语义上有所不同?小二:指针是一个变量,它存储了一个内存地址。小二:引用是一个别名,它允许使用一个......
  • 过滤器-使用Vue.filter定义全局变量
    私有过滤器和全局过滤器在filters节点下定义的过滤器,称为”私有过滤器“,因为它它只能在当前VM实例所控制的el区域内使用。如果希望在多个vue实例之间共享过滤器,则可以按照如下的格式定义全局过滤器:<!DOCTYPEhtml><html> <head> <metacharset="utf-8"> <title></title> ......
  • Vue开发实战(02)-MVVM模式
    1JQ实现待办任务列表<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>TodoListJquery</title><scriptsrc='jquery.js'></script></head><......
  • SpringBoot+Vue+Spring Cloud Alibaba 实现大型电商系统【分布式微服务实现】
    前言这篇博客主要记录的是谷粒商城项目的完整开发过程大家想看的话也可以去这里看看:笔记地址传送门后续还会继续维护这个笔记一、项目架构二、技术总和三、开发准备1、开发环境搭建2、工程初始化四、分布式基础篇(全栈开发篇)五、分布式高级篇(微服务架构篇)......
  • 【web 开发】PHP 特殊的对象引用之 "$this"
    前言前面我们介绍了面向对象相关的内容,我们了解到访问对象的成员必须通过对象的引用来完成.如果在对象的内部,在对象的成员方法中访问自己对象中的成员属性,或者访问自己对象内其他成员方法时怎么处理呢?答案只有一个,不管是在对象的外部还是在对象内部,访问对象中的成员都必须使......
  • Vue知识沉淀
    为什么组件my-item的props是listCount,但传入时候用:list-count传入,而listCount与list-count不一致<!DOCTYPEhtml><htmllang="en"xmlns="http://www.w3.org/1999/xhtml"><head><metacharset="utf-8"/><title><......
  • vue项目之vue-cli创建项目&目录结构&编写规范&es6导入导出语法
    1vue-cli创建项目#单页面应用:spa -以后vue项目就只有一个xx.html页面-定义很多组件,不可能都写在xx.html中#单文件组件(一个组件一个文件) https://v2.cn.vuejs.org/v2/guide/single-file-components.html#ad#一个组件中有的东西 1html内容:以后html都放......
  • 总结vue3 的一些知识点:MySQL 运算符
    MySQL运算符本章节我们主要介绍MySQL的运算符及运算符的优先级。MySQL主要有以下几种运算符:算术运算符比较运算符逻辑运算符位运算符算术运算符MySQL支持的算术运算符包括:运算符作用+加法-减法*乘法/或DIV除法%或MOD取余在除法......
  • 总结vue3 的一些知识点:MySQL NULL 值处理
    MySQLNULL值处理我们已经知道MySQL使用SQLSELECT命令及WHERE子句来读取数据表中的数据,但是当提供的查询条件字段为NULL时,该命令可能就无法正常工作。为了处理这种情况,MySQL提供了三大运算符:ISNULL: 当列的值是NULL,此运算符返回true。ISNOTNULL: 当列的......