nextTick使用

vue的nextTick

发现一个问题,在mounted里面先获取元素高度会变成0,nextTick里面会是500,showBar里面是0.之前对生命周期理解模糊,通过这次机会了解了一下.

  mounted(){
    console.log(document.getElementById("mychart").offsetHeight);//0
    this.$nextTick(()=>{
      console.log(document.getElementById("mychart").offsetHeight);//500

    })
    this.initializeTable();
    this.getAreas();
    this.showBar();

  }
    showBar(){


      let option = {
        xAxis: {
          data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
        },
        yAxis: {},
        series: [
          {
            type: 'bar',
            data: [23, 24, 18, 25, 27, 28, 25]
          }
        ]
      };

      console.log(document.getElementById("mychart").offsetHeight+";第三次"); //高度为0,因为没有渲染出来

        //console.log(document.getElementById("mychart").offsetHeight);//高度有了
        let myChart = this.$echarts.init(document.getElementById("mychart"));
        myChart.setOption(option);
        //随着屏幕大小调节图表
        window.addEventListener("resize", () => {
          myChart.resize();
        });

    }

图片

如果变成

    console.log(document.getElementById("mychart").offsetHeight);
    this.$nextTick(()=>{
      console.log(document.getElementById("mychart").offsetHeight);
      this.initializeTable();
      this.getAreas();
      this.showBar();
    })

就会变成
图片
而如果是

  mounted(){

    console.log(document.getElementById("mychart").offsetHeight);
    this.initializeTable();
    this.getAreas();
    this.showBar();

  },
    showBar(){


      let option = {
        xAxis: {
          data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
        },
        yAxis: {},
        series: [
          {
            type: 'bar',
            data: [23, 24, 18, 25, 27, 28, 25]
          }
        ]
      };

      console.log(document.getElementById("mychart").offsetHeight+";第三次"); //高度为0,因为没有渲染出来
      this.$nextTick().then(res => {
        console.log(document.getElementById("mychart").offsetHeight);//高度有了
        let myChart = this.$echarts.init(document.getElementById("mychart"));
        myChart.setOption(option);
        //随着屏幕大小调节图表
        window.addEventListener("resize", () => {
          myChart.resize();
        });
      })

    }

就会变成
图片
发现

    initializeTable(){

      let containerHeight = this.$refs.container.offsetHeight;
      let upContentHeight = this.$refs.upContent.offsetHeight;
      this.tableStyle += ' height: '+(containerHeight-upContentHeight)+"px;";
    },

有更新属性的情况,更新属性之后,tableStyle的高度才有值,如果直接执行showBar,这时候tableStyle的高度还是0,所以showBar里获取元素高度也是0

vue生命周期

beforeCreate: 创建阶段,只是创建了实例,没有数据,没有DOM.
created: 创建阶段,实例有了,数据有了,DOM没有.
beforeMounted:挂载阶段,和 created 差不多
mounted:挂载阶段,DOM也有了,但不保证全部都渲染好了.根实例挂载了.要保证视图渲染完毕,可以使用this.$nextTick
beforeUpdate:更新阶段,数据更新之后,DOM更新之前,获取的DOM的数据还是之前的.
updated:更新阶段,少用.
beforeDestroy:销毁阶段,销毁之前执行,实例仍在.
destroy:销毁阶段,实例已经销毁

结论

如果有更新属性的,需要在更新属性之后再执行nextTick.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值