vue.js

关注公众号 jb51net

关闭
首页 > 网络编程 > JavaScript > javascript类库 > vue.js > vue获取HTMLCollection列表children结果为undefined

Vue获取HTMLCollection列表的children时结果为undefined问题

作者:莫诺库诺

这篇文章主要介绍了Vue获取HTMLCollection列表的children时结果为undefined问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

vue获取HTMLCollection列表的children时结果为undefined

在Vue的钩子函数mounted()中尝试通过document.querySelectorAll()获取HTMLCollection时发现返回的结果为undefined,且length的值也为0:

image.png

在Vue的官网查询得知,mounted钩子函数不能保证所有子组件都被挂载完成:

但我在加入了$nextTick实例方法之后,仍然是同样的现象,令人困惑。

于是我便想到了通过MutationObserver来监视DOM的变动,在DOM全部渲染完毕后再获取。

代码如下:

async mounted() {
    // 监视DOM,全部DOM加载完毕后再调用回调函数
    this.observer = new MutationObserver(this.getDir);
    this.observer.observe(document.querySelector(`#content`), {
        childList: true,
        subtree: true,
        attributes: true
    });
}

结果成功:

imagef0e91459963977f9.png

关于MutationObserver可以移步MDN或者其它博文。

vue读取HTMLCollection列表的length为0问题

在计算better-scroll右侧列表滚动高度的时候,发现列表的length为0

原因:

上网查阅发现问题可能是由于mounted 不会承诺所有的子组件也都一起被挂载。

这个时候dom元素还有没挂载完毕。

如果你希望等到整个视图都渲染完毕,可以用 vm.$nextTick 替换掉 mounted:

mounted () {
      this.$nextTick(() => {
      this._initScroll(), this._calculateHeight();
    });  },

但是不清楚为什么使用了这个方法后获取的length依旧为0,

就在_calculateHeight()方法上加了个定时器,等到完全渲染完成时再获取高度(这种问题可能会出现bug,不知道页面什么时候渲染完毕):

_calculateHeight () {
      setTimeout(() => {
        let foodList = this.$refs.right.getElementsByClassName('food-list-hook');
        let height = 0;
        this.listHeight.push(height);
        for (var i = 0; i < foodList.length; i++) {
          let item = foodList[i];
          height += item.clientHeight;
          this.listHeight.push(height);
        }
      }, 200)
    },

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文