详解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 相关文章推荐
js中reverse函数的用法详解
Dec 26 Javascript
鼠标拖拽移动子窗体的JS实现
Feb 25 Javascript
JavaScript实现SHA-1加密算法的方法
Mar 11 Javascript
jQuery仅用3行代码实现的显示与隐藏功能完整实例
Oct 08 Javascript
JS实现的幻灯片切换显示效果
Sep 07 Javascript
原生JS取代一些JQuery方法的简单实现
Sep 20 Javascript
jQuery插件WebUploader实现文件上传
Nov 07 Javascript
浅谈jQuery中的$.extend方法来扩展JSON对象
Feb 12 Javascript
jQuery自定义图片上传插件实例代码
Apr 04 jQuery
js禁止浏览器页面后退功能的实例(推荐)
Sep 01 Javascript
JavaScript实现星级评价效果
May 17 Javascript
Element-ui el-tree新增和删除节点后如何刷新tree的实例
Aug 31 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
PHP和.net中des加解密的实现方法
2013/02/27 PHP
支持汉转拼和拼音分词的PHP中文工具类ChineseUtil
2018/02/23 PHP
PHP+Session防止表单重复提交的解决方法
2018/04/09 PHP
PHP APP微信提现接口代码
2018/09/30 PHP
基于jQuery的左右滚动实现代码
2010/12/03 Javascript
Javascript模拟加速运动与减速运动代码分享
2014/12/11 Javascript
javascript鼠标滑动评分控件完整实例
2015/05/13 Javascript
详解JavaScript基于面向对象之继承
2015/12/13 Javascript
DropDownList实现可输入可选择(两种版本可选)
2016/12/07 Javascript
JS焦点图,JS 多个页面放多个焦点图的实例
2016/12/08 Javascript
JS设置时间无效问题的解决办法
2017/02/18 Javascript
angular4实现tab栏切换的方法示例
2017/10/21 Javascript
Node.js Express安装与使用教程
2018/05/11 Javascript
jQuery实现table表格checkbox全选的方法分析
2018/07/04 jQuery
微信小程序代码上传、审核发布小程序
2019/05/18 Javascript
原生js实现抽奖小游戏
2019/06/27 Javascript
js实现鼠标点击页面弹出自定义文字效果
2019/12/24 Javascript
js实现鼠标拖曳效果
2020/12/30 Javascript
[02:44]完美大师赛主赛事淘汰赛第二日观众采访
2017/11/24 DOTA
python3利用Socket实现通信的方法示例
2019/05/06 Python
对pyqt5多线程正确的开启姿势详解
2019/06/14 Python
Django接收post前端返回的json格式数据代码实现
2019/07/31 Python
Flask之pipenv虚拟环境的实现
2019/11/26 Python
利用Python实现朋友圈中的九宫格图片效果
2020/09/03 Python
详解如何使用Pytest进行自动化测试
2021/01/14 Python
html5开发三八女王节表白神器
2018/03/07 HTML / CSS
意大利网上药房:Farmacia 33
2020/01/27 全球购物
标准的毕业生自荐信
2014/04/20 职场文书
新闻人物通讯稿
2014/10/09 职场文书
美容院合作经营协议书
2014/10/10 职场文书
党的群众路线教育实践活动实施方案
2014/10/31 职场文书
廉洁自律承诺书2015
2015/01/22 职场文书
Redis5之后版本的高可用集群搭建的实现
2021/04/27 Redis
使用Redis实现秒杀功能的简单方法
2021/05/08 Redis
MySQL数据库10秒内插入百万条数据的实现
2021/11/01 MySQL
利用 JavaScript 构建命令行应用
2021/11/17 Javascript