详解vue中$nextTick和$forceUpdate的用法


Posted in Javascript onDecember 11, 2019

1、$nextTick

vm.$nextTick( [callback] )

this.$nextTick()将回调延迟到下次 DOM 更新循环之后执行,在修改数据之后立即使用它,然后等待 DOM 更新。它跟全局方法 Vue.nextTick 一样,不同的是回调的 this 自动绑定到调用它的实例上。

应用场景:

1、 在Vue生命周期的created()钩子函数进行的DOM操作一定要放在Vue.nextTick()的回调函数中。
2、 因为在created()钩子函数执行的时候DOM 其实并未进行任何渲染,而此时进行DOM操作无异于徒劳,所以此处一定要将

DOM操作的js代码放进Vue.nextTick()的回调函数中。与之对应的就是mounted()钩子函数,因为该钩子函数执行时所有的DOM挂载和渲染都已完成,此时在该钩子函数中进行任何DOM操作都不会有问题 。

在数据变化后要执行的某个操作,而这个操作需要使用随数据改变而改变的DOM结构的时候,这个操作都应该放进Vue.nextTick()的回调函数中。

<html>
  <head>
      <script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script>
  </head>
  <body>
    <div id="app">
      <section>
        <div ref="hello">
         <h1>Hello World ~</h1>
        </div>
        <button type="danger" @click="get">点击</button>
       </section>
     </div>
  </body>
</html>
<script>
new Vue({
 el: '#app',
 methods: {
   get() {
    console.log(0);
   }
  },
  mounted() {
   console.log(333);
   console.log(this.$refs['hello']);
   this.$nextTick(() => {
    console.log(444);
    console.log(this.$refs['hello']);
   });
  },
  created() {
   console.log(111);
   console.log(this.$refs['hello']);
   this.$nextTick(() => {
    console.log(222);
    console.log(this.$refs['hello']);
   });
  }
})
</script>

详解vue中$nextTick和$forceUpdate的用法

可以根据打印的顺序看到,在created()钩子函数执行的时候DOM 其实并未进行任何渲染,而此时进行DOM操作并无作用,而在created()里使用this.$nextTick()可以等待dom生成以后再来获取dom对象。

<html>
  <head>
      <script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script>
  </head>
  <body>
    <div id="app">
      <section>
        <h1 ref="hello">{{ value }}</h1>
        <button type="danger" @click="get">点击</button>
       </section>
     </div>
  </body>
</html>
<script>
new Vue({
 el: '#app',
 data() {
   return {
    value: 'Hello World ~'
   };
  },
  methods: {
   get() {
    this.value = '你好啊';
    console.log(this.$refs['hello'].innerText);
    this.$nextTick(() => {
     console.log(this.$refs['hello'].innerText);
    });
   }
  },
  mounted() {
  },
  created() {
  }
})
</script>

详解vue中$nextTick和$forceUpdate的用法

this.$nextTick()在页面交互,尤其是从后台获取数据后重新生成dom对象之后的操作有很大的优势。

2、this.$forceUpdate()

迫使Vue实例重新(rander)渲染虚拟DOM,注意并不是重新加载组件。结合vue的生命周期,调用$forceUpdate后只会触发beforeUpdate和updated这两个钩子函数,不会触发其他的钩子函数。它仅仅影响实例本身和插入插槽内容的子组件,而不是所有子组件;

应用场景: 当在data里没有显示的声明一个对象的属性,而是之后给该对象添加属性,这种情况vue是检测不到数据变化的,可以使用$forceUpdate()

html:
<span class="test">{{egData.value}}</span>
<el-button @click="changeData">改变</el-button>
 -------------------------------
js:
data(){
 return {
 egData: {}
}
 }
-------------------------------
 
 methods:{
changeData () {
  this.egData.value = 'oldValue'
  this.$forceUpdate() // dom会更新
}
}

但是这种做法并不推荐,官方说如果你现在的场景需要用forceUpdate方法 ,那么99%是你的操作有问题,如上data里不显示声明对象的属性,之后添加属性时正确的做法时用 vm.$set() 方法,所以forceUpdate请慎用。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jquery根据属性和index来查找属性值并操作
Jul 25 Javascript
JavaScript事件委托用法分析
Jan 24 Javascript
JQuery动画与特效实例分析
Feb 02 Javascript
教你使用javascript简单写一个页面模板引擎
May 05 Javascript
简单纯js实现点击切换TAB标签实例
Aug 23 Javascript
今天抽时间给大家整理jquery和ajax的相关知识
Nov 17 Javascript
使用jQuery中的wrap()函数操作HTML元素的教程
May 24 Javascript
javascript使用 concat 方法对数组进行合并的方法
Sep 08 Javascript
jQuery操作复选框(CheckBox)的取值赋值实现代码
Jan 10 Javascript
jQuery表格的维护和删除操作
Feb 03 Javascript
微信小程序的日期选择器的实例详解
Sep 29 Javascript
基于JavaScript实现五子棋游戏
Aug 26 Javascript
基于jQuery实现可编辑的表格
Dec 11 #jQuery
jQuery实现可编辑的表格
Dec 11 #jQuery
vue element自定义表单验证请求后端接口验证
Dec 11 #Javascript
详解如何在JS代码中消灭for循环
Dec 11 #Javascript
Angular封装表单控件及思想总结
Dec 11 #Javascript
小程序接口的promise化的实现方法
Dec 11 #Javascript
js中Function引用类型常见有用的方法和属性详解
Dec 11 #Javascript
You might like
yii实现级联下拉菜单的方法
2014/07/31 PHP
让任务管理器中的CPU跳舞的js代码
2008/11/01 Javascript
AJAX异步从优酷专辑中采集所有视频及信息(JavaScript代码)
2010/11/20 Javascript
Internet Explorer 11 浏览器介绍:别叫我IE
2014/09/28 Javascript
用Node.js通过sitemap.xml批量抓取美女图片
2015/05/28 Javascript
javascript数据结构之双链表插入排序实例详解
2015/11/25 Javascript
Bootstrap基本组件学习笔记之分页(12)
2016/12/08 Javascript
js实现可输入可选择的select下拉框
2016/12/21 Javascript
原生js实现放大镜特效
2017/03/08 Javascript
详解Vue生命周期的示例
2017/03/10 Javascript
实例解析ES6 Proxy使用场景介绍
2018/01/08 Javascript
微信小程序完美解决scroll-view高度自适应问题的方法
2020/08/08 Javascript
在vue-cli3.0 中使用预处理器 (Sass/Less/Stylus) 配置全局变量操作
2020/08/10 Javascript
vue router-link 默认a标签去除下划线的实现
2020/11/06 Javascript
Python连接Redis的基本配置方法
2018/09/13 Python
python实现在函数图像上添加文字和标注的方法
2019/07/08 Python
Python collections中的双向队列deque简单介绍详解
2019/11/04 Python
Pytorch数据拼接与拆分操作实现图解
2020/04/30 Python
html5指南-2.如何操作document metadata
2013/01/07 HTML / CSS
浅谈基于Canvas的手绘风格图形库Rough.js
2018/03/19 HTML / CSS
中国第一家杂志折扣订阅网:杂志铺
2016/08/30 全球购物
MIKI HOUSE美国官方网上商店:日本领先的婴儿和儿童高级时装品牌
2020/06/21 全球购物
班组长岗位职责范本
2014/01/05 职场文书
寒假思想汇报
2014/01/10 职场文书
中式餐厅创业计划书范文
2014/01/23 职场文书
师德个人剖析材料
2014/02/02 职场文书
《鸟的天堂》教学反思
2014/02/27 职场文书
校庆筹备方案
2014/03/30 职场文书
英语自我介绍演讲稿
2014/09/01 职场文书
公安四风对照检查材料思想汇报
2014/10/11 职场文书
2014年科普工作总结
2014/12/06 职场文书
初中生毕业评语
2014/12/29 职场文书
职场干货:简历中的自我评价应该这样写!
2019/05/06 职场文书
MySql学习笔记之事务隔离级别详解
2021/05/12 MySQL
springboot 启动如何排除某些bean的注入
2021/08/02 Java/Android
Kubernetes控制节点的部署
2022/04/01 Servers