table.js 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. // 设置表格高度
  2. const doResize = async (el, binding, vnode) => {
  3. // 获取表格Dom对象
  4. const {
  5. componentInstance: $table
  6. } = await vnode
  7. // 获取调用传递过来的数据
  8. const {
  9. value
  10. } = binding
  11. if (!$table.height) {
  12. throw new Error("使用v-table指令,el-table需设置height,例如: height='0'")
  13. }
  14. // 获取距底部距离(用于展示页码等信息)
  15. const bottomOffset = value || 100
  16. if (!$table) return
  17. // 计算列表高度并设置
  18. let height = window.innerHeight - el.getBoundingClientRect().top - bottomOffset
  19. height = height + 32 // 针对没有底部适配
  20. $table.layout.setHeight(height)
  21. $table.doLayout()
  22. }
  23. // 节流函数
  24. const throttle = (fn) => {
  25. let flag = null
  26. return function () {
  27. if (!flag) {
  28. flag = setTimeout(() => {
  29. fn()
  30. flag = null
  31. }
  32. , 500)
  33. }
  34. }
  35. }
  36. export default {
  37. // 初始化设置
  38. bind (el, binding, vnode) {
  39. // 设置resize监听方法
  40. el.resizeListener = async () => {
  41. await doResize(el, binding, vnode)
  42. }
  43. // 绑定监听方法
  44. window.addEventListener('resize', throttle(el.resizeListener))
  45. },
  46. // 绑定默认高度
  47. async inserted (el, binding, vnode) {
  48. await doResize(el, binding, vnode)
  49. },
  50. // 更新数据时延时绑定高度
  51. async componentUpdated (el, binding, vnode) {
  52. await setTimeout(() => {
  53. doResize(el, binding, vnode)
  54. }, 500)
  55. },
  56. // 销毁时设置
  57. unbind (el) {
  58. // 移除resize监听
  59. window.removeEventListener('resize', throttle(el.resizeListener))
  60. }
  61. }