vue的更新机制,vue页面更新

  vue的更新机制,vue页面更新

  本文主要介绍vue(异步更新解决方案)的状态更新方法,有很好的参考价值,希望对大家有所帮助。如有错误或不足之处,请不吝赐教。

  

目录

  状态更新(异步更新解决方案)解决方案异步更新和nexttick为什么需要异步更新nextTick原理?

  

状态更新(异步更新解决)

  在vue中,状态更新是异步的,类似于react中的setstate。

  

解决方案

  非组件解决方案:

  div id=示例“{message}}/div

  var vm=new Vue({

  el: #example ,

  数据:{

  消息:“123”

  }

  })

  Vm.message=新消息//更改数据

  vm。$el.textContent===新邮件//false

  Vue.nextTick(function () {

  vm。$el.textContent===新邮件//true

  })

  使用虚拟机特别方便。$nextTick()实例方法放在一个组件内,因为它不需要一个全局的Vue,而且这个回调函数中会自动绑定到当前的Vue实例:

  Vue.component(示例,{

  模板: span{{ message }}/span ,

  数据:函数(){

  返回{

  消息:“无更新”

  }

  },

  方法:{

  updateMessage:函数(){

  This.message=更新完成

  Console.log(这个。$ el.textcontent)//=无更新

  这个。$nextTick(function () {

  Console.log(这个。$ el.textcontent)//=更新完成

  })

  }

  }

  })

  因为$nextTick()返回一个Promise对象,所以您可以使用新的ES2016 async/await语法来完成同样的事情:方法:{

  updateMessage:异步函数(){

  this.message=已更新

  Console.log(这个。$ el.textcontent)//=未更新

  等待这个。$nextTick()

  Console.log(这个。$ el.textcontent)//=已更新

  }

  }

  

异步更新及nexttick

  

为什么需要异步更新

  Vue异步更新DOM是为了避免频繁操作DOM。这些异步操作会通过nextTick函数(微任务优先)以cb的形式放入任务队列,每次Tick后执行这些cb并更新DOM。

  更新异步内部最重要的是nextTick方法,它负责将异步任务添加到队列中,并执行异步任务。VUE也向用户公开它。数据修改后,可以立即获得相关的DOM,但没有更新那么快。nextTick可以解决这个问题。

  

nextTick 原理

  在下一个DOM更新周期结束后执行的延迟回调。使用此方法可以在修改数据后立即获取更新的DOM。

  /*存储异步执行的回调*/

  常量回调=[]

  /*一个标志位,如果timerFunc已经推送到任务队列,就不需要重复推了*/

  让待定=假

  /*指向将被推送到任务队列的函数的函数指针。当主线程任务完成时,任务队列中的timerFunc将被调用*/

  让计时器运行

  /*

  推到队列中的下一个节拍时执行。

  Cb回调函数

  Ctx上下文

  */

  导出函数nextTick (cb?函数,ctx?对象){

  让_解决

  //第一步中的传入cb将被推入回调并存储。

  callbacks.push(()={

  if (cb) {

  尝试{

  cb .呼叫(ctx)

  } catch (e) {

  handleError(e,ctx, nextTick )

  }

  } else if (_resolve) {

  _解析(ctx)

  }

  })

  //检查最后一个异步任务队列(即名为callbacks的任务数组)是否已经被调度和执行。这里的Pending相当于一个锁。

  如果(!待定){

  //如果最后一个异步任务队列已经完成,将pending设置为true(锁定锁)

  待定=真

  //调用判断Promise、MutationObserver和setTimeout的优先级。

  定时器函数()

  }

  //第三步执行返回的状态

  如果(!cb类型的承诺!==未定义){

  返回新承诺(resolve={

  _resolve=解决

  })

  }

  }

  Vue在更新DOM时异步执行。只要检测到数据更改,Vue就会打开一个队列,缓冲在同一个事件周期中发生的所有数据更改。

  如果同一个观察器被多次触发,它只会被推入队列一次。这种在缓冲期间删除重复数据的方法对于避免不必要的计算和DOM操作非常重要。

  然后,在下一个事件循环“滴答”中,Vue刷新队列并执行实际的(已消除重复的)工作。

  E Vu内部尝试使用原生Promise.then,对异步队列使用MutationObserver和setImmediate,如果执行环境不支持,它将改为使用setTimeout(fn,0)。

  以上个人经历,希望能给大家一个参考,也希望大家多多支持我们。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: