详解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 - HTML的request类
Jan 09 Javascript
JavaScript Cookie 直接浏览网站分网址
Dec 08 Javascript
js对数字的格式化使用说明
Jan 12 Javascript
基于jQuery的简单的列表导航菜单
Mar 02 Javascript
告诉你什么是javascript的回调函数
Sep 04 Javascript
Javascript学习笔记之数组的遍历和 length 属性
Nov 23 Javascript
vue.js指令v-model实现方法
Dec 05 Javascript
js随机生成一个验证码
Jun 01 Javascript
JS实现的走迷宫小游戏完整实例
Jul 19 Javascript
微信小程序实现运动步数排行功能(可删除)
Jul 05 Javascript
Vue项目实现简单的权限控制管理功能
Jul 17 Javascript
JS实现简易留言板特效
Dec 23 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
在PHP中利用XML技术构造远程服务(下)
2006/10/09 PHP
php一句话cmdshell新型 (非一句话木马)
2009/04/18 PHP
php使用curl_init()和curl_multi_init()多线程的速度比较详解
2018/08/15 PHP
PHP实现二维数组(或多维数组)转换成一维数组的常见方法总结
2019/12/04 PHP
jQuery 使用手册(五)
2009/09/23 Javascript
js的hasownproperty使用示例
2014/03/02 Javascript
js生成动态表格并为每个单元格添加单击事件的方法
2014/04/14 Javascript
JavaScript eval() 函数介绍及应用示例
2014/07/29 Javascript
JavaScript搜索字符串并将搜索结果返回到字符串的方法
2015/04/06 Javascript
整理AngularJS中的一些常用指令
2015/06/16 Javascript
js判断手机访问或者PC的几个例子(常用于手机跳转)
2015/12/15 Javascript
Javascript中常见的逻辑题和解决方法
2016/09/17 Javascript
从零开始搭建一个react项目开发
2018/02/09 Javascript
jquery3和layui冲突导致使用layui.layer.full弹出全屏iframe窗口时高度152px问题
2019/05/12 jQuery
vue服务端渲染操作简单入门实例分析
2019/08/28 Javascript
Vue实现开心消消乐游戏算法
2019/10/22 Javascript
python任务调度实例分析
2015/05/19 Python
Python常用知识点汇总
2016/05/08 Python
Python模块包中__init__.py文件功能分析
2016/06/14 Python
Django在win10下的安装并创建工程
2017/11/20 Python
代码分析Python地图坐标转换
2018/02/08 Python
django多对多表的创建,级联删除及手动创建第三张表
2019/07/25 Python
使用python 将图片复制到系统剪贴中
2019/12/13 Python
python两个list[]相加的实现方法
2020/09/23 Python
《满井游记》教学反思
2014/02/26 职场文书
汉语言文学专业求职信
2014/06/19 职场文书
环卫工人节活动总结
2014/08/29 职场文书
学习实践科学发展观心得体会
2014/09/10 职场文书
初三英语教学计划
2015/01/23 职场文书
开除员工通知
2015/04/22 职场文书
结婚堵门保证书
2015/05/08 职场文书
学习心得体会
2019/06/20 职场文书
什么是检讨书?检讨书的格式及范文
2019/11/05 职场文书
解决hive中导入text文件遇到的坑
2021/04/07 Python
使用vue-element-admin框架从后端动态获取菜单功能的实现
2021/04/29 Vue.js
python神经网络学习 使用Keras进行回归运算
2022/05/04 Python