v-el-btn.ts 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. import sleep from "../utils/sleep";
  2. const loadingName: string = 'xc-loading'
  3. const VElBtn = {
  4. created(el: HTMLHtmlElement, binding, vnode, prevVnode) {
  5. /**
  6. * 这里有个 bug 如果使用了 v-loading 的话有问题
  7. * 这个函数一定要是 promise 函数
  8. * 如果这个函数需要参数的话,需要:
  9. * <el-button v-el-btn="{
  10. * func : a ,
  11. * value: true
  12. * }">测试 </el-button> 这样写
  13. *
  14. * 无参函数:
  15. * <el-button v-el-btn="a">测试</el-button>
  16. *
  17. * @param ev 事件
  18. */
  19. el.addEventListener('click', async (ev: Event) => {
  20. ev.stopPropagation();
  21. let startTime: Date = new Date();
  22. async function finallyFunc() {
  23. let endTime = new Date()
  24. if (endTime.getTime() - startTime.getTime() < 1000) {
  25. await sleep(500)
  26. }
  27. el.setAttribute(loadingName, 'false')
  28. vnode.ref.i.props.loading = false
  29. }
  30. vnode.ref.i.props.loading = true
  31. el.setAttribute(loadingName, 'true')
  32. try {
  33. await binding.value.func ? binding.value.func(binding.value.value) : binding.value()
  34. } finally {
  35. await finallyFunc()
  36. }
  37. });
  38. },
  39. updated(el: HTMLHtmlElement, binding, vnode, prevVnode) {
  40. let loading: string | boolean = el.getAttribute(loadingName)
  41. if (loading) {
  42. loading = loading === 'true'
  43. vnode.ref.i.props.loading = loading
  44. }
  45. },
  46. }
  47. export default VElBtn