详解Vue + Vuex 如何使用 vm.$nextTick


Posted in Javascript onNovember 20, 2017

vm.$nextTick

简单说,因为DOM至少会在当前tick里面的代码全部执行完毕再更新。所以不可能做到在修改数据后并且DOM更新后再执行,要保证在DOM更新以后再执行某一块代码,就必须把这块代码放到下一次事件循环里面,比如setTimeout(fn, 0),这样DOM更新后,就会立即执行这块代码。

//改变数据 
vm.message = 'changed' 
 
//想要立即使用更新后的DOM。这样不行,因为设置message后DOM还没有更新 
console.log(vm.$el.textContent) // 并不会得到'changed' 
 
//这样可以,nextTick里面的代码会在DOM更新后执行 
Vue.nextTick(function(){ 
  console.log(vm.$el.textContent) //可以得到'changed' 
})

vm.$nextTick 的作用是将回调延迟到下次 DOM 更新循环之后执行。

正常在 ready/mounted 中获取数据, 那么操作是很简单的

ready() { // vue2 为 mounted() {
  var request = $.ajax({
    type: "POST",
    dataType: 'json',
    url: "api.php"
  });
  request.then((json) => {
    // balabala
    this.$nextTick(function () {
      // balabala
    })
  });
}

如果是用 vuex 的话, 由于vuex的数据操作都在 action 和 mutations, 然后在 ready/mounted 中调用 action 里的函数, 那么这时候该怎么用 vm.$nextTick 呢?

这时候我们就需要用到 Promise 了, 具体代码如下:

首页是api.js

export default {
  getFromConfig(config) {
    return $.ajax({ data: config })
  }
}

然后是action.js

export const getArticleList = ({dispatch}, config) => {
  return api.getFromConfig(config).then(({data}) => {
    dispatch(types.RECEIVE_ARTICLE, data, config.page)
  })
}

这里一定要加上return, 这样就可以返回一个Promise对象

最后是vue组件

methods: {
  loadMore(page = this.page) {
    var id = this.$route.params.id || ""
    Promise.all([
      this.getArticleList({
        id: id,
        page: page
      })
    ]).then(() => {
      this.$nextTick(function () {
        // balabala
      })
    })
  }
}

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

Javascript 相关文章推荐
javascript innerHTML使用分析
Dec 03 Javascript
jQuery调用WebService的实现代码
Jun 19 Javascript
无缝滚动改进版支持上下左右滚动(封装成函数)
Dec 04 Javascript
jQuery圆形统计图开发实例
Jan 04 Javascript
js实现鼠标悬停图片上时滚动文字说明的方法
Feb 17 Javascript
javascript中eval和with用法实例总结
Nov 30 Javascript
JavaScript基于原型链的继承
Jun 22 Javascript
Bootstrap select下拉联动(jQuery cxselect)
Jan 04 Javascript
Spring Boot+AngularJS+BootStrap实现进度条示例代码
Mar 02 Javascript
bootstrap插件treeview实现全选父节点下所有子节点和反选功能
Jul 21 Javascript
Vue项目中Api的组织和返回数据处理的操作
Nov 04 Javascript
原生js实现表格循环滚动
Nov 24 Javascript
webpack+vue中使用别名路径引用静态图片地址
Nov 20 #Javascript
laydate日历控件使用方法详解
Nov 20 #Javascript
JavaScript框架Angular和React深度对比
Nov 20 #Javascript
如何选择适合你的JavaScript框架
Nov 20 #Javascript
JavaScript内存泄漏的处理方式
Nov 20 #Javascript
加载 vue 远程代码的组件实例详解
Nov 20 #Javascript
jquery中有哪些api jQuery主要API
Nov 20 #jQuery
You might like
Ajax PHP简单入门教程代码
2008/04/25 PHP
PHP中mysqli_affected_rows作用行数返回值分析
2014/12/26 PHP
php开发时容易忘记的一些技术细节
2016/02/03 PHP
PHP 计算两个时间段之间交集的天数示例
2019/10/24 PHP
Yii框架 session 数据库存储操作方法示例
2019/11/18 PHP
gearman管理工具GearmanManager的安装与php使用方法示例
2020/02/27 PHP
jQuery Tools tab使用介绍
2012/07/14 Javascript
在新窗口打开超链接的方法小结
2013/04/14 Javascript
jquery foreach使用示例
2013/09/12 Javascript
jQuery获取动态生成的元素示例
2014/06/15 Javascript
JS定义类的六种方式详解
2016/05/12 Javascript
KnockoutJS 3.X API 第四章之click绑定
2016/10/10 Javascript
jQuery实现鼠标跟随效果
2017/02/20 Javascript
深入理解Angular.JS中的Scope继承
2017/06/04 Javascript
详解vue组件通信的三种方式
2017/06/30 Javascript
浅谈react-router HashRouter和BrowserRouter的使用
2017/12/29 Javascript
angular-tree-component的使用详解
2018/07/30 Javascript
百度小程序自定义通用toast组件
2019/07/17 Javascript
angularjs模态框的使用代码实例
2019/12/20 Javascript
JsonServer安装及启动过程图解
2020/02/28 Javascript
Jquery滑动门/tab切换实现方法完整示例
2020/06/05 jQuery
vue element el-transfer增加拖拽功能
2021/01/15 Vue.js
Vue实现摇一摇功能(兼容ios13.3以上)
2021/01/26 Vue.js
Python实现的弹球小游戏示例
2017/08/01 Python
python Celery定时任务的示例
2018/03/13 Python
Python运行不显示DOS窗口的解决方法
2018/10/22 Python
python矩阵/字典实现最短路径算法
2019/01/17 Python
弄懂这56个Python使用技巧(轻松掌握Python高效开发)
2019/09/18 Python
Python更换pip源方法过程解析
2020/05/19 Python
python和C++共享内存传输图像的示例
2020/10/27 Python
用HTML5的canvas实现一个炫酷时钟效果
2016/05/20 HTML / CSS
伦敦一家领先的精品零售商:IRIS Fashion
2019/05/24 全球购物
NFL官方在线商店:NFLShop
2020/07/29 全球购物
Internet主要有哪些网络群组成
2015/12/24 面试题
小学班主任评语大全
2014/04/23 职场文书
先进党支部事迹材料2016
2016/02/26 职场文书