index.vue 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. <template>
  2. <div
  3. ref="selfDomRef"
  4. class="fetch-more-block"
  5. >
  6. <template v-if="props.isFetching">
  7. <slot name="fetching">
  8. <div>{{ TUITranslateService.t("TUIChat.正在加载") }}</div>
  9. </slot>
  10. </template>
  11. <template v-else>
  12. <slot name="fetchEnd">
  13. <div>{{ TUITranslateService.t("TUIChat.加载结束") }}</div>
  14. </slot>
  15. </template>
  16. </div>
  17. </template>
  18. <script setup lang="ts">
  19. import { onMounted, onUnmounted, ref, watch, getCurrentInstance, withDefaults } from '../../../adapter-vue';
  20. import { TUITranslateService } from '@tencentcloud/chat-uikit-engine';
  21. import { isUniFrameWork } from '../../../utils/env';
  22. interface IProps {
  23. isFetching: boolean;
  24. isTerminateObserve?: boolean;
  25. }
  26. interface IEmits {
  27. (e: 'onExposed'): void;
  28. }
  29. const emits = defineEmits<IEmits>();
  30. const props = withDefaults(defineProps<IProps>(), {
  31. isFetching: false,
  32. isTerminateObserve: false,
  33. });
  34. let observer: unknown = null;
  35. const selfDomRef = ref();
  36. const thisInstance = getCurrentInstance()?.proxy || getCurrentInstance();
  37. onMounted(() => {
  38. if (props.isTerminateObserve) {
  39. return;
  40. }
  41. if (!isUniFrameWork) {
  42. observer = new IntersectionObserver(([entry]) => {
  43. if (entry.isIntersecting) {
  44. emits('onExposed');
  45. }
  46. }, {
  47. threshold: 1.0,
  48. });
  49. if (selfDomRef.value) {
  50. (observer as IntersectionObserver).observe(selfDomRef.value);
  51. }
  52. } else {
  53. observer = uni.createIntersectionObserver(thisInstance).relativeToViewport();
  54. (observer as any).observe('.fetch-more-block', () => {
  55. emits('onExposed');
  56. });
  57. }
  58. });
  59. onUnmounted(() => {
  60. if (observer) {
  61. (observer as IntersectionObserver).disconnect();
  62. observer = null;
  63. }
  64. });
  65. watch(() => props.isTerminateObserve, (isTerminateObserve: boolean) => {
  66. if (!observer) {
  67. return;
  68. }
  69. if (isTerminateObserve) {
  70. (observer as IntersectionObserver).disconnect();
  71. } else if (selfDomRef.value) {
  72. (observer as IntersectionObserver).disconnect();
  73. if (!isUniFrameWork) {
  74. (observer as IntersectionObserver).observe(selfDomRef.value);
  75. } else {
  76. (observer as any).observe('.fetch-more-block', () => {
  77. emits('onExposed');
  78. });
  79. }
  80. }
  81. });
  82. </script>
  83. <style scoped lang="scss">
  84. .fetch-more-block {
  85. color: #999;
  86. }
  87. </style>