Vue中的nextTick和keep-alive这么玩

104 阅读2分钟

nextTick

怎么理解nextTick

当我们触发事件更新dom后,无法第一时间获取到最新值,这个时候就要用到nextTick,他可以帮助我们在下一次dom执行后 更新他的回调函数

nextTick原理

浏览器事件循环机制

    浏览器对于事件的处理是有自己的一套机制,同步代码进入执行栈,异步代码进入异步队列,异步任务分为宏任务和微任务
    

193b445887cc4b4fbd51bf2ee3c69c8f_tplv-k3u1fbpfcp-zoom-in-crop-mark_3024_0_0_0.webp

f1ef0ab283b54ad6be9468d69db06c77_tplv-k3u1fbpfcp-zoom-in-crop-mark_3024_0_0_0.webp

宏任务和微任务

宏任务是浏览器带来的函数,一般包括:script (主代码块)、setTimeout 、setInterval 、 setImmediate 、I/O 、UI rendering

微任务是语言带来的函数,一般包括:Promise.thenMuationObserverprocess.nextTick(Nodejs) 、promise 、Object.observe 、MutationObserver

执行顺序

当浏览器执行时,会先执行同步任务,然后执行异步任务,执行异步任务时,会先执行微任务,把微任务队列清空后,再去执行一个宏任务,然后在看此时的微任务队列,如此循环,知道宏任务微任务清空

同步——>异步(微任务(清空)——>宏任务)

keep-alive

keep-alive是什么

keep-alive是一个抽象组件:它自身不会渲染一个 DOM 元素,也不会出现在父组件链中;使用keep-alive包裹动态组件时,会缓存不活动的组件实例,而不是销毁它们。

keep-alive可以实现组件缓存,当组件切换时不会对当前组件进行卸载。

主要是有include、exclude、max三个属性;前两个属性允许keep-alive有条件的进行缓存;max可以定义组件最大的缓存个数,如果超过了这个个数的话,在下一个新实例创建之前,就会将以缓存组件中最久没有被访问到的实例销毁掉。

两个生命周期activated/deactivated,用来得知当前组件是否处于活跃状态。

keep-alive的生命周期

当引入keep-alive的时候,页面第一次进入,钩子的触发顺序:

created ->  mounted->   activated,退出时触发deactivated。当再次进入(前进或者后退)时,只触发activated。

举个栗子

home.vue

 <template>
   <div class="home">
       <input placeholder="输入框">
   </div>
 </template>

 <script>export default {
      name: 'home',
      components: {
        HelloWorld
      },

    }
 </script>

About.vue

<template>
   <div class="about">
      <h1>This is an about page</h1>
   </div>
</template>

App.vue

<template>
  <div id="app">
    <div id="nav">
      <router-link to="/">Home</router-link> |
      <router-link to="/about">About</router-link>
    </div>
    <keep-alive include="home">
      <router-view/>
    </keep-alive>

  </div>
</template>

<script>
import Home from "./views/Home.vue"
import About from "./views/About.vue"

export default{
  components: {
    Home,
    About
  },
}
</script>

重重重重重重重重点!!!

name:'home'

屏幕截图 2022-09-22 202344.png

include:'home'

屏幕截图 2022-09-22 202404.png