详解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获取注册信息并提示实现代码
Apr 21 Javascript
jquery实现不同大小浏览器使用不同的css样式表的方法
Apr 02 Javascript
js取模(求余数)隔行变色
May 15 Javascript
通过js获取上传的图片信息(临时保存路径,名称,大小)然后通过ajax传递给后端的方法
Oct 01 Javascript
jQuery纵向导航菜单效果实现方法
Dec 19 Javascript
jquery仿京东侧边栏导航效果
Mar 02 Javascript
js时间查询插件使用详解
Apr 07 Javascript
解决option标签selected=&quot;selected&quot;属性失效的问题
Nov 06 Javascript
vue服务端渲染页面缓存和组件缓存的实例详解
Sep 18 Javascript
vue-cli中安装方法(图文详细步骤)
Dec 12 Javascript
简单了解JavaScript作用域
Jul 31 Javascript
HTML+JS实现在线朗读器
Feb 15 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
咖啡语言
2021/03/03 咖啡文化
自己前几天写的无限分类类
2007/02/14 PHP
php中将时间差转换为字符串提示的实现代码
2011/08/08 PHP
php使用数组填充下拉列表框的方法
2015/03/31 PHP
php提取微信账单的有效信息
2018/10/01 PHP
PHP DB 数据库连接类定义与用法示例
2019/03/11 PHP
JavaScript 小型打飞机游戏实现原理说明
2010/10/28 Javascript
浅析js中取绝对值的2种方法
2013/07/09 Javascript
js jquery分别实现动态的文件上传操作按钮的添加和删除
2014/01/13 Javascript
checkbox勾选判断代码分析
2014/06/11 Javascript
详解javascript遍历方式
2015/11/11 Javascript
关于JSON与JSONP简单总结
2016/08/16 Javascript
jquery遍历标签中自定义的属性方法
2016/09/17 Javascript
js select下拉联动 更具级联性!
2020/04/17 Javascript
Vue引入jquery实现平滑滚动到指定位置
2018/05/09 jQuery
详解Vue.js使用Swiper.js在iOS
2018/09/10 Javascript
JS实现随机生成10个手机号的方法示例
2018/12/07 Javascript
JS中创建自定义类型的常用模式总结【工厂模式,构造函数模式,原型模式,动态原型模式等】
2019/01/19 Javascript
vue使用i18n实现国际化的方法详解
2019/09/05 Javascript
react结合bootstrap实现评论功能
2020/05/30 Javascript
jQuery实现雪花飘落效果
2020/08/02 jQuery
[02:54]DOTA2亚洲邀请赛 VG战队出场宣传片
2015/02/07 DOTA
Python简单格式化时间的方法【strftime函数】
2016/09/18 Python
Python读取Word(.docx)正文信息的方法
2018/03/15 Python
django的分页器Paginator 从django中导入类
2019/07/25 Python
Python实现aes加密解密多种方法解析
2020/05/15 Python
布局和排版教程 纯css3实现图片三角形排列
2014/10/17 HTML / CSS
玩具反斗城美国官网:Toys"R"Us
2016/09/17 全球购物
世界上最好的儿童品牌:AlexandAlexa
2018/01/27 全球购物
荷兰和比利时时尚鞋店:Van Dalen
2018/04/23 全球购物
自荐信如何制作?
2014/02/21 职场文书
软件毕业生个人鉴定
2014/03/03 职场文书
2014年综治宣传月活动总结
2014/04/28 职场文书
公司介绍信范文
2015/01/31 职场文书
新员工试用期自我评价
2015/03/10 职场文书
聊一聊Redis与MySQL双写一致性如何保证
2021/06/26 Redis