← 返回目录

Vue中$nextTick的使用

第 129 / 154 卷日期:

减少添加,而是复用可以复用的部分。

$refs 只会在组件渲染完成之后生效,并且不是响应式的。这仅作为一个用于直接操作子组件的“逃生舱”—— 你应该避免在模板或计算属性中访问

tip:如果获取不到的时候,可以试一试使用nextTick

Vue中$nextTick的使用

$nextTick

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

因为 vue 中不是数据一发生改变就马上更新视图层的,如果这样会带来比较差的性能优化,而是在 vue 中会添加到任务队列中,待执行栈的任务处理完才执行。所以 vue 中我们改变数据时不会立即触发视图,但是如果我们需

要实时获取到最新的DOM,这个时候可以手动调用 nextTick。

Vue中的keep-alive

用 keep-alive 包裹组件时,会缓存不活动的组件实例,而不是销毁,使得我们返回的时候能重新激活。keep-alive 主要用于保存组件状态或避免重复创建。避免重复渲染导致的性能问题。

常见场景页面的缓存,如上面的,保存浏览商品页的滚动条位置,筛选信息等

注意这个 keep-alive 和这个 Connection: Keep-Alive 是不一样的,这个属性的作用是,往往我们三次握手后,

传输完数据就会断开连接进行四次ഀ手,关闭TCP连接,但是当我们在头信息中加入了该属性,那么TCP会在发送后仍然保持打开状态,这样浏览器就可以继续通过同一个TCP连接发送请求,保持TCP连接可以省去下次

请求时需要建立连接的时间,提升资源加载速度。

data为什么是函数

组件中的 data 写成一个函数,数据以函数返回值形式定义。这样每复用一次组件,就会返回一份新的 data,类似于给每个组件实例创建一个私有的数据空间,让各个组件实例维护各自的数据。而单纯的写成对象形式,就使得所

有组件实例共用了一份 data,就会造成一个变了全都会变的结果。

组件

组件生命周期

一、各个生命周期的作用

首先在 vue 生命周期中有十个阶段:

1、beforeCreate(创建前)

2、created(创建后)

在实例创建完成后被立即同步调用。在这一步中,实例已完成对选项的处理,意味着以下内容已被配置完毕:数据侦听、计算属性、方法、事件/侦听器的回调函数。然而,挂载阶段还没开始,且 $el property 目前

尚不可用。

在该阶段已经完成 data 和 methods 的初始化了,只是页面还未渲染,可以在该阶段来发起请求获取数据等,以及操作 data 和调用 methods 等

3、beforeMount(挂载前)

在挂载开始之前被调用:相关的 render 函数首次被调用。

该钩子在服务器端渲染期间不被调用

4、mounted(挂载后)

实例被挂载后调用,这时 el 被新创建的 vm.$ el 替换了。如果根实例挂载到了一个文档内的元素上,当 mounted 被调用时 vm.$ el 也在文档内。

注意 mounted 不会保证所有的子组件也都被挂载完成。如果你希望等到整个视图都渲染完毕再执行某些操作,可以在 mounted 内部使用 vm.$nextTick

该钩子在服务器端渲染期间不被调用

这时候 vue实例完成初始化,且挂载渲染到页面了,最早我们可以在这个阶段来操作页面上的 DOM节点。

5、beforeUpdate(更新前)

在数据发生改变后,DOM 被更新之前被调用。这里适合在现有 DOM 将要被更新之前访问它,比如移除手动添加的事件监听器。

该钩子在服务器端渲染期间不被调用,因为只有初次渲染会在服务器端进行

该阶段此时实例中的数据已经是最新的啦,但是页面的还未更新

6、update(更新后)

在数据更改导致的虚拟 DOM 重新渲染和更新完毕之后被调用。

当这个钩子被调用时,组件 DOM 已经更新,所以你现在可以执行依赖于 DOM 的操作。然而在大多数情况下,你应该避免在此期间更改状态。如果要相应状态改变,通常最好使用计算属性或 watcher 取而代之。

注意,updated 不会保证所有的子组件也都被重新渲染完毕。如果你希望等到整个视图都渲染完毕,可以在 updated 里使用 vm.$nextTick

该钩子在服务器端渲染期间不被调用

避免在这个阶段更改状态的,因为这样可能会导致更新无限循环,曾经我做过个获取表格的高度,如果页面大小发送改变就更新表格的大小,在该阶段执行导致了页面的无限循环,结果死机啦~

被 keep-alive 缓存的组件激活时调用。

该钩子在服务器端渲染期间不被调用

8、deactivated(激活后)

被 keep-alive 缓存的组件失活时调用。

该钩子在服务器端渲染期间不被调用

9、beforeDestory(销毁前)

实例销毁之前调用。在这一步,实例仍然完全可用。

该钩子在服务器端渲染期间不被调用

10、destoryed(销毁后)

实例销毁后调用。该钩子被调用后,对应 Vue 实例的所有指令都被解绑,所有的事件监听器被移除,所有的子实例也都被销毁。

该钩子在服务器端渲染期间不被调用

总结

Vue 的生命周期也就是 Vue实例从创建到销毁的过程,总共分为8个阶段创建前/后,载入前和后,更新前和后,销毁前和后。

创建前和后:

在 beforeCreated 阶段,Vue 实例刚在内存中被创建出来,data 和 methods 还未初始化,都为 undefined

在 created 阶段,vue实例的 data 和 methods 就已经存在了,但是DOM 还未挂载渲染载入前和后:

在 beforeMount 阶段,DOM挂载完成,数据也初始化完成,但是数据的双向绑定还是显示{{}},这是因为 Vue采用了Virtual DOM(虚拟Dom)技术。先占住了一个坑

在 mounted 阶段,DOM挂载完成,上一个阶段留的萝卜坑也补上了更新前/后:

在 beforeUpdate 阶段,此时实例中的 data 以及是最新的了,但是界面上显示的数据还是旧的,此时还没有开始重新渲染DOM节点

在 update 阶段,此时实例中的 data 和界面上显示的数据都是新的了,已经完成了 DOM节点的渲染销毁前/后:

在 beforeDestroy 阶段, Vue实例销毁之前调用。在这一步,实例仍然完全可用。

在 beforeDestroy 阶段,Vue实例所有的事件监听以及和 dom的绑定都解除了

全站分卷索引 · 154 卷
  1. 1代码随想录知识星球精华(最强八股文)第五版(前端篇))
  2. 2html语义化
  3. 3src 和 href 的区别
  4. 4link 与 @import 的区别
  5. 5iframe
  6. 6CSS
  7. 7伪元素和伪类
  8. 8block,inline,inline-block
  9. 9重排、重绘和合成
  10. 10盒子模型
  11. 11margin 合并
  12. 12margin和padding 的值为百分比时
  13. 13浮动
  14. 14定位
  15. 15CSS选择器
  16. 16CSS选择器优先级
  17. 17选择器权重Specificity
  18. 18CSS属性继承
  19. 19不可/可继承属性
  20. 20display: none与 visibility: hidden的区别
  21. 21background-size
  22. 22client、offset&scroll
  23. 23CSS3新特性
  24. 24flex布局
  25. 25常见布局
  26. 26三栏布局
  27. 27垂直居中
  28. 28水平垂直居中
  29. 29CSS画三角形
  30. 30使chrome支持12px以下文字
  31. 31响应式布局
  32. 32媒体查询
  33. 33过渡与动画
  34. 34JavaScript 动画 和 CSS动画
  35. 35SCSS
  36. 36CSS性能优化
  37. 37有哪些数据类型
  38. 38判断数据类型
  39. 39类型转换
  40. 40parseInt&parseFloat
  41. 41浮点数求和步骤
  42. 42十进制小数转二进制
  43. 430.1+0.2 为什么不等于 0.3
  44. 44undefined 和 undeclared 的区别
  45. 45JavaScript NaN 属性
  46. 46isFinite()&isNaN()
  47. 47数组
  48. 48对原数组有影响
  49. 49对原数组无影响
  50. 50数组去重
  51. 51数组拍平
  52. 52ES6新增的数组方法
  53. 53判断是否存在某个值
  54. 54arguments为啥不是数组
  55. 55对象
  56. 56遍历对象的方法
  57. 57判断对象是否具有属性
  58. 58for in 和 for of 的区别
  59. 59继承方式
  60. 60instanceof
  61. 61深浅拷贝
  62. 62freeze属性
  63. 63函数
  64. 64函数柯里化
  65. 65函数的 length
  66. 66箭头函数和普通函数区别
  67. 67构造函数
  68. 68执行上下文
  69. 69作用域
  70. 70作用域和作用域链
  71. 71闭包和内存泄漏
  72. 72this
  73. 73关于 this 的指向问题
  74. 74改变this指向的方法(bind / call / apply)
  75. 75字符串
  76. 76DOM和事件
  77. 77哪些事件支持冒泡
  78. 78阻止冒泡
  79. 79HTMLCollection、NodeList
  80. 80dom.onclick 和 dom.addEventListener的区别
  81. 81e.target和e.currentTarget
  82. 82页面生命周期
  83. 83异步
  84. 84内存管理GC
  85. 85其它
  86. 86JavaScript 中日期时间格式转换
  87. 87input和object实现双向绑定
  88. 88JSON.stringify()
  89. 89escape、encodeURI&encodeURIComponent
  90. 90移动端滚动穿透和溢出
  91. 91ES6
  92. 92Map字典
  93. 93... 与rest
  94. 94proxy
  95. 95模块化
  96. 96Ajax、Fetch和Axios
  97. 97Webpack
  98. 98浏览器:事件循环
  99. 99浏览器内核
  100. 100浏览器同源策略
  101. 101输入URL回车后发生了什么
  102. 102HTTP
  103. 103HTTP 2.0
  104. 104浏览器存储
  105. 105鉴权
  106. 106Webstorage
  107. 107浏览器执行机制
  108. 108AST 抽象语法树
  109. 109性能优化
  110. 110CSS
  111. 111网络相关
  112. 112使用HTTP2.0
  113. 113图片
  114. 114CDN图片
  115. 115其他文件优化
  116. 116降低APP首页开屏渲染时间
  117. 117页面白屏
  118. 118HTTPS中间人攻击
  119. 119Web Worker
  120. 120Service Worker
  121. 121微前端
  122. 122Vue
  123. 123v-show 和 v-if 的区别
  124. 124双向数据绑定的原理
  125. 125Vue中的插槽使用
  126. 126Vue中的key
  127. 127Vue过滤器
  128. 128Vue中Scoped原理
  129. 129Vue中$nextTick的使用
  130. 130Vue中实现组件通信的方式
  131. 131Vue-router
  132. 132Vue路由传参
  133. 133前端路由
  134. 134Vuex
  135. 135虚拟DOM
  136. 136DIFF 算法
  137. 137Vue3和Vue2有哪些区别
  138. 138说一说你对React的理解
  139. 139React事件机制
  140. 140说一说你对react refs的理解
  141. 141react中key的作用
  142. 142组件开发
  143. 143有状态组件和无状态组件
  144. 144函数式组件和类组件的区别
  145. 145PureComponent&Component
  146. 146常见 Hooks
  147. 147状态管理
  148. 148redux toolkit
  149. 149React18新特性
  150. 150client中的createRoot取代以前的ReactDOM.render
  151. 151Suspense
  152. 152新的Hooks
  153. 153VDom一定更快吗
  154. 154Fiber