当前位置: 首页 > news >正文

中国建设银行网站官网下载安装抚州南城网站建设

中国建设银行网站官网下载安装,抚州南城网站建设,h5网站如何做排名,群晖wordpress打开慢答题思路#xff1a; nextTick 是做什么的#xff1f;为什么需要它#xff1f;开发时什么时候使用#xff1f;介绍一下如何使用nextTick原理解读#xff0c;结合异步更新和nextTick生效方式 1. nextTick是做什么的#xff1f; nextTick是等待下一次DOM更新刷新的工具方法… 答题思路 nextTick 是做什么的为什么需要它开发时什么时候使用介绍一下如何使用nextTick原理解读结合异步更新和nextTick生效方式 1. nextTick是做什么的 nextTick是等待下一次DOM更新刷新的工具方法。 script import { nextTick } from vueexport default {data() {return {count: 0}},methods: {async increment() {this.count// DOM 还未更新console.log(document.getElementById(counter).textContent) // 0await nextTick()// DOM 此时已经更新console.log(document.getElementById(counter).textContent) // 1}} } /scripttemplatebutton idcounter clickincrement{{ count }}/button /template 2. 为什么需要它 Vue 有个异步更新策略意思是如果数据变化Vue不会立刻更新DOM而是开启一个队列把组件更新函数保存在队列中在同一事件循环中发生的所有数据变更会异步的批量更新。这一策略导致我们对数据的修改不会立刻体现在DOM上此时如果想要获取更新后的DOM状态就需要使用nextTick。 3. 开发时什么时候使用 created中想要获取DOM时 响应式数据变化后获取DOM更新后的状态比如希望获取列表更新后的高度 4. 介绍一下如何使用nextTick function nextTick(callback?: () void): Promisevoid所以我们只需要在传入的回调函数中访问最新DOM状态即可或者我们可以await nextTick()方法返回的Promise之后做这件事。 5. 原理解读结合异步更新和nextTick生效方式 在Vue内部nextTick之所以能够让我们看到DOM更新后的结果是因为我们传入的callback会被添加到列队刷新函数(flushSchedulerQueue)的后面这样等队列内部的更新函数都执行完毕所有DOM操作也就结束了callback自然能够获取到最新的DOM值。 将传入的回调函数包装成异步任务异步任务又分微任务和宏任务为了尽快执行所以优先选择微任务 nextTick 提供了四种异步方法 Promise.then、MutationObserver、setImmediate、setTimeout(fn,0) vue2 出于兼容性考虑依次判断浏览器是否支持选择使用对应api 优先选择微任务如果微任务都不支持则选择宏任务 vue3 抛弃了兼容性直接使用Promise来实现nextTick 由nextTick的源码可以看出nextTick本质就是创建了一个微任务不考虑setTimeout将其回调推入微任务队列。vue中一个事件循环中的所有dom更新操作也是一个微任务两者属于同一优先级执行先后只于入队的先后有关换句话说如果你先写了nextTick再写赋值语句在此之前没有触发dom更新的操作那在nextTick中获取的可就不是更新后的dom了 templatediv classdemop classname{{ name }}/pbutton clickmodify修改/button/div /template script langts setup const name ref(111);const modify () {name.value 222; // 关键的赋值语句如果注释掉结果就大不一样了nextTick(() {const text document.querySelectorHTMLElement(.name).innerText;console.log(text);});name.value 333; }; /script 如上代码如果注释掉name.value “2222”,虽然nextTick语句下面也有赋值操作name.value “3333”;,但由于nextTick先进入微任务队列所以回调先于dom更新执行所以是获取的dom仍旧是旧的更新前的dom 源码补充 import { noop } from shared/util import { handleError } from ./error import { isIE, isIOS, isNative } from ./env// 上面三行与核心代码关系不大了解即可 // noop 表示一个无操作空函数用作函数默认值防止传入 undefined 导致报错 // handleError 错误处理函数 // isIE, isIOS, isNative 环境判断函数 // isNative 判断某个属性或方法是否原生支持如果不支持或通过第三方实现支持都会返回 falseexport let isUsingMicroTask false // 标记 nextTick 最终是否以微任务执行const callbacks [] // 存放调用 nextTick 时传入的回调函数 let pending false // 标记是否已经向任务队列中添加了一个任务如果已经添加了就不能再添加了// 当向任务队列中添加了任务时将 pending 置为 true当任务被执行时将 pending 置为 false// // 声明 nextTick 函数接收一个回调函数和一个执行上下文作为参数 // 回调的 this 自动绑定到调用它的实例上 export function nextTick(cb?: Function, ctx?: Object) {let _resolve// 将传入的回调函数存放到数组中后面会遍历执行其中的回调callbacks.push(() {if (cb) { // 对传入的回调进行 try catch 错误捕获try {cb.call(ctx)} catch (e) { // 进行统一的错误处理handleError(e, ctx, nextTick)}} else if (_resolve) {_resolve(ctx)}})// 如果当前没有在 pending 的回调// 就执行 timeFunc 函数选择当前环境优先支持的异步方法if (!pending) {pending truetimerFunc()}// 如果没有传入回调并且当前环境支持 promise就返回一个 promise// 在返回的这个 promise.then 中 DOM 已经更新好了if (!cb typeof Promise ! undefined) {return new Promise(resolve {_resolve resolve})} }// 判断当前环境优先支持的异步方法优先选择微任务 // 优先级Promise--- MutationObserver--- setImmediate--- setTimeout // setTimeout 可能产生一个 4ms 的延迟而 setImmediate 会在主线程执行完后立刻执行 // setImmediate 在 IE10 和 node 中支持// 当在同一轮事件循环中多次调用 nextTick 时 ,timerFunc 只会执行一次let timerFunc // 判断当前环境是否原生支持 promise if (typeof Promise ! undefined isNative(Promise)) { // 支持 promiseconst p Promise.resolve()timerFunc () {// 用 promise.then 把 flushCallbacks 函数包裹成一个异步微任务p.then(flushCallbacks)if (isIOS) setTimeout(noop)// 这里的 setTimeout 是用来强制刷新微任务队列的// 因为在 ios 下 promise.then 后面没有宏任务的话微任务队列不会刷新}// 标记当前 nextTick 使用的微任务isUsingMicroTask true// 如果不支持 promise就判断是否支持 MutationObserver// 不是IE环境并且原生支持 MutationObserver那也是一个微任务 } else if (!isIE typeof MutationObserver ! undefined (isNative(MutationObserver) ||MutationObserver.toString() [object MutationObserverConstructor] )) {let counter 1// new 一个 MutationObserver 类const observer new MutationObserver(flushCallbacks) // 创建一个文本节点const textNode document.createTextNode(String(counter)) // 监听这个文本节点当数据发生变化就执行 flushCallbacks observer.observe(textNode, { characterData: true })timerFunc () {counter (counter 1) % 2textNode.data String(counter) // 数据更新}isUsingMicroTask true // 标记当前 nextTick 使用的微任务// 判断当前环境是否原生支持 setImmediate } else if (typeof setImmediate ! undefined isNative(setImmediate)) {timerFunc () { setImmediate(flushCallbacks) } } else {// 以上三种都不支持就选择 setTimeouttimerFunc () { setTimeout(flushCallbacks, 0) } }// 如果多次调用 nextTick会依次执行上面的方法将 nextTick 的回调放在 callbacks 数组中 // 最后通过 flushCallbacks 函数遍历 callbacks 数组的拷贝并执行其中的回调 function flushCallbacks() {pending false const copies callbacks.slice(0) // 拷贝一份 callbackscallbacks.length 0 // 清空 callbacksfor (let i 0; i copies.length; i) { // 遍历执行传入的回调copies[i]()} }// 为什么要拷贝一份 callbacks// 用 callbacks.slice(0) 将 callbacks 拷贝出来一份 // 是因为考虑到在 nextTick 回调中可能还会调用 nextTick 的情况, // 如果在 nextTick 回调中又调用了一次 nextTick则又会向 callbacks 中添加回调 // 而 nextTick 回调中的 nextTick 应该放在下一轮执行 // 否则就可能出现一直循环的情况 // 所以需要将 callbacks 复制一份出来然后清空再遍历备份列表执行回调
http://www.hkea.cn/news/14482669/

相关文章:

  • 做服装广告素材网站合肥企业网站制作
  • 宿州网站建设公司哪家好吉林文明网设计专门页面
  • 网站中弹出广告怎么做的个人网站可以做论坛
  • 大连里程科技做网站angular网站模板下载
  • 工艺品网站怎么做横琴网站建设
  • 网站设计基本步骤wordpress国外插件速度慢
  • 合肥建站网站平台企业网站策划方案网站建设方案
  • 网站建设8万属于资产吗网络营销具有哪些特点
  • 什么网站对护肤品测评做的很好图书馆门户网站建设总结
  • 网站优化的监测评估搭建简单网站
  • 介绍一个电影的网站模板下载泉州软件开发培训机构
  • 做红酒的网站有哪些网页设计制作方法
  • 电子商务网站建设的书网站获取访客qq号码
  • 网站建设推广合同范本为女足世界杯创建一个网站
  • 郑州做网站推广的公司哪家好php 整个网站变量
  • 网站服务器维护 价目表公司网站搭建费用
  • 免费网站后台管理系统模板网上接设计单在哪里接
  • 系统开发生命周期做推广优化的网站有哪些
  • 在网站接入银联怎么做网站开发课程软件
  • 免费制作个人简历的网站黄岛建设局网站
  • 免费注册网站有哪些广告联盟大全
  • 屏山县建设局网站长沙今天最新招聘信息
  • 做苗木免费网站wordpress下一篇
  • 建设部网站官网查询wordpress如何加跳转
  • 河北建设厅身份认证锁登录网站营销网站定制公司
  • 网站排名优化在线培训wordpress短信登陆
  • 广西医院的网站建设奎文营销型网站建设
  • 网站有做货v电影主题 wordpress
  • 网站建设图片素材义乌网站建设方式
  • 遨游网站建设分销平台软件哪个好