Skip to content

Commit 9043f75

Browse files
committed
update(src): add distance prop
1 parent 92d0b5f commit 9043f75

File tree

2 files changed

+17
-16
lines changed

2 files changed

+17
-16
lines changed

src/components/InfiniteLoading.vue

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,21 +15,23 @@ const emit = defineEmits(["infinite"]);
1515
const props = defineProps({
1616
top: { type: Boolean, required: false },
1717
target: { type: [String, Boolean], required: false },
18+
distance: { type: Number, required: false, default: 0 },
1819
identifier: { required: false },
1920
firstLoad: { type: Boolean, required: false, default: true },
2021
slots: { type: Object, required: false },
2122
});
2223
2324
const infiniteLoading = ref(null);
2425
const state = ref("ready");
25-
const { top, slots, firstLoad, target } = props;
26+
const { top, slots, firstLoad, target, distance } = props;
2627
const { identifier } = toRefs(props);
2728
2829
const params = {
2930
infiniteLoading,
3031
target,
3132
top,
3233
firstLoad,
34+
distance,
3335
emit: initEmitter(emit, stateHandler(state)),
3436
parentEl: null,
3537
};
@@ -71,10 +73,10 @@ onUnmounted(() => {
7173
<slot v-if="state == 'complete'" name="complete">
7274
<span> {{ slots?.complete || "No more results!" }} </span>
7375
</slot>
74-
<slot v-if="state == 'error'" name="error" :retry="params.emitInfiniteEvent">
76+
<slot v-if="state == 'error'" name="error" :retry="params.emit">
7577
<span class="state-error">
7678
<span>{{ slots?.error || "Oops something went wrong!" }}</span>
77-
<button class="retry" @click="params.emitInfiniteEvent">retry</button>
79+
<button class="retry" @click="params.emit">retry</button>
7880
</span>
7981
</slot>
8082
</div>

src/utils.js

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ const stateHandler = state => ({
1313
},
1414
});
1515

16-
let emit;
1716
const initEmitter = (emit, stateHandler) => {
1817
return () => {
1918
stateHandler.loading();
@@ -32,21 +31,21 @@ const getScrollHeight = el => {
3231
return el?.scrollHeight || document.documentElement.scrollHeight;
3332
};
3433

35-
let load = true;
36-
const intersect = entries => {
37-
const entry = entries[0];
38-
if (entry.isIntersecting) {
39-
if (load) emit();
40-
load = true;
41-
}
42-
};
43-
4434
let observer;
4535
const startObserver = params => {
4636
params.parentEl = document.querySelector(params.target) || null;
47-
emit = params.emit;
48-
observer = new IntersectionObserver(intersect, null);
49-
if (!params.firstLoad) load = false;
37+
let rootMargin = `0px 0px ${params.distance}px 0px`;
38+
if (params.top) rootMargin = `${params.distance}px 0px 0px 0px`;
39+
observer = new IntersectionObserver(
40+
entries => {
41+
const entry = entries[0];
42+
if (entry.isIntersecting) {
43+
if (params.firstLoad) params.emit();
44+
params.firstLoad = true;
45+
}
46+
},
47+
{ root: params.parentEl, rootMargin }
48+
);
5049
observer.observe(params.infiniteLoading.value);
5150
};
5251

0 commit comments

Comments
 (0)