vue.js

关注公众号 jb51net

关闭
首页 > 网络编程 > JavaScript > javascript类库 > vue.js > vue加载动画element ui V-loading属性

vue加载动画element ui V-loading属性的踩坑记录

作者:刘大气

这篇文章主要介绍了vue加载动画element ui V-loading属性方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

vue加载动画element ui V-loading属性

根据需求,由预览按钮打开弹窗,且弹窗需要渲染的数据较多,渲染的速度比较慢,所以要加一个加载中的效果,element ui的 v-loading属性就正好可以解决这一需求,但是当加入这一属性之后发现,是实现了加载功能,但是加载并不能自己判断何时停下,又不像其他页面需要页面刷新的时候出现加载动画效果,所以给diglog弹窗一个加载动画,但如何判断他何时停下呢

 想了好几种办法最后想通了,在点击弹窗的时候先给一个加载属性为true,让他加载,然后等请求接口赋值以后,再给他一个属性为false关掉加载,就可以了

element-ui v-loading 指令 instance.close()报错

解决 sentry issues 时看到一个这样的报错

TypeError: Cannot read properties of undefined (reading ‘close’)

报错的代码来自 element-plus 的 v-loading 指令, 在值变为 false 执行 close 函数时, 示例 instance 为空导致的问题

原因

页面是列表页, 每个列表项有一个展开加载数据的 v-loading, 代码给 v-loading 初始值传入了 undefined, 请求数据之前给 loading 做了个初始化, 将 loading 值初始为 false

v-loading="expendStepData[item.productOrderId]?.loading"

数据从 undefined 变成 false 触发了 v-loading 的 update, 因为值为 false, 所以 v-loading 执行了 close 操作, 因为 loading 的值从来没有是 true, 所以没有创建实例, 导致 instance 为 undefined, 所以执行 instance.close() 自然就报错了

element-plus loading 代码

const vLoading = {
  mounted(el, binding) {
    if (!!binding.value) {
      createInstance(el, binding);
    }
  },
  updated(el, binding) {
    const instance = el.instance;
    if (binding.oldValue !== binding.value) {
      if (binding.value) {
        createInstance(el, binding);
      } else {
        instance.close();
      }
    }
  },
  unmounted(el) {
    var _a;
    (_a = el == null ? void 0 : el.instance) == null ? void 0 : _a.close();
  }
};

初始值为 undefined 导致 mounted 的时候没有创建实例, 而值从 undefined 变为 false 时, 会触发 update, 导致执行 instance.close(), 这个时候 v-loading 的 instance 没有创建是一个 undefined

建议

v-loading 严格传入 boolean 值, 虽然大多数情况不会有问题, 即使像我这样的情况, 其实也不影响使用, 如果不是 sentry, 估计页没有发现这个问题, 但是能避免的问题还是要避免; 我的 element-plus 时候 2.x 版本的, 不知道 3.x 是否还有这个问题 

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文