autoResize.js 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  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(e => {
  24. const dom = this.dom = $refs[ref]
  25. this.width = dom.clientWidth
  26. this.height = dom.clientHeight
  27. if (typeof onResize === 'function' && resize) onResize()
  28. resolve()
  29. })
  30. })
  31. },
  32. getDebounceInitWHFun () {
  33. const { initWH } = this
  34. this.debounceInitWHFun = debounce(100, initWH)
  35. },
  36. bindDomResizeCallback () {
  37. const { dom, debounceInitWHFun } = this
  38. this.domObserver = observerDomResize(dom, debounceInitWHFun)
  39. window.addEventListener('resize', debounceInitWHFun)
  40. },
  41. unbindDomResizeCallback () {
  42. let { domObserver, debounceInitWHFun } = this
  43. domObserver.disconnect()
  44. domObserver.takeRecords()
  45. domObserver = null
  46. window.removeEventListener('resize', debounceInitWHFun)
  47. }
  48. },
  49. mounted () {
  50. const { autoResizeMixinInit } = this
  51. autoResizeMixinInit()
  52. },
  53. beforeDestroy () {
  54. const { unbindDomResizeCallback } = this
  55. unbindDomResizeCallback()
  56. }
  57. }