vue组件异步更新疑问

发布于 2022-09-04 20:10:56 字数 3076 浏览 9 评论 0

参考mint-UI中的toast组件改了loading组件,方便可以直接通过load(state)调用,实现axios拦截请求自动加载loading。发现在组件实例方法里修改state状态,发现很奇怪的问题,见下方描述。

先上代码:
loading.vue

<template>
   <div>
      <div class="sk-fading-circle" v-show="state">
          <div class="">
          <div class="sk-circle1 sk-circle"></div>
          <div class="sk-circle2 sk-circle"></div>
          <div class="sk-circle3 sk-circle"></div>
          <div class="sk-circle4 sk-circle"></div>
          <div class="sk-circle5 sk-circle"></div>
          <div class="sk-circle6 sk-circle"></div>
          <div class="sk-circle7 sk-circle"></div>
          <div class="sk-circle8 sk-circle"></div>
          <div class="sk-circle9 sk-circle"></div>
          <div class="sk-circle10 sk-circle"></div>
          <div class="sk-circle11 sk-circle"></div>
          <div class="sk-circle12 sk-circle"></div>
          </div>
      <span class="loading-txt">加载中...</span>
    </div>
    <div class="v-modal" v-show="state"></div>
 </div>       
</template>
<script>
export default {
  name: 'loading',
  data(){
    return {
      state: false
    }
  },
  watch: {
    'state': function(){
      console.log(Date.now() + '--watch--' + this.state)
    }
  }
}
</script>

loading.js

/**
 * example
 * import Loading from '../../components/loading/index.js'
 * Loadding(state) 
 * @params {booloean}    是否显示loading动画
 */


import Vue from 'vue'

const LoadingConstructor = Vue.extend(require('./loading.vue'))

let loadingPool = []

let returnAnInstance = instance => {
    if (instance) {
        loadingPool.push(instance)
    }
}

LoadingConstructor.prototype.load = function(flag) {
    this.state = flag
    console.log(Date.now() + '--load--' + this.state)
    !this.state && this.$el.parentNode.removeChild(this.$el)
    returnAnInstance(this)
}

let getAnInstance = () => {
    if (loadingPool.length > 0) {
        let instance = loadingPool[0];
        loadingPool.splice(0, 1);
        return instance
    }
    return new LoadingConstructor({
        el: document.createElement('div')
    })
}

let Loading = (flag) => {
    let instance = getAnInstance()
    document.body.appendChild(instance.$el)
    instance.$nextTick(function() {
        instance.load(flag)
    })
    return instance
}

export default Loading

这样调用无法生效:
Loading(true)
Loading(false)
log信息:
1492597864195--load--true
221492597864196--load--false
331492597864198--watch--true(这里只监测到一次true,没有监测到false)

这样调用生效:
Loading(true)
setTimeout(()=>{
Loading(false)
},0)
log信息:
1492597998400--load--true
331492597998405--watch--true
1492598001307--load--false
1492598001307--watch--false

为毛异步就可以呢?猜想和vue组件异步更新DOM有关,但是这题症结在哪里,该如何改呢?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文