详解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回调函数的一个妙用
Aug 29 Javascript
JavaScript模仿Pinterest实现图片预加载功能
Oct 25 Javascript
Javascript中的 “&” 和 “|” 详解
Feb 02 Javascript
详解axios在node.js中的post使用
Apr 27 Javascript
微信小程序 空白页重定向解决办法
Jun 27 Javascript
Django+Vue.js搭建前后端分离项目的示例
Aug 07 Javascript
Material(包括Material Icon)在Angular2中的使用详解
Feb 11 Javascript
Vue项目使用CDN优化首屏加载问题
Apr 01 Javascript
node.js中TCP Socket多进程间的消息推送示例详解
Jul 10 Javascript
微信小程序自定义轮播图
Nov 04 Javascript
JS实现简易留言板特效
Dec 23 Javascript
JavaScript架构搭建前端监控如何采集异常数据
Jun 25 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
ThinkPHP中的常用查询语言汇总
2014/08/22 PHP
smarty中js的调用方法示例
2014/10/27 PHP
php文件下载处理方法分析
2015/04/22 PHP
PHP中call_user_func_array回调函数的用法示例
2016/11/26 PHP
PHP基于XMLWriter操作xml的方法分析
2017/07/17 PHP
javascript 图片上传预览-兼容标准
2009/06/01 Javascript
浅析javascript闭包 实例分析
2010/12/25 Javascript
JavaScript字符串常用类使用方法汇总
2015/04/14 Javascript
JavaScript实现点击单选按钮改变输入框中文本域内容的方法
2015/08/12 Javascript
JS+CSS实现鼠标经过弹出一个DIV框完整实例(带缓冲动画渐变效果)
2016/03/25 Javascript
Javascript的比较汇总
2016/07/25 Javascript
jQuery Easyui加载表格出错时在表格中间显示自定义的提示内容
2016/12/08 Javascript
Vue中建立全局引用或者全局命令的方法
2017/08/21 Javascript
使用socket.io实现简单聊天室案例
2018/01/02 Javascript
基于Vue的ajax公共方法(详解)
2018/01/20 Javascript
Vue使用vux-ui自定义表单验证遇到的问题及解决方法
2018/05/10 Javascript
解决vue.js 数据渲染成功仍报错的问题
2018/08/25 Javascript
记录一次开发微信网页分享的步骤
2019/05/07 Javascript
基于 vue-skeleton-webpack-plugin 的骨架屏实战
2019/08/05 Javascript
js的Object.assign用法示例分析
2020/03/05 Javascript
jquery实现图片放大镜效果
2020/12/23 jQuery
[01:52]DOTA2完美大师赛Vega战队趣味视频——kpii老师小课堂
2017/11/25 DOTA
python使用点操作符访问字典(dict)数据的方法
2015/03/16 Python
详谈在flask中使用jsonify和json.dumps的区别
2018/03/26 Python
python线程定时器Timer实现原理解析
2019/11/30 Python
python 常见的排序算法实现汇总
2020/08/21 Python
大码女装:Ulla Popken
2019/08/06 全球购物
澳大利亚领先的内衣店:Bendon Lingerie澳大利亚
2020/05/15 全球购物
信息技术毕业生自荐信范文
2014/03/13 职场文书
无偿献血倡议书
2014/04/14 职场文书
行政专员岗位职责说明书
2014/07/30 职场文书
导游词之南迦巴瓦峰
2019/11/19 职场文书
深入理解java.lang.String类的不可变性
2021/06/27 Java/Android
python编程项目中线上问题排查与解决
2021/11/01 Python
全面盘点MySQL中的那些重要日志文件
2021/11/27 MySQL
小喇叭开始广播了! 四十多年前珍贵老照片
2022/05/09 无线电