编程随笔 编程随笔
  • 前端
  • 后端
  • 星球项目
  • 开源项目
  • 海康AGV
  • 四向车
  • 工具类
  • 项目仓库

    • 部署仓库 (opens new window)
    • 代码仓库 (opens new window)
  • vuepress插件

    • 自动生成导航栏与侧边栏 (opens new window)
    • 评论系统 (opens new window)
    • 全文搜索 (opens new window)
    • 选项卡 (opens new window)
    • 自动生成sitemap (opens new window)
  • 自主开发插件

    • 批量操作frontmatter (opens new window)
    • 链接美化 (opens new window)
    • 折叠代码块 (opens new window)
    • 复制代码块 (opens new window)

liyao52033

走运时,要想到倒霉,不要得意得过了头;倒霉时,要想到走运,不必垂头丧气。心态始终保持平衡,情绪始终保持稳定,此亦长寿之道
  • 前端
  • 后端
  • 星球项目
  • 开源项目
  • 海康AGV
  • 四向车
  • 工具类
  • 项目仓库

    • 部署仓库 (opens new window)
    • 代码仓库 (opens new window)
  • vuepress插件

    • 自动生成导航栏与侧边栏 (opens new window)
    • 评论系统 (opens new window)
    • 全文搜索 (opens new window)
    • 选项卡 (opens new window)
    • 自动生成sitemap (opens new window)
  • 自主开发插件

    • 批量操作frontmatter (opens new window)
    • 链接美化 (opens new window)
    • 折叠代码块 (opens new window)
    • 复制代码块 (opens new window)
  • 知识点

    • npm 和 yarn
    • 登录后重定向到原先路由
    • patch-package使用
    • TortosseGit的ssh配置
    • nginx常用配置
    • mounted阶段获取不到dom的原因及解决方法
      • 问题描述
      • 分析原因
      • 解决方法
  • 代码调试

  • vue2

  • vue3

  • react

  • typescript

  • 前端
  • 知识点
华总
2024-01-11
0
0
目录

mounted阶段获取不到dom的原因及解决方法原创

# 问题描述

需要在dom渲染后,获取dom来进行页面自动滚动到需要的位置。 在mounted阶段用document.querySelector()以及this.$refs获取元素均获取不到。用两种方式获取元素,打印出来的结果都是undefined。 有解答说用this.nextTick(function(){…}),试了一下结果还是undefined

# 分析原因

1、Vue 推荐使用 template 来创建 HTML。但是模板毕竟是模板,不是真实的dom节点。vue会先利用对象中的render 函数**,**生成虚拟节点并挂载,挂载的真实DOM是进行异步渲染的,并且在修改完状态后也是异步的方式进行渲染。代码中将document.querySelector操作定义为同步任务,此时事件队列应该是:

  • 同步队列:获取dom元素,
  • 异步队列:从虚拟节点转真实节点并进行渲染

根据先同步后异步的执行流程,是获取不到dom元素的;

2、在mounted阶段,若需要获取的元素或组件有v-if,v-for属性。v-if的初始化结果为false。v-for遍历 (opens new window)的数组初始化阶段无值。(即mounted阶段后,根据获得的后台数据来动态操作dom)这两种情况都会导致mounted阶段获取元素的语句获取不到dom。

# 解决方法

1、把获取元素的语句放在异步获取到数据,赋值给data中的key之后进行。同时需要给获取元素的语句加上setTimeout。因为setTimeout是宏任务,会在vue的render函数执行之后再执行。

 mounted() {
        setTimeout(() => {
            if (this.$route.path !== "/") {
                let rightbar = document.querySelector(".right-menu-wrapper");
                let arrow = document.querySelector(".page-nav-centre-next");

                if (rightbar) {
                    arrow.style.right = "16rem";
                } else {
                    arrow.style.right = "2rem"; 
                }
            }
        }, 200);
      
    },
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

2、把获取元素的语句放到updated周期中执行。这种情况下每次视图更新之后都会执行一次获取元素的语句,如果不需要每次视图更新之后都执行,可以在mounted周期中,使用可以在mounted周期中,使用this.$once让获取元素的语句只在updated阶段执行一次。

mounted() {
   this.$once(“hook: updated”, function() {…})
}
1
2
3
上次更新: 2024/01/14 16:27:31
nginx常用配置
浏览器调试

← nginx常用配置 浏览器调试→

最近更新
01
element-plus多文件手动上传 原创
11-03
02
TrueLicense 创建及安装证书 原创
10-25
03
手动修改迅捷配置 原创
09-03
04
安装 acme.sh 原创
08-29
05
zabbix部署 原创
08-20
更多文章>
Copyright © 2023-2024 liyao52033
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式