zoukankan      html  css  js  c++  java
  • vue在munted中获取dom高度不准确的问题

    今天遇到这么个问题:

    在组件中给div设置了默认的高度100px,然后父组件也会传入样式120px,在mounted中获取div的高度会获取到默认的高100px而不是渲染的高120px;就算加上$nextTick也是一样。

    
    
    data () {
        return {
          itemHeight: 0,
        }
      },
    mounted () {
         // this.itemHeight = this.$refs.item.$el.offsetHeight // 100
         this.$nextTick(() => {
           this.itemHeight = this.$refs.item.$el.offsetHeight // 100
         })
      }
    
    //style
    .item {
       100%;
      height: 100px;
    }

    问题就是这么个问题;那怎么办呢?

    data () {
        return {
          itemHeight: 0,
        }
      },
    mounted () {
         // this.itemHeight = this.$refs.item.$el.offsetHeight // 100
         // this.$nextTick(() => {
         //   this.itemHeight = this.$refs.item.$el.offsetHeight // 100
         // })
        setTimeout(() => {
          this.itemHeight = this.$refs.item.$el.offsetHeight // 120
        }, 0)
      }
    
    //style
    .item {
       100%;
      height: 100px;
    }

    用setTimeout就可以了,网上有位兄台说setTimeout延迟500毫秒,可以我这样延迟0秒也可以,亲测可以,为啥呢?

    加延迟也就是为了让页面完全渲染完成之后再去获取高度,用了setTimeout就已经实现这个效果了,因为setTimeout里边的代码就是页面渲染完成之后执行的;

    这涉及到线程问题了 , 简单说一下吧:

    js里有个渲染线程类似于java里边的主线程主线程按顺序执行代码,执行完才会有空去看看任务栈里边有没有任务需要执行,有的话就拿来到主线程里边执行,setTimeout就把里边的代码放到任务栈中(类似于子线程)了,所以setTimeout里边这部分代码会在主线程执行完才会执行;

    这样就好像Android里只能在主线程里操作视图,不能在主线程里做耗时操作,子线程做了耗时操作需要更改视图时候要通过handler通知主线程;

     

    说到这里就再多说两句:什么样的代码会被丢到任务栈里边呢?耗时的代码都会被丢到任务栈里边。比如ajax,setTimeout,点击事件等。

    都是自己理解,有不对的地方欢迎下方评论。

    关于任务栈渲染线程这位仁兄写的很不错,可以详细看看https://www.cnblogs.com/jiasm/p/9482443.html

    over

  • 相关阅读:
    K最近邻kNN-学习笔记
    随机森林学习-sklearn
    matplotlib画堆叠条形图
    PCA和SVD最佳理解
    1,机器学习应用概述
    linux unzip 中文乱码解决方法
    python文件、文件夹操作OS模块
    利用pyecharts做地图数据展示
    描述机器学习之神经网络算法原理
    python-pandas 高级功能(通过学习kaggle案例总结)
  • 原文地址:https://www.cnblogs.com/rainbowLover/p/13256438.html
Copyright © 2011-2022 走看看