index.vue 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. <template>
  2. <div class="mtp-table-scroll">
  3. <slot name="header"></slot>
  4. <div class="mtp-table-scroll__container" ref="scrollElement">
  5. <slot :scroll="scroll"></slot>
  6. </div>
  7. <slot name="footer"></slot>
  8. </div>
  9. </template>
  10. <script lang="ts">
  11. import { defineComponent, ref, onMounted } from 'vue';
  12. import { debounce } from '@/utils/time';
  13. import { v4 } from 'uuid';
  14. import ResizeObserver from 'resize-observer-polyfill';
  15. export default defineComponent({
  16. emits: ['ready'],
  17. props: {
  18. // 表头高度
  19. top: {
  20. type: Number,
  21. default: 27,
  22. }
  23. },
  24. setup(props, { emit }) {
  25. // 表格滚动区域宽高
  26. const scroll = ref({
  27. x: '100%',
  28. y: 'auto',
  29. })
  30. const uuid = v4();
  31. const scrollElement = ref<HTMLDivElement>();
  32. onMounted(() => {
  33. // 监听元素变化
  34. const resizeObserver = new ResizeObserver((entries: ResizeObserverEntry[]) => {
  35. debounce(() => {
  36. for (const entry of entries) {
  37. const { height } = entry.contentRect;
  38. scroll.value.y = (height - props.top) + 'px';
  39. }
  40. }, 50, uuid);
  41. });
  42. if (scrollElement.value) {
  43. resizeObserver.observe(scrollElement.value);
  44. }
  45. emit('ready');
  46. })
  47. return {
  48. scroll,
  49. scrollElement,
  50. }
  51. },
  52. })
  53. </script>
  54. <style lang="less">
  55. @import './index.less';
  56. </style>