详解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 相关文章推荐
JQuery UI DatePicker中z-index默认为1的解决办法
Sep 28 Javascript
jQuery向上遍历DOM树之parents(),parent(),closest()之间的区别
Dec 02 Javascript
Javascript中innerHTML用法实例分析
Jan 12 Javascript
Select下拉框模糊查询功能实现代码
Jul 22 Javascript
简单实现js悬浮导航效果
Feb 05 Javascript
解决Node.js使用MySQL出现connect ECONNREFUSED 127.0.0.1:3306的问题
Mar 09 Javascript
angular2路由切换改变页面title的示例代码
Aug 23 Javascript
Vue-Router模式和钩子的用法
Feb 28 Javascript
vue实现百度下拉列表交互操作示例
Mar 12 Javascript
微信小程序 slot踩坑的解决
Apr 01 Javascript
vue全屏事件开发详解
Jun 17 Javascript
vue-quill-editor插入图片路径太长问题解决方法
Jan 08 Vue.js
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代码简化
2010/02/08 PHP
PHP中CURL方法curl_setopt()函数的参数分享
2013/01/19 PHP
php中AES加密解密的例子小结
2014/02/18 PHP
PHP Ajax JavaScript Json获取天气信息实现代码
2016/08/17 PHP
PHP编程实现阳历转换为阴历的方法实例
2017/08/08 PHP
JS文本框不能输入空格验证方法
2013/03/19 Javascript
js实现的常用的左侧导航效果
2013/10/17 Javascript
javascript实现动态侧边栏代码
2014/02/19 Javascript
js动态拼接正则表达式的两种方法
2014/03/04 Javascript
javascript闭包入门示例
2014/04/30 Javascript
一个不错的字符串转码解码函数(自写)
2014/07/31 Javascript
jQuery中:image选择器用法实例
2015/01/03 Javascript
PhantomJS快速入门教程(服务器端的 JavaScript API 的 WebKit)
2015/08/06 Javascript
实例讲解javascript注册事件处理函数
2016/01/09 Javascript
JavaScript数值千分位格式化的两种简单实现方法
2016/08/01 Javascript
微信公众号  提示:Unauthorized API function 问题解决方法
2016/12/05 Javascript
ES6模块化的import和export用法方法总结
2017/08/08 Javascript
Vue form表单动态添加组件实战案例
2019/09/02 Javascript
Python查看多台服务器进程的脚本分享
2014/06/11 Python
python 爬虫出现403禁止访问错误详解
2017/03/11 Python
Python实现简单的语音识别系统
2017/12/13 Python
Win7下Python与Tensorflow-CPU版开发环境的安装与配置过程
2018/01/04 Python
python编程测试电脑开启最大线程数实例代码
2018/02/09 Python
Python构建图像分类识别器的方法
2019/01/12 Python
Python3 合并二叉树的实现
2019/09/30 Python
OpenCV哈里斯(Harris)角点检测的实现
2020/01/15 Python
python如何爬取网页中的文字
2020/07/28 Python
canvas学习总结三之绘制路径-线段
2019/01/31 HTML / CSS
印度尼西亚最大的电商平台:Tokopedia(印尼版淘宝)
2017/12/02 全球购物
社区志愿者心得体会
2014/01/03 职场文书
《富饶的西沙群岛》教学反思
2014/04/09 职场文书
营销计划书
2015/01/17 职场文书
宣传部部长竞选稿
2015/11/21 职场文书
2016年“六一儿童节”校园广播稿
2015/12/17 职场文书
《狼牙山五壮士》教学反思
2016/02/17 职场文书
在Python中如何使用yield
2021/06/07 Python