详解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将NodeList作为Array数组处理的方法
Jul 09 Javascript
javascript控制Div层透明属性由浅变深由深变浅逐渐显示
Nov 12 Javascript
用console.table()调试javascript
Sep 04 Javascript
AngularJS自动表单验证
Feb 01 Javascript
浅谈jQuery before和insertBefore的区别
Dec 04 Javascript
jQuery实现选中行变色效果(实例讲解)
Jul 06 jQuery
基于jQuery中ajax的相关方法汇总(必看篇)
Nov 08 jQuery
基于Vue的移动端图片裁剪组件功能
Nov 28 Javascript
React Router v4 入坑指南(小结)
Apr 08 Javascript
简述vue路由打开一个新的窗口的方法
Nov 29 Javascript
JS+HTML5 canvas绘制验证码示例
Dec 05 Javascript
浅谈Web Storage API的使用
Jun 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
基于mysql的论坛(4)
2006/10/09 PHP
在PHP中操作Excel实例代码
2010/04/29 PHP
ThinkPHP提交表单时默认自动转义的解决方法
2014/11/25 PHP
editable.js 基于jquery的表格的编辑插件
2011/10/24 Javascript
深入理解JavaScript系列(6) 强大的原型和原型链
2012/01/15 Javascript
jquery分析文本里url或邮件地址为真实链接的方法
2015/06/20 Javascript
可以浮动某个物体的jquery控件用法实例
2015/07/24 Javascript
JS数组排序技巧汇总(冒泡、sort、快速、希尔等排序)
2015/11/24 Javascript
详解js图片轮播效果实现原理
2015/12/17 Javascript
bootstrap table复杂操作代码
2016/11/01 Javascript
React中使用collections时key的重要性详解
2017/08/07 Javascript
原生js封装添加class,删除class的实例
2017/11/06 Javascript
Node.js静态服务器的实现方法
2018/02/28 Javascript
Webpack打包字体font-awesome的方法示例
2018/04/26 Javascript
npm scripts 使用指南详解
2018/10/08 Javascript
vue-test-utils初使用详解
2019/05/23 Javascript
nuxt+axios实现打包后动态修改请求地址的方法
2020/04/22 Javascript
微信小程序反编译的实现
2020/12/10 Javascript
[02:06]DOTA2英雄基础教程 暗影萨满
2013/12/16 DOTA
pygame学习笔记(3):运动速率、时间、事件、文字
2015/04/15 Python
Python基于FTP模块实现ftp文件上传操作示例
2018/04/23 Python
Python + selenium自动化环境搭建的完整步骤
2018/05/19 Python
TensorFlow数据输入的方法示例
2018/06/19 Python
Python queue队列原理与应用案例分析
2019/09/27 Python
opencv之颜色过滤只留下图片中的红色区域操作
2020/06/05 Python
详解python中GPU版本的opencv常用方法介绍
2020/07/24 Python
Pytorch - TORCH.NN.INIT 参数初始化的操作
2021/02/27 Python
解决H5的a标签的download属性下载service上的文件出现跨域问题
2019/07/16 HTML / CSS
两则小学生的自我评价分享
2013/11/14 职场文书
学生会竞选演讲稿
2014/04/24 职场文书
单位委托书范本(3篇)
2014/09/18 职场文书
资料员岗位职责
2015/02/10 职场文书
西安事变观后感
2015/06/12 职场文书
归途列车观后感
2015/06/17 职场文书
晚会开幕词范文
2016/03/04 职场文书
浅谈CSS不规则边框的生成方案
2021/05/25 HTML / CSS