Vux: Après la mise à niveau vers la version 2.7.7, le composant de chargement est instable

Créé le 22 janv. 2018  ·  5Commentaires  ·  Source: airyland/vux

Après la mise à niveau vers la version 2.7.7, il s'avère que lors du changement d'itinéraire, le composant de chargement aura une certaine chance de ne pas disparaître.Consultez l'entrepôt officiel :
https://github.com/airyland/vux/commit/866a76302711e0198b69f3815196d0b51afef11c
Il s'avère que le composant a été mis à jour, que le paramètre de délai a été ajouté et qu'il peut y avoir un bogue.

Code associé :

Vue.http.interceptors.push((request, next) => {
  Vue.$vux.loading.show({
    text: 'Loading',
  });

  // 登录成功后将后台返回的TOKEN在本地存下来,每次请求从localStorage中拿到存储的TOKEN值
  const TOKEN = localStorage.getItem('cw_token');
  if (TOKEN) {
    // 如果请求时TOKEN存在,就为每次请求的headers中设置好TOKEN,后台根据headers中的TOKEN判断是否放行
    request.headers.set('token', TOKEN);
  }
  next((response) => {
    Vue.$vux.loading.hide();

    if (response.status == 200 && response.body.code == 10002) {
      localStorage.removeItem('cw_token');
      localStorage.removeItem('cw_user');
      app.$vux.toast.show({
        text: '会话已过期,请重新登录',
        time: 1000,
      })
      setTimeout("location.href='/'", 1000);
    }
    return response;
  });
});

Commentaire le plus utile

Hum, c'est réglé

Tous les 5 commentaires

Le bogue a été trouvé. Avant que le délai ne soit affecté à setTimeout, il n'y a pas de clearTimeout manuel. Modifiez le code source :

    const loading = {
      show (options = {}) {
        // destroy watcher
        watcher && watcher()
        if (typeof options === 'string') {
          $vm.text = options
        } else if (typeof options === 'object') {
          mergeOptions($vm, options)
        }
        if (typeof options === 'object' && options.onShow || options.onHide) {
          watcher = $vm.$watch('show', (val) => {
            val && options.onShow && options.onShow($vm)
            val === false && options.onHide && options.onHide($vm)
          })
        }
        clearTimeout(delayTime); // 避免在拦截器使用时,同时发起多个请求,delayTime重新赋值,macro队列引起的$vm.show = true滞后(后于hide()执行之后,所以loading一直存在)
        delayTime = setTimeout(() => {
          $vm.show = true
        }, options.delay || 0)
      },
      hide () {
        if (delayTime) {
          clearTimeout(delayTime)
          delayTime = null
        }
        $vm.show = false
      }
    }

PS : Le document officiel de l'API n'ajoute pas de description du paramètre de délai, j'espère l'ajouter à temps.

Corrigé, merci

@lichunqiang a également un petit problème. Après avoir mis à jour la description du paramètre de délai sur le site officiel, le style de description de chargement est en panne.
https://vux.li/#/zh -CN/components?id=loading

Hum, c'est réglé

efficace.

Cette page vous a été utile?
0 / 5 - 0 notes