详解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 变量类型转换常用函数与代码[比较全]
Dec 01 Javascript
JSON+HTML实现国家省市联动选择效果
May 18 Javascript
Javascript学习笔记之函数篇(五) : 构造函数
Nov 23 Javascript
最精简的JavaScript实现鼠标拖动效果的方法
May 11 Javascript
angularjs学习笔记之简单介绍
Sep 26 Javascript
JavaScript ES5标准中新增的Array方法
Jun 28 Javascript
JavaScript 中 apply 、call 的详解
Mar 21 Javascript
vue-router路由参数刷新消失的问题解决方法
Jun 17 Javascript
实现jquery放大镜的两种方法
Feb 22 jQuery
详解Vue用cmd创建项目
Feb 12 Javascript
Vue CLI4 Vue.config.js标准配置(最全注释)
Jun 05 Javascript
基于element-ui封装表单金额输入框的方法示例
Jan 06 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
Yii2框架BootStrap样式的深入理解
2016/11/07 PHP
Laravel 5+ .env环境配置文件详解
2020/04/06 PHP
Jquery AJAX 框架的使用方法
2009/11/03 Javascript
javascript 拖动表格行实现代码
2011/05/05 Javascript
JS对外部文件的加载及对IFRMAME的加载的实现,当加载完成后,指定指向方法(方法回调)
2011/07/04 Javascript
Node.js的包详细介绍
2015/01/14 Javascript
JS实现从表格中动态删除指定行的方法
2015/03/31 Javascript
有关easyui-layout中的收缩层无法显示标题的解决办法
2016/05/10 Javascript
JS实现n秒后自动跳转的两种方法
2020/11/30 Javascript
angularjs ocLazyLoad分步加载js文件实例
2017/01/17 Javascript
关于vuex的学习实践笔记
2017/04/05 Javascript
Angular2 http jsonp的实例详解
2017/08/31 Javascript
JS实现运动缓冲效果的封装函数示例
2018/02/18 Javascript
在vue中多次调用同一个定义全局变量的实例
2018/09/25 Javascript
详解vuex之store拆分即多模块状态管理(modules)篇
2018/11/13 Javascript
JavaScript实现选项卡效果的分析及步骤
2019/04/16 Javascript
JS实现简单tab选项卡切换
2019/10/25 Javascript
jQuery实现轮播图效果
2019/11/26 jQuery
Django框架中方法的访问和查找
2015/07/15 Python
Python3导入CSV文件的实例(跟Python2有些许的不同)
2018/06/22 Python
pyqt5利用pyqtDesigner实现登录界面
2019/03/28 Python
在tensorflow以及keras安装目录查询操作(windows下)
2020/06/19 Python
Python实现弹球小游戏
2020/08/01 Python
移动端html5判断是否滚动到底部并且下拉加载
2019/11/19 HTML / CSS
印度购买眼镜和太阳镜网站:Coolwinks
2018/09/26 全球购物
波兰多品牌运动商店:StreetStyle24.pl
2020/09/22 全球购物
法务专员岗位职责
2014/01/02 职场文书
校园安全检查制度
2014/02/03 职场文书
教师节横幅标语
2014/10/08 职场文书
护理医院见习报告
2014/11/03 职场文书
2015年初中元旦晚会活动总结
2014/11/28 职场文书
初中生思想道德自我评价
2015/03/09 职场文书
团委工作总结2015
2015/04/02 职场文书
律政俏佳人观后感
2015/06/09 职场文书
2016年6.5世界环境日宣传活动总结
2016/04/01 职场文书
向Spring IOC 容器动态注册bean实现方式
2022/07/15 Java/Android