Vue.js 页面渲染完成后执行方法的两种解决方案

作者:山岚

时间:2026-10-23

浏览:280

在Vue开发中,mounted或created钩子执行时页面可能尚未渲染完成,导致查找标签报错。本文介绍两种解决方案:一是通过子组件向父组件发射事件,利用父页面已渲染完成的特性进行操作;二是使用$nextTick监听参数初始化,确保DOM更新后再执行逻辑。结合Element UI Tab组件实例,详细解析代码实现与注意事项。

文章目录

Vue 页面渲染后执行方法的问题背景

通常开发者会尝试在 mounted 或 created 生命周期钩子中调用所需方法,但有时会发现此时页面 DOM 尚未完全渲染,导致在匹配页面标签时出现报错。

两种解决思路概述

针对上述问题,主要有两种解决思路:

第一种方法是利用子页面调用父页面的方法。由于子页面开始渲染时,父页面必然已经渲染完成,因此如果方法的操作目标是父页面的标签,这种方式可行。

第二种方法是直接在本页面监视一个参数。当检测到该参数被初始化时,说明页面已经加载完成,前提是该页面逻辑依赖此参数。

方法一:子页面调用父页面方法

以下是方法一的具体案例:在 Tab 页的子页面中,如果子页面没有内容,则将其隐藏。

首先查看父页面的代码实现。


<el-tabs v-model="initTab" type="card">
 <el-tab-pane label="1信息" name="tab1">
  1
 </el-tab-pane>
 <el-tab-pane label="2报告" name="tab2">
  2
 </el-tab-pane>
 <el-tab-pane label="3信息" name="tab3">
  3
 </el-tab-pane>
 <el-tab-pane label="4信息" name="tab4">
  <ziyemian-group @tabShow="tabShow" title="4信息" v-if="detailInfo">
  </ziyemian-group>
 
 </el-tab-pane>
 <el-tab-pane label="5信息" name="tab5">
  5
 </el-tab-pane>
 <el-tab-pane label="其它信息" name="tab6">
  6
 </el-tab-pane>
</el-tabs>
 
import ZiyemianGroup from './ZiyemianGroup.vue'
components: {
 ZiyemianGroup
},
data () {
  return {
    detailInfo: {},
    initTab:‘tab1'
  }
}
methods: {
 tabShow: (data) => {
  document.getElementsByClassName('el-tabs__item').item(4).style.display = data
 },
}

接着是 ZiyemianGroup.vue 的代码,该组件主要负责方法调用,页面逻辑由父组件处理。


data () {
 return {
  list: []
 }
},
mounted () {
 this.init()
},
methods: {
 init() {
  if (list.length > 0) {
    this.$emit('whiteShow', 'inline')
  } else {
    this.$emit('whiteShow', 'none')
  }
 )
}

通过 list 数组判断子页面的内容。若子页面没有内容,即可将其隐藏。

方法二:使用 nextTick 监听参数初始化

以下是方法二的案例:需要在 Tab 页中实现隐藏特定 Tab 的功能。


<el-tabs v-model="initTab" type="card">
 <el-tab-pane label="1信息" name="tab1">
  1
 </el-tab-pane>
 <el-tab-pane label="2报告" name="tab2">
  2
 </el-tab-pane>
 <el-tab-pane label="3信息" name="tab3">
  3
 </el-tab-pane>
 <el-tab-pane label="4信息" name="tab4">
  <ziyemian-group title="4信息" v-if="detailInfo">
  </ziyemian-group>
 
 </el-tab-pane>
 <el-tab-pane label="5信息" name="tab5">
  5
 </el-tab-pane>
 <el-tab-pane label="其它信息" name="tab6">
  6
 </el-tab-pane>
</el-tabs>
 
import ZiyemianGroup from './ZiyemianGroup.vue'
components: {
 ZiyemianGroup
},
data () {
  return {
    detailInfo: {},
    initTab:‘tab1'
  }
}
watch: {
 detailInfo: function () {
  this.$nextTick(function () {
   this.tabShow()
  })
 }
},
methods: {
  tabShow () {
    document.getElementsByClassName('el-tabs__item').item(6).style.display = 'none' // 隐藏tab6
  }
}

这里使用了 nextTick 方法,其作用是在下次 DOM 更新循环结束之后执行延迟回调。在修改数据后立即使用此方法,可以获取更新后的 DOM。

隐藏 Tab 的逻辑使用了原生 JavaScript,因为 Vue 渲染后的页面结构与编写的 Vue 模板存在差异,因此采用直接匹配的方式进行处理。

以上介绍了 Vue.js 中页面加载完成后执行方法的两种解决方案,希望对大家有所帮助。如有任何疑问,欢迎留言,小编会及时回复。感谢大家对本站的支持!

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章