我的编程空间,编程开发者的网络收藏夹
学习永远不晚

vue获取v-for异步数据dom的解决问题

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

vue获取v-for异步数据dom的解决问题

vue获取v-for异步数据dom

问题描述

每次加载界面时,在 mounted阶段,只能获取普通dom(指静态渲染的dom),获取不到v-for的dom,尽管使用$nextTick也获取不到,虽然使用setTimeOut能解决,但这种方法真的很low,作为程序员要追求完美,下面我们看看怎么完美解决这个问题。

原因

在v-for里的数据是异步获取的,里面的id或者class也都是动态绑定的,而mounted阶段只是实例挂载完成,这时候异步请求的数据大概率还没请求完成,从而v-for要渲染的dom肯定也还没开始渲染,这时候连异步请求的数据都获取不到,更别说需要异步数据来渲染的dom了。

$nextTick是指整个视图渲染完成,注意这里不包含异步请求的数据,在整个视图渲染完成时异步数据未必能请求到。所以调用$nextTick其实也没什么两样。

解决思路及方案

第一种并不是很完美的方案:使用updated钩子

updated 阶段是完成了数据更新到 DOM 的阶段(对加载回来的数据进行处理),此时,在使用document等获取dom是可以得到的。

updated 与 mounted 不同的是,在每一次的 DOM 结构更新,Vue.js 都会调用一次 updated 钩子函数!而 mounted 钩子函数仅仅只执行一次而已。

但是,本人不推荐这么做,因为如果项目中数据更新很频繁,虚拟dom也会跟着经常更新,如果在updated中获取dom,会造成操作过于频繁的问题,也就会多多少少影响程序性能。在vue官方也有提到。

vue官网

完美解决的方案:在异步数据获取完成时调用$nextTick获取dom

想获取异步请求数据渲染的dom就一定得等到数据接收到后再进行相应的操作。而有同学就问了,为什么在获取到数据后还要调$nextTick呢?

因为获取到数据之后v-for去动态渲染dom肯定也是需要一定时间的,不可能马上就能渲染完成,所以在获取到异步数据之后再等整个视图渲染完成时去获取dom是最好的选择。

那要在created或者mounted或者在watch中获取就看个人选择了。

created或者mounted中需要在获取完数据后在then或者await接受返回的数据再调用$nextTick获取dom,在watch中就直接监视请求的数据,数据改变就说明获取到了,就可以调用$nextTick获取dom了。

vue获取DOM问题

利用 ref 和 $refs 可以用于获取 dom 元素

<h1 id="h" ref="myH">我是一个孤独可怜又能吃的h1</h1>
 
mounted() {
    console.log(document.getElementById("h"));
    console.log(this.$refs.myH);
  },

使用ref调用组件内的方法。

<Demo ref="de"></Demo>
 
import Demo from "./child/demo";
 
//组件起别名ref
let demoObj = this.$refs.de;
//可以以此调用组件内的方法,变量等
    demoObj.fn();

$nextTick使用

如果我们修改某个出现在DOM里的变量,之后又要获取DOM里的变量值,那么会发现DOM里变量值并未修改成功,因为Vue更新DOM是异步的,用$nextTick解决。

因为vue 通过异步队列控制 DOM 更新和 nextTick 回调函数先后执行。

<p ref="myP">{{ count }}</p>
<button @click="btn">点击count+1, 马上提取p标签内容</button>
 
btn() {
      this.count++; // vue监测数据更新, 开启一个DOM更新队列(异步任务)
      console.log(this.count) //1
      //因为Vue更新DOM是异步的,所以count虽然完成加一,但这里的DOM还未更新。
      console.log(this.$refs.myP.innerHTML); // 0
 
      // 解决: this.$nextTick()
      // 过程: DOM更新完会挨个触发$nextTick里的函数体
      this.$nextTick(() => {
        console.log(this.$refs.myP.innerHTML); // 1
      });
 
      //方法二: async 函数执行时, async btn(){}
      //如果遇到 await 就会先暂停执行 ,等到触发的异步操作完成后,
      //恢复 async 函数的执行并返回解析值
      await this.$nextTick()
      this.$refs.myP.innerHTML
  },

组件name属性使用 

我们封装的组件-可以自己定义name属性组件名-让使用者有个统一的前缀风格

1.给组件(Demo)起个名字,用组件的name属性值, 来注册组件名字

export default {
  name: "Mmm",
}

2.之后就可以用Mmm当作标签使用

import Demo from "./child/demo";
 
components: {
    // Demo,
    [Demo.name]: Demo,
  },

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

vue获取v-for异步数据dom的解决问题

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

vue获取v-for异步数据dom的解决问题

这篇文章主要介绍了vue获取v-for异步数据dom的解决问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2023-03-24

vue获取v-for异步数据dom问题怎么解决

这篇文章主要讲解了“vue获取v-for异步数据dom问题怎么解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“vue获取v-for异步数据dom问题怎么解决”吧!vue获取v-for异步数
2023-07-05

vue-resource 获取本地json数据404问题的解决

这篇文章主要介绍了vue-resource 获取本地json数据404问题的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2022-11-13

react函数组件useState异步,数据不能及时获取到的问题

这篇文章主要介绍了react函数组件useState异步,数据不能及时获取到的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2022-11-13

解决获取数据后this.$refs.xxx.toggleRowSelection无效的问题

这篇文章主要介绍了解决获取数据后this.$refs.xxx.toggleRowSelection无效的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2022-11-13

mybatis plus新增数据获取主键id的问题怎么解决

这篇文章主要介绍了mybatis plus新增数据获取主键id的问题怎么解决的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇mybatis plus新增数据获取主键id的问题怎么解决文章都会有所收获,下面我们一起
2023-07-05

js中的异步获取到的数据到底能不能赋值给一个全局变量问题

这篇文章主要介绍了js中的异步获取到的数据到底能不能赋值给一个全局变量问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2023-05-17

如何在IIS上安装SSL证书并解决PHP无法获取数据的问题

在IIS上安装SSL证书并解决PHP无法获取数据的问题在网站开发中,使用SSL证书来保障数据传输的安全是非常重要的。而在Windows平台上,IIS(Internet Information Services)是常用的Web服务器软件,本
如何在IIS上安装SSL证书并解决PHP无法获取数据的问题
2024-03-09

uniapp中使用vuex的过程(解决uniapp无法在data和template中获取vuex数据问题)

这篇文章主要介绍了uniapp中使用vuex(解决uniapp无法在data和template中获取vuex数据问题),本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
2023-05-18

编程热搜

目录