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

Vue学习第17天——netTick()的原理及使用

目录

  • 一、nextTick
    • 1、定义
    • 2、理解
    • 3、应用场景
    • 4、语法
  • 二、Vue更新DOM机制
    • 1、官方说明
    • 2、更新DOM机制理解
    • 3、nextTick的作用
  • 三、案例练习
  • 四、总结
    • 1、为什么使用nextTick
    • 2、Vue实现nextTick的原理

一、nextTick

1、定义

等待下一次 DOM 更新刷新的工具方法

2、理解

DOM节点更新完毕之后再执行回调函数

3、应用场景

需要在视图更新之后,基于新的视图进行操作(eg:先在页面中渲染出输入框,然后输入框自动获取焦点)

4、语法

this.$nextTick(回调函数)

二、Vue更新DOM机制

1、官方说明

当你在 Vue 中更改响应式状态时,最终的 DOM 更新并不是同步生效的,而是由 Vue 将它们缓存在一个队列中,直到下一个“tick”才一起执行。这样是为了确保每个组件无论发生多少状态改变,都仅执行一次更新。

2、更新DOM机制理解

Vue 实现响应式并不是数据发生变化之后 DOM 立即变化,Vue 在更新 DOM 时是异步执行的。

只要侦听到数据变化,Vue 将开启一个队列,然后把同一事件循环中观察数据变化的watcher推送到这个队列里。

如果watcher被触发多次,只会被推送到队列一次(这种缓冲行为可以有效的去除重复数据造成的不必要的计算和DOM更新)。然后在下一个事件循环开始时才会执行必要的DOM更新,即Vue 刷新队列并执行工作。

3、nextTick的作用

为了在数据变化之后就实现Vue更新DOM ,可以在数据变化之后立即调用 Vue.nextTick(回调函数) 。这样回调函数在 DOM 更新完成后就会调用。

执行顺序:当页面上的元素被重新渲染之后,才会执行指定回调函数中的代码

三、案例练习

需求:点击修改按钮时,页面会出现一个input输入框,并且自动获取焦点

<template>
  <div>
    <p>nextTick的使用</p>
    <button @click="showIpt">点击按钮展示输入框自动获取焦点</button><br/>
    <input type="text" v-show="isShow" ref="ipt" value="请输入内容">
  </div>
</template>

<script>

export default {
 name:"Student",
 data(){
  return {
    isShow:false,
  }
 },
 methods:{
  showIpt(){
    this.isShow=true;
    //当页面出现input框后才能获取焦点
    this.$nextTick(()=>{
      this.$refs.ipt.focus()
    })
  }
 }

}
</script>

运行结果
在这里插入图片描述

四、总结

1、为什么使用nextTick

使用Vue.nextTick()是为了可以获取更新后的DOM 。

2、Vue实现nextTick的原理

Vue在内部会维护一个异步队列。异步任务根据所处的环境,优先使用微任务,其次是宏任务。优先级:Promise.then>MutationObserver>setImmediate>setTimeout

nextTick 主要应用于 vue 内部的异步更新,对外暴露Vue.nextTick 和 vm.$nextTick 给程序员使用。nextTick 会先将内部的页面更新执行完毕,再去执行用户的 nextTick,因此在 nextTick 内可以获取到更新后的 dom。

相关文章:

  • 英语语法精讲合集
  • 如何用数据采集网关快速采集工业现场数据,怎么搭建MQTT服务器?
  • Vue中的样式绑定
  • 大学网课答案公众号题库搭建
  • torch.utils.data
  • torch.torchvision
  • Git GitHub VSCode 简单使用
  • 小程序开发技术框架选型
  • 大学生怎么制作查题搜题公众号?
  • Spring源码------IOC容器初始化过程
  • SpringBoot+Vue+Element-UI实现家具商城系统
  • Proxy-Reflect
  • 容器-基础
  • GC垃圾回收
  • 3D场景的制作步骤
  • 4. 路由到控制器 - Laravel从零开始教程
  • axios请求、和返回数据拦截,统一请求报错提示_012
  • ERLANG 网工修炼笔记 ---- UDP
  • Git同步原始仓库到Fork仓库中
  • Java教程_软件开发基础
  • Laravel核心解读--Facades
  • Linux编程学习笔记 | Linux多线程学习[2] - 线程的同步
  • React as a UI Runtime(五、列表)
  • Selenium实战教程系列(二)---元素定位
  • Unix命令
  • 前端 CSS : 5# 纯 CSS 实现24小时超市
  • 软件开发学习的5大技巧,你知道吗?
  • 掌握面试——弹出框的实现(一道题中包含布局/js设计模式)
  • [Shell 脚本] 备份网站文件至OSS服务(纯shell脚本无sdk) ...
  • 关于Kubernetes Dashboard漏洞CVE-2018-18264的修复公告
  • 如何在 Intellij IDEA 更高效地将应用部署到容器服务 Kubernetes ...
  • #我与Java虚拟机的故事#连载13:有这本书就够了
  • (LNMP) How To Install Linux, nginx, MySQL, PHP
  • (Redis使用系列) Springboot 使用redis实现接口Api限流 十
  • (vue)el-checkbox 实现展示区分 label 和 value(展示值与选中获取值需不同)
  • (博弈 sg入门)kiki's game -- hdu -- 2147
  • (独孤九剑)--文件系统
  • (附源码)基于SSM多源异构数据关联技术构建智能校园-计算机毕设 64366
  • (教学思路 C#之类三)方法参数类型(ref、out、parmas)
  • (四)TensorRT | 基于 GPU 端的 Python 推理
  • (转载)Linux 多线程条件变量同步
  • .bashrc在哪里,alias妙用
  • .halo勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .Net Core缓存组件(MemoryCache)源码解析
  • .NET DevOps 接入指南 | 1. GitLab 安装
  • .NET Framework Client Profile - a Subset of the .NET Framework Redistribution
  • .Net IE10 _doPostBack 未定义
  • .net redis定时_一场由fork引发的超时,让我们重新探讨了Redis的抖动问题
  • .NET 设计模式初探
  • .net/c# memcached 获取所有缓存键(keys)
  • .NET/C# 使用 ConditionalWeakTable 附加字段(CLR 版本的附加属性,也可用用来当作弱引用字典 WeakDictionary)
  • .Net转Java自学之路—基础巩固篇十三(集合)
  • .vue文件怎么使用_我在项目中是这样配置Vue的
  • @CacheInvalidate(name = “xxx“, key = “#results.![a+b]“,multi = true)是什么意思
  • @TableId注解详细介绍 mybaits 实体类主键注解