Vue中在mounted中通过this.$refs但是获取不到属性的几种常见情况分析

news/2024/7/10 2:11:27 标签: vue, javascript

文章目录

  • 前言
  • 一、使用this.$refs 获取的组件使用了组件懒加载
  • 二、和Vue指令同用比如(v-for,v-if,v-show等)
  • 三、调用时机不对
  • 总结


前言

Vue中在mounted中通过this.$refs但是获取不到属性的几种常见情况分析。


一、使用this.$refs 获取的组件使用了组件懒加载

javascript"><Scroll ref="scrollTop"></Scroll>

components: {
    Scroll: () => import("@/components/scroll"),
  },

分析:使用ES6懒加载的这种方式引入该组件,会将多个模块的js分割打包,所以改组件不会在页面加载完成的时候全部加载,所以在mounted函数中获取不到对应组件。

解决办法::采用原始的组件引入方式,不采用懒加载。

javascript">import Scroll from 'components/common/scroll/Scroll.vue'

二、和Vue指令同用比如(v-for,v-if,v-show等)

javascript"><Scroll ref="scrollTop" v-if="isLoading"></Scroll>

import Scroll from 'components/common/scroll/Scroll.vue'

分析:比如使用了v-if 或者 v-show 这些指令的前提下,使用this.$refs 获取DOM,会出现一个

Error in updated hook: "TypeError: Cannot read property 'style' of undefined"

这样的报错,因为v-if等指令,会根据不同的条件去动态的渲染DOM树,因此这些 DOM 在 mounted 阶段是不存在的,在所以使用$refs是不能获取到DOM对象的。

解决办法::将ref 与 vue指令分开使用,不能写道一个DOM上

三、调用时机不对

  • mounted 阶段是加载阶段,有些DOM可能存在还没有完成的情况, updated 阶段则是完成了数据更新到 DOM 的阶段(对加载回来的数据进行处理),此时,再使用 this.$refs.xx,就 100% 能找到该 DOM 节点。
  • updated 与 mounted 不同的是,在每一次的 DOM 结构更新,Vue.js 都会调用一次 updated 钩子函数,而 mounted 钩子函数仅仅只执行一次而已。
  • 我们也可以和 n e x t T i c k 结 合 使 用 , nextTick结合使用, nextTick使nextTick 是在下次 DOM 更新循环结束之后执行延迟回调,在修改数据之后使用$nextTick,则可以在回调中获取更新后的 DOM。

总结

这篇文章主要给大家分析了Vue中在mounted中通过this.$refs但是获取不到属性的几种常见情况,给出了一些个人的解决办法和思路,希望对大家有所帮助。


http://www.niftyadmin.cn/n/1318916.html

相关文章

hdu 3336 KMP

Count the string 1 /*2 写于13年3月21日3 http://acm.hdu.edu.cn/showproblem.php?pid33364 2013-03-21 10:39:01 Accepted 3336 46MS 2016K5 很巧妙的利用了KMP函数get_next()的思想6 通过对其进行改写达到目的7 data[i]表示[1....i]字符串出现的次数8 */9 10 …

Vue3.0中emit的使用

文章目录一、emit是什么&#xff1f;二、Vue 2.0和3.0的使用区别一、emit是什么&#xff1f; emit的主要作用是子组件可以通过使用 emit,让父组件监听到自定义事件 &#xff0c;以及传递的参数 二、Vue 2.0和3.0的使用区别 Vue 2.0&#xff1a; 子组件&#xff1a; methods…

angularJS disabled用法实例

angularJS disabled用法实例 angularJS此实例的覆盖知识点有&#xff1a; 1.ng-repeat的用法 2.filter的用法 3.页面显示时code转名称 4.ng-disabled在实例中的应用 5.angular.copy的应用 index2.html <!doctype html> <html ng-app><head><script src&qu…

Vite打包项目提示“some chunks are larger than 500 kib....“

在使用ViteVue3.0 打包过程中一直提示部分chunks过大。 解决办法&#xff0c;在vite.config.ts 中加入如下代码片段&#xff0c;重新打包提示消失。 build: {chunkSizeWarningLimit: 1000,rollupOptions: {output: {// 分包manualChunks(id) {if (id.includes("node_modu…

javascript学习笔记(3)--closest()和parents的区别

.closest().parents()从当前元素开始从父元素开始沿 DOM 树向上遍历&#xff0c;直到找到已应用选择器的一个匹配为止。沿 DOM 树向上遍历&#xff0c;直到文档的根元素为止&#xff0c;将每个祖先元素添加到一个临时的集合&#xff1b;如果应用了选择器&#xff0c;则会基于该…

ajax长轮询实例

html页面&#xff1a; <script> $(function(){ function test(){ $url"xx.php"; comet$.post($url,function(data){ if(datanull){ comet.abort…

Oracle 9i建表时需要加上MONITORING参数的作用

MONITORING参数说明&#xff1a;创建表时设置MONITORING参数, 使得Oracle跟踪对表的DML操作&#xff0c;预估DML操作所影响的记录数量。在Oracle 9i中, MONITORING参数不是默认的,需要手工执行,而在Oracle 10g及以上版本中, 该参数为默认设置。 1.创建表时设置MONITORING参数 c…

ViewGroup类的onInterceptTouchEvent()方法及所有View类的onTouchEvent()方法的使用及联系...

onInterceptTouchEvent()方法是只有ViewGroup的子类才有的方法&#xff1a; 1.  功能理解上来说是父视图类拦截了TouchEvent后来由该父视图来判断此Event要由谁来处理——自己或者下传给子视图逐级判断。因此只能是ViewGroup这种可以有子视图的容器类才有该方法。 而onTouchE…