最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 科技 - 知识百科 - 正文

详解Vue + Vuex 如何使用 vm.$nextTick

来源:动视网 责编:小采 时间:2020-11-27 22:25:21
文档

详解Vue + Vuex 如何使用 vm.$nextTick

详解Vue + Vuex 如何使用 vm.$nextTick:vm.$nextTick 简单说,因为DOM至少会在当前tick里面的代码全部执行完毕再更新。所以不可能做到在修改数据后并且DOM更新后再执行,要保证在DOM更新以后再执行某一块代码,就必须把这块代码放到下一次事件循环里面,比如setTimeout(fn, 0),这样D
推荐度:
导读详解Vue + Vuex 如何使用 vm.$nextTick:vm.$nextTick 简单说,因为DOM至少会在当前tick里面的代码全部执行完毕再更新。所以不可能做到在修改数据后并且DOM更新后再执行,要保证在DOM更新以后再执行某一块代码,就必须把这块代码放到下一次事件循环里面,比如setTimeout(fn, 0),这样D


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
 })
 })
 }
}

文档

详解Vue + Vuex 如何使用 vm.$nextTick

详解Vue + Vuex 如何使用 vm.$nextTick:vm.$nextTick 简单说,因为DOM至少会在当前tick里面的代码全部执行完毕再更新。所以不可能做到在修改数据后并且DOM更新后再执行,要保证在DOM更新以后再执行某一块代码,就必须把这块代码放到下一次事件循环里面,比如setTimeout(fn, 0),这样D
推荐度:
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top