vue为什么是异步渲染

原因:可以提升性能。如果不采用异步更新,那么每次更新数据都会对当前组件进行重新渲染;所以为了性能考虑,Vue会在本轮数据更新后,再去异步更新视图,而不是每当有数据更新,就立即更新视图。

vue为什么是异步渲染

本教程操作环境:windows7系统、vue3版,DELL G3电脑。

1、nextTick()的原理及作用

nextTick确保我们所操作的DOM是更新之后的。

(1)应用场景在视图更新之后,基于新的视图进行操作。

在数据变化后执行的某个操作,而这个操作需要使用随数据变化而变化的DOM结构的时候,这个操作就需要放在nextTick()的回调函数中。如果在created()钩子进行DOM操作,created()中dom还没有渲染,一定要放在nextTick()的回调函数中。Vue采用了数据驱动视图的思想,但是在一些情况下,仍然需要操作DOM。有时候,DOM1的数据发生了变化,而DOM2需要从DOM1中获取数据,那这时就会发现DOM2的视图并没有更新,这时就需要用到了nextTick了。

(2)原理:

立即学习“前端免费学习笔记(深入)”;

nextTick 的核心是利用了如 Promise 、MutationObserver、setImmediate、setTimeout的原生 JS 方法来模拟对应的微/宏任务的实现;本质是为了利用 JS的这些异步回调任务队列实现 Vue 框架中自己的异步回调队列;本质是对JS执行原理事件循环的一种应用

nextTick 是典型的将底层JS执行原理应用到具体案例中的示例,引入异步更新队列机制的原因∶

如果不采用异步更新,那么每次更新数据都会对当前组件进行重新渲染。所以为了性能考虑,Vue 会在本轮数据更新后,再去异步更新视图。而不是每当有数据更新,就立即更新视图。

为了在数据更新操作之后操作DOM,我们可以在数据变化之后立即使用nextTick(callback);nextTick()将回调延迟到下一个事件循环开始时执行, 这样回调函数会在DOM更新完成后被调用,就可以拿到最新的DOM元素了。 

当你设置 vm.someData = ‘new value’,DOM 并不会马上更新,而是在异步队列被清除,也就是下一个事件循环开始时执行更新才会进行必要的DOM更新。

(3) vue的降级策略

Vue 在内部对异步队列尝试使用原生的 Promise.then、MutationObserver setImmediate,如果执行环境不支持,则会采用 setTimeout(fn, 0) 代替,进行降级处理。降级处理的目的都是将flushCallbacks函数放入微任务或者宏任务队列,等待下一次事件循环时来执行

实际刷新队列是有可能在本次事件循环的微任务中刷新的,也可能是在下一个事件循环中刷新的。这取决于代码当前执行的环境,如若当前执行环境支持promise,那么nextTick内部实际会用Promise去执行,那么队列刷新就会在本次事件循环的微任务中去执行。

优先选择微任务的原因:微任务中更新队列是会比在宏任务中更新少一次UI渲染的

2、为何Vue采用异步渲染

vue是组件级更新组件内有数据变化时,该组件就会更新。例:this.a = 1、this.b=2(同一个watcher)

(1)原因:如果不采用异步更新,那么每次更新数据都会对当前组件进行重新渲染。所以为了性能考虑,Vue 会在本轮数据更新后,再去异步更新视图。而不是每当有数据更新,就立即更新视图。

(2)过程:

Vue是异步执行dom更新的,一旦观察到数据变化,Vue就会开启一个队列,然后把在同一个事件循环 (event loop) 中 观察到数据变化的 watcher 推送进这个队列。

如果这个watcher被触发多次,只会被推送到队列一次。这种缓冲行为可以有效的去掉重复数据,避免不必要的计算和Dom操作。

而在下一个事件循环时,Vue会清空队列,并进行必要的DOM更新。

3)源码解析:

数据变化时,通过notify通知watcher进行更新操作;

通过subs[i].update依次调用watcher的update(未更新视图);

将watcher放到队列中,在queueWatcher会根据watcher的id进行去重(多个属性依赖一个watcher),如果队列中没有该watcher就会将该watcher添加到队列中(未更新视图);

通过nextTick异步执行flushSchedulerQueue方法刷新watcher队列(更新视图);

 1.png

【相关推荐:vuejs视频教程、vuejs视频教程】

以上就是vue为什么是异步渲染的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2923687.html

(0)
上一篇 2025年3月11日 18:50:01
下一篇 2025年2月18日 04:49:22

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • vue状态过度使用什么进行监听

    vue状态过度使用侦听器“watch”进行监听,通过侦听器能监听到任何数值property的数值更新。Vue侦听器是提供给开发者可以用来监测某些数据的变化,从而针对这些数据的变化进行某些操作。需要注意侦听器本质上是一个函数,如果要监听哪一个…

    2025年3月11日 编程技术
    200
  • vue的生命周期几个阶段

    有4大阶段:1、初始化阶段,包含beforeCreate(创建前)和created(创建后)两个小阶段;2、挂载阶段,包含beforeMount(载入前)和mounted(载入后)两个小阶段;3、更新阶段,包含beforeUpdate(更新…

    2025年3月11日
    200
  • vue的通信方法有哪些

    通信方法:1、子组件设置props属性,定义接收父组件传递过来的参数;而组件在使用子组件标签中通过字面量来传递值。2、子组件通过$emit触发自定义事件进行通信。3、利用ref进行通信。4、利用EventBus进行通信。5、利用$paren…

    2025年3月11日 编程技术
    200
  • vue无法打断点怎么办

    vue无法打断点的解决办法:1、按下键盘上的f12,进入浏览器调试页面;2、点击“sources”;3、找到要调试的JS;4、在源码中增加“GetPrice(nIndex){debugger;…}”代码;5、重新加载页面即可。 …

    2025年3月11日 编程技术
    200
  • vue项目名可以用中文吗

    vue项目名不可以用中文。在vue中,项目名不能带中文、大写字母、特殊符号,项目名可采用小写方式,以短横线分隔,例“my-project-name”。而在单文件组件和字符串模板中组件名应该总是PascalCase的,但是在DOM模板中总是k…

    2025年3月11日
    200
  • vue内置组件有哪些

    vue组件有:1、component,用于渲染一个“元组件”为动态组件。2、transition,用于为单个元素或组件提供动画过渡效果。3、transition-group,用于为列表中的多个元素或组件提供过渡效果。4、keep-alive…

    2025年3月11日
    200
  • vue脚手架public放什么

    public文件夹中一般放置一些静态资源(图片),在webpack进行打包的时候,会原封不动的打包到dist文件夹中。public目录下的文件并不会被Webpack处理,它们会直接被复制到最终的打包目录(默认是dist/static)下;必…

    2025年3月11日
    200
  • vue的options选项是什么

    在vue中,options选项是指“构造选项”,是在创建Vue实例时传入的参数,是一个对象,语法“const vm = new Vue(options)”。通过“new Vue(options)”来创建出一个Vue实例,也称为Vue对象,该…

    2025年3月11日
    200
  • vue数据流是单向吗

    是单向的。虽然vue有双向绑定“v-model”,但是vue父子组件之间数据传递,仍然还是遵循单向数据流的,父组件可以向子组件传递props,但是子组件不能修改父组件传递来的props,子组件只能通过事件通知父组件进行数据更改。 本教程操作…

    2025年3月11日
    200
  • vue使用什么绑定数据

    vue绑定数据的方法:1、用双大括号“{{}}”把数据给到页面;2、使用vue指令,v-bind指令可实现单向数据绑定,v-model指令可实现双向数据绑定;3、使用“:”,只需在标签属性前加“:”进行绑定即可;4、使用“${}”,只需在数…

    2025年3月11日 编程技术
    200

发表回复

登录后才能评论