• Vue 无法读取HTMLCollection列表的length解决


    问题

    在学习饿了么实践项目时候发现一个问题,

    在mounted阶段,获取Element对象,console.log()可以读取出列表,而却无法读出它的length

      let foodList = this.$refs.menuWrapper.getElementsByClassName('calculate-content')
          let height = 0
          console.log(foodList)
          console.log(foodList.length)
          for (var i = 0; i < foodList.length; i++) {
            height += foodList[i].clientHeight
            this.scrollYList.push(height)
          }


    原因:

    以下出自官方文档

    mounted

    • 类型:Function

    • 详细:

      el 被新创建的 vm.$el 替换,并挂载到实例上去之后调用该钩子。如果 root 实例挂载了一个文档内元素,当 mounted 被调用时 vm.$el 也在文档内。

      注意 mounted 不会承诺所有的子组件也都一起被挂载。如果你希望等到整个视图都渲染完毕,可以用 vm.$nextTick 替换掉 mounted

      mounted: function () {
          this.$nextTick(function () {
          // Code that will run only after the
          // entire view has been rendered
          })
      }

      该钩子在服务器端渲染期间不被调用。

    看完以上文档介绍,可以知道在mounted阶段,mounted 不会承诺所有的子组件也都一起被挂载,所以在此阶段,dom结构还没加载完,js就执行了


    解决方案:

    1.使用官方文档说明(如果你希望等到整个视图都渲染完毕,可以用 vm.$nextTick 确保渲染完成后再获取数据。

    重要的是理解执行顺序,异步调用的话可以使用Promise保证执行顺序


    踩到的一个坑:

    有文章说可以在updated阶段执行,这时可以取到渲染完毕后的List

    updated:由于数据更改导致的虚拟 DOM 重新渲染和打补丁,在这之后会调用该钩子

    就是说,在使用better-scroll滚动时,会触发updated,使得scrollYList不断被推入数据,然后导致我用这个的时候,整个浏

    览器崩溃了,很是尴尬,哈哈哈,所以我感觉updated执行这个解决方案,不大适合解决这类问题

    本文来源于:https://blog.csdn.net/weixin_41602509/article/details/86661758

  • 相关阅读:
    easyui-layout完整web界面布局
    combobox中动态载入tree数据
    easyui---layout 有无横的间隔 的区别 split:true
    单选按钮radio获取选中的值
    Datagrid清空数据
    Lancher3默认桌面显示
    菜单背景全透效果
    android通过耳机控制音乐播放器
    android 音乐暂停
    Android 系统默认音量和最大音量
  • 原文地址:https://www.cnblogs.com/liAnran/p/13597899.html
Copyright © 2020-2023  润新知