广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >vue的状态更新方式(异步更新解决)
  • 455
分享到

vue的状态更新方式(异步更新解决)

2024-04-02 19:04:59 455人浏览 薄情痞子
摘要

目录状态更新(异步更新解决)解决方案异步更新及nexttick为什么需要异步更新nextTick 原理状态更新(异步更新解决) 在Vue中状态更新是异步的,这一点和React中的se

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

Vue中状态更新是异步的,这一点和React中的setstate类似。

解决方案

非组件解决方案:

<div id="example">{{message}}</div>
var vm = new Vue({
  el: '#example',
  data: {
    message: '123'
  }
})
vm.message = 'new message' // 更改数据
vm.$el.textContent === 'new message' // false
Vue.nextTick(function () {
  vm.$el.textContent === 'new message' // true
})

在组件内使用 vm.$nextTick() 实例方法特别方便,因为它不需要全局 Vue ,并且回调函数中的 this 将自动绑定到当前的 Vue 实例上:

Vue.component('example', {
  template: '<span>{{ message }}</span>',
  data: function () {
    return {
      message: '没有更新'
    }
  },
  methods: {
    updateMessage: function () {
      this.message = '更新完成'
      console.log(this.$el.textContent) // => '没有更新'
      this.$nextTick(function () {
        console.log(this.$el.textContent) // => '更新完成'
      })
    }
  }
})

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

  updateMessage: async function () {
    this.message = 'updated'
    console.log(this.$el.textContent) // => '未更新'
    await this.$nextTick()
    console.log(this.$el.textContent) // => '已更新'
  }
}

异步更新及nexttick

为什么需要异步更新

vue为了避免频繁的操作DOM,采用异步的方式更新DOM。这些异步操作会通过nextTick函数将这些操作以cb的形式放到任务队列中(以微任务优先),当每次tick结束之后就会去执行这些cb,更新DOM。

异步更新内部是最重要的就是nextTick方法,它负责将异步任务加入队列和执行异步任务。VUE 也将它暴露出来提供给用户使用。在数据修改完成后,立即获取相关DOM还没那么快更新,使用nextTick便可以解决这一问题。

nextTick 原理

在下次DOM更新循环结束之后执行的延迟回调。在修改数据之后立即使用该方法,获取更新后的DOM。


const callbacks = [] 

let pending = false

let timerFunc


export function nextTick (cb?: Function, ctx?: Object) {
  let _resolve
   // 第一步 传入的cb会被push进callbacks中存放起来
  callbacks.push(() => {
    if (cb) {      
        try {
            cb.call(ctx)
      } catch (e) {
        handleError(e, ctx, 'nextTick')
      }
    } else if (_resolve) {
      _resolve(ctx)
    }
  })  
  // 检查上一个异步任务队列(即名为callbacks的任务数组)是否派发和执行完毕了。pending此处相当于一个
  if (!pending) {
  // 若上一个异步任务队列已经执行完毕,则将pending设定为true(把锁锁上)
    pending = true
    // 调用判断Promise,MutationObserver,setTimeout的优先级
    timerFunc()
  }
  // 第三步执行返回的状态
  if (!cb && typeof Promise !== 'undefined') {   
    return new Promise(resolve => {
      _resolve = resolve
    })
  }
}

Vue 在更新 DOM 时是异步执行的。只要侦听到数据变化,Vue 将开启一个队列,并缓冲在同一事件循环中发生的所有数据变更。

如果同一个 watcher 被多次触发,只会被推入到队列中一次。这种在缓冲时去除重复数据对于避免不必要的计算和 DOM 操作是非常重要的。

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

Vue 在内部对异步队列尝试使用原生的 Promise.then、MutationObserver 和 setImmediate,如果执行环境不支持,则会采用 setTimeout(fn, 0) 代替。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: vue的状态更新方式(异步更新解决)

本文链接: https://www.lsjlt.com/news/146436.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • vue的状态更新方式(异步更新解决)
    目录状态更新(异步更新解决)解决方案异步更新及nexttick为什么需要异步更新nextTick 原理状态更新(异步更新解决) 在vue中状态更新是异步的,这一点和react中的se...
    99+
    2022-11-13
  • 解决react中useState状态异步更新的问题
    目录疑惑状态异步更新带来的问题问题示例问题解决类组件的解决方案函数组件的解决方案其他解决方案结尾疑惑 相信刚开始使用react函数组件的小伙伴也遇到过一个坑,就是 useState ...
    99+
    2022-11-13
  • Android异步更新UI的四种方式
    大家都知道由于性能要求,android要求只能在UI线程中更新UI,要想在其他线程中更新UI,大致有4种方式,下面分别使用四种方式来更新一个TextView。 1.使用Hand...
    99+
    2022-06-06
    Android
  • vue异步更新dom的实现浅析
    目录Vue异步更新DOM的原理1 什么时候能获取到真正的DOM元素?2 为什么Vue需要通过nextTick方法才能获取最新的DOM?3 为什么this.$nextTick 能够获取...
    99+
    2022-11-12
  • Vue数据更新视图不更新的几种解决方案小结
    目录Vue数据更新视图不更新的几种解决知识拓展对象属性的添加或删除异步更新队列Object.assign方法vue多层循环Vue更改了数据但是视图却没有更新Vue数据更新视图不更新的...
    99+
    2022-11-13
    Vue数据更新 Vue视图不更新 Vue数据
  • Vue 2 nextTick方法|异步更新|事件循环
    1 nextTick的用处 vm.$netTick的作用是将回调延迟到下次DOM更新周期之后执行。 它接受一个回调函数作为参数。 其实,在我们更新数据状态后,是不会立马渲染的,你不能即刻获取到新的DO...
    99+
    2023-09-05
    vue.js 前端 javascript 事件循环 异步更新 宏任务 微任务
  • 解决vue中数据更新视图不更新问题this.$set()方法
    目录vue数据更新视图不更新解决问题vue数据不更新的原因(数据更改了,但是视图没有更新)解决办法具体流程如下数组更新检测注意事项对象更改检测注意事项vue数据更新视图不更新 1.d...
    99+
    2022-11-13
  • Vue 中异步更新的原理是什么
    今天就跟大家聊聊有关Vue 中异步更新的原理是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Vue 异步更新 DOM 原理很多同学都知道,Vue...
    99+
    2022-10-19
  • Vue异步更新DOM及$nextTick执行机制解读
    目录Vue异步更新DOM策略$nextTick执行机制示例详解Vue异步更新DOM的目的$nextTick应用示例总结Vue异步更新DOM策略 我们知道,Vue实现响应式并不是数据发...
    99+
    2023-03-24
    Vue异步更新DOM $nextTick执行机制 Vue异步更新
  • Ajax实现网页异步更新的方法
    这篇文章主要讲解了“Ajax实现网页异步更新的方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Ajax实现网页异步更新的方法”吧!   1:ajax的概...
    99+
    2022-10-19
  • Vue异步更新机制及$nextTick原理的深入讲解
    目录前言Vue的异步更新DOM更新是异步的DOM更新还是批量的事件循环执行过程源码深入异步更新队列nextTick$nextTick总结一般更新DOM是同步的既然更新DOM是个同步的...
    99+
    2022-11-13
  • Fabric.js 样式不更新解决方法案例
    目录本文简介是否需要重新绘制代码仓库本文简介 不知道你有没有遇到过在使用 Fabric.js 时无意中一些骚操作修改了元素的样式,但刷新画布却没更新元素样式? 如果你也遇到同样的问...
    99+
    2023-02-14
    Fabric.js 样式更新 Fabric.js 样式
  • vue项目热更新的坑及解决
    目录vue项目热更新坑vue项目热更新慢查找热更新慢是哪里慢—分析原因解决办法vue项目热更新坑 今天在使用vue-cli构造的vue项目时,遇到一个坑。 setInte...
    99+
    2022-11-13
  • AndroidStudio更新出现Refreshing 'xxx' Gradle Project状态解决办法
    前言开发项目之前,我用的是AndroidStuio2.1.0版本,项目开发完后,按耐不住就更新编译环境了。编译环境更新至AndroidStuio2.2.2. 更新完后,激动的打开AndroidStudio,原来的项目就处于如下状态: 本来以...
    99+
    2023-05-31
    androidstudio 更新出错 refreshing
  • Windows更新失败的解决方法
    这篇文章主要介绍Windows更新失败的解决方法,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Windows更新失败的解决方法一:重启电脑,按F8进入高级开机选项,选择回车“最近一次的正确配置(高级)”,如图所示:W...
    99+
    2023-06-28
  • vue源码之批量异步更新策略的深入解析
    vue异步更新源码中会有涉及事件循环、宏任务、微任务的概念,所以先了解一下这几个概念。 一、事件循环、宏任务、微任务 1.事件循环Event Loop:浏览器为了协调事件处理、脚本...
    99+
    2022-11-12
  • React状态更新的优先级机制源码解析
    目录为什么需要优先级同步模式下的react运行时如何运用优先级机制优化react运行时确定不同场景下的调度优先级lane优先级event优先级scheduler优先级优先级间的转换优...
    99+
    2022-11-13
    React 状态更新优先级 React 状态更新
  • Win10正式版10586.318更新失败解决方法
    微软本周推送的Win10正式版10586.318更新KB3156421会导致部分用户系统出现问题,具体表现为电脑运行变慢,或者干脆无法成功安装。对于电脑变慢问题,微软建议用户暂时关闭Cortana来缓解症状;对于无法安装...
    99+
    2023-05-20
    Win10 10586.318
  • Vue异步更新机制和nextTick的原理是什么
    本篇内容介绍了“Vue异步更新机制和nextTick的原理是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所...
    99+
    2022-10-19
  • 更新android SDK 失败的解决方法
    据说dl-ssl.google.com在大陆被强了,伟大的天朝真是不让人活了,解决方法就是修改C:\Windows\System32\drivers\etc\hosts文件。添...
    99+
    2022-06-06
    方法 sdk Android
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作