详解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 相关文章推荐
js 禁用只读文本框获得焦点时的退格键
Apr 25 Javascript
Js如何判断客户端是PC还是手持设备简单分析
Nov 22 Javascript
ie浏览器使用js导出网页到excel并打印
Mar 11 Javascript
一个非常全面的javascript URL解析函数和分段URL解析方法
Apr 12 Javascript
使用node+vue.js实现SPA应用
Jan 28 Javascript
JavaScript实现垂直向上无缝滚动特效代码
Nov 23 Javascript
JavaScript三种绑定事件方式及相互之间的区别分析
Jan 10 Javascript
Angular2整合其他插件的方法
Jan 20 Javascript
详解vuex中action何时完成以及如何正确调用dispatch的思考
Jan 21 Javascript
如何写好一个vue组件,老夫的一年经验全在这了(推荐)
May 18 Javascript
详解Webpack4多页应用打包方案
Jul 16 Javascript
Vue toFixed保留两位小数的3种方式
Oct 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
在DC的漫画和电影中,蝙蝠侠的宿敌,小丑的真名是什么?
2020/04/09 欧美动漫
phpmyadmin安装时提示:Warning: require_once(./libraries/common.inc.php)错误解决办法
2011/08/18 PHP
PHP GD库生成图像的几个函数总结
2014/11/19 PHP
WordPress中获取所使用的模板的页面ID的简单方法
2015/12/31 PHP
mysql alter table命令修改表结构实例详解
2016/09/24 PHP
自制PHP框架之路由与控制器
2017/05/07 PHP
jquery append()方法与html()方法的区别及使用介绍
2014/08/01 Javascript
jQuery基于图层模仿五星星评价功能的方法
2015/05/07 Javascript
jquery模拟alert的弹窗插件
2015/07/31 Javascript
jQuery实现点击某个div打开层,点击其他div关闭层实例分析(阻止冒泡)
2016/11/18 Javascript
vue基于Vue2.0和高德地图的地图组件实例
2017/04/28 Javascript
JS仿淘宝搜索框用户输入事件的实现
2017/06/19 Javascript
JS实现加载时锁定HTML页面元素的方法
2017/06/24 Javascript
总结js中的一些兼容性易错的问题
2017/12/18 Javascript
vee-validate vue 2.0自定义表单验证的实例
2018/08/28 Javascript
vue自定v-model实现表单数据双向绑定问题
2018/09/03 Javascript
详解小程序rich-text对富文本支持方案
2018/11/28 Javascript
简谈创建React Component的几种方式
2019/06/15 Javascript
浅谈Vue3.0新版API之composition-api入坑指南
2020/04/30 Javascript
vue中destroyed方法的使用说明
2020/07/21 Javascript
搭建vscode+vue环境的详细教程
2020/08/31 Javascript
原生js实现简单轮播图
2020/10/26 Javascript
Python调用命令行进度条的方法
2015/05/05 Python
用pickle存储Python的原生对象方法
2017/04/28 Python
Python语言实现百度语音识别API的使用实例
2017/12/13 Python
python语音识别实践之百度语音API
2018/08/30 Python
Python3 使用cookiejar管理cookie的方法
2018/12/28 Python
浅谈python累加求和+奇偶数求和_break_continue
2020/02/25 Python
Python3 selenium 实现QQ群接龙自动化功能
2020/04/17 Python
matplotlib事件处理基础(事件绑定、事件属性)
2021/02/03 Python
澳大利亚现代波西米亚风格女装网站:Bohemian Traders
2018/04/16 全球购物
STAUD官方网站:洛杉矶独有的闲适风格
2019/04/11 全球购物
历史系毕业生自荐信
2013/10/28 职场文书
大学学雷锋活动总结
2014/06/26 职场文书
群众路线教育实践活动学习笔记
2014/11/05 职场文书
python 实现的截屏工具
2021/05/08 Python