autoResize.js 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. import { debounce, observerDomResize } from '../util/index'
  2. export default {
  3. data() {
  4. return {
  5. dom: '',
  6. width: 0,
  7. height: 0,
  8. debounceInitWHFun: '',
  9. domObserver: ''
  10. }
  11. },
  12. methods: {
  13. async autoResizeMixinInit() {
  14. const { initWH, getDebounceInitWHFun, bindDomResizeCallback, afterAutoResizeMixinInit } = this
  15. await initWH(false)
  16. getDebounceInitWHFun()
  17. bindDomResizeCallback()
  18. if (typeof afterAutoResizeMixinInit === 'function') afterAutoResizeMixinInit()
  19. },
  20. initWH(resize = true) {
  21. const { $nextTick, $refs, ref, onResize } = this
  22. return new Promise((resolve) => {
  23. $nextTick((_) => {
  24. const dom = (this.dom = $refs[ref])
  25. // this.width = dom ? dom.clientWidth : 0
  26. // this.height = dom ? dom.clientHeight : 0
  27. this.width = window.innerWidth
  28. this.height = window.innerHeight
  29. if (!dom) {
  30. console.warn('DataV: Failed to get dom node, component rendering may be abnormal!')
  31. } else if (!this.width || !this.height) {
  32. console.warn('DataV: Component width or height is 0px, rendering abnormality may occur!')
  33. }
  34. if (typeof onResize === 'function' && resize) onResize()
  35. resolve()
  36. })
  37. })
  38. },
  39. getDebounceInitWHFun() {
  40. const { initWH } = this
  41. this.debounceInitWHFun = debounce(100, initWH)
  42. },
  43. bindDomResizeCallback() {
  44. const { dom, debounceInitWHFun } = this
  45. this.domObserver = observerDomResize(dom, debounceInitWHFun)
  46. window.addEventListener('resize', debounceInitWHFun)
  47. },
  48. unbindDomResizeCallback() {
  49. let { domObserver, debounceInitWHFun } = this
  50. if (!domObserver) return
  51. domObserver.disconnect()
  52. domObserver.takeRecords()
  53. domObserver = null
  54. window.removeEventListener('resize', debounceInitWHFun)
  55. }
  56. },
  57. mounted() {
  58. const { autoResizeMixinInit } = this
  59. autoResizeMixinInit()
  60. },
  61. beforeDestroy() {
  62. const { unbindDomResizeCallback } = this
  63. unbindDomResizeCallback()
  64. }
  65. }