Skip to content
This repository was archived by the owner on Nov 5, 2023. It is now read-only.

Commit 464d804

Browse files
feat: support smooth and auto scrollBehavior prop (#220)
Co-authored-by: Luca Ban <mesqueeb@users.noreply.github.com>
1 parent 5529eee commit 464d804

File tree

6 files changed

+57
-9
lines changed

6 files changed

+57
-9
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ npm install vue-virtual-scroll-grid
3636
| `pageProviderDebounceTime` | Debounce window in milliseconds on the calls to `pageProvider` | `number` | Optional, an integer greater than or equal to 0 |
3737
| `pageSize` | The number of items in a page from the item provider (e.g. a backend API) | `number` | Required, an integer greater than or equal to 1 |
3838
| `scrollTo` | Scroll to a specific item by index | `number` | Optional, an integer from 0 to the `length` prop - 1 |
39+
| `scrollBehavior` | The behavior of `scrollTo`. Default value is `smooth` | `smooth` | `auto` | Optional, a string to be `smooth` or `auto` |
3940

4041
Example:
4142

package-lock.json

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/Grid.vue

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,12 @@ export default defineComponent({
8585
required: false,
8686
validator: (value: number) => Number.isInteger(value) && value >= 0,
8787
},
88+
scrollBehavior: {
89+
type: String as PropType<"smooth" | "auto">,
90+
required: false,
91+
default: "smooth",
92+
validator: (value: string) => ["smooth", "auto"].includes(value)
93+
}
8894
},
8995
setup(props) {
9096
// template refs
@@ -114,7 +120,7 @@ export default defineComponent({
114120
onUpdated(
115121
once(() => {
116122
scrollAction$.subscribe(([el, top]: ScrollAction) => {
117-
el.scrollTo({ top, behavior: "smooth" });
123+
el.scrollTo({ top, behavior: props.scrollBehavior });
118124
});
119125
})
120126
);

src/demo/App.vue

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
:pageProvider="pageProvider"
88
:pageProviderDebounceTime="0"
99
:scrollTo="scrollTo"
10+
:scrollBehavior="scrollBehavior"
1011
:class="$style.grid"
1112
>
1213
<template v-slot:probe>
@@ -44,7 +45,7 @@ import Grid from "../Grid.vue";
4445
import Header from "./Header.vue";
4546
import Control from "./Control.vue";
4647
import ProductItem from "./ProductItem.vue";
47-
import { length, pageSize, pageProvider, scrollTo } from "./store";
48+
import { length, pageSize, pageProvider, scrollTo, scrollBehavior } from "./store";
4849
4950
export default defineComponent({
5051
name: "App",
@@ -54,6 +55,7 @@ export default defineComponent({
5455
pageSize,
5556
pageProvider,
5657
scrollTo,
58+
scrollBehavior,
5759
}),
5860
});
5961
</script>

src/demo/Control.vue

Lines changed: 44 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -79,17 +79,46 @@
7979
:class="$style.number"
8080
/>
8181
</div>
82+
83+
<div :class="$style.scrollBehaviorProvider">
84+
<p :class="$style.scrollBehavior">Scroll Behavior:</p>
85+
86+
<div :class="$style.radioList">
87+
<label for="smooth" :class="$style.radioLabel">
88+
<input
89+
type="radio"
90+
id="smooth"
91+
value="smooth"
92+
v-model="scrollBehavior"
93+
:class="$style.radio"
94+
/>
95+
Smooth
96+
</label>
97+
98+
<label for="auto" :class="$style.radioLabel">
99+
<input
100+
type="radio"
101+
id="auto"
102+
value="auto"
103+
v-model="scrollBehavior"
104+
:class="$style.radio"
105+
/>
106+
Auto
107+
</label>
108+
</div>
109+
</div>
110+
82111
</div>
83112
</template>
84113

85114
<script lang="ts">
86115
import { defineComponent } from "vue";
87-
import { collection, length, pageSize, scrollTo } from "./store";
116+
import { collection, length, pageSize, scrollTo, scrollBehavior } from "./store";
88117
89118
export default defineComponent({
90119
name: "Control",
91120
setup: () => {
92-
return { length, pageSize, collection, scrollTo };
121+
return { length, pageSize, collection, scrollTo, scrollBehavior };
93122
},
94123
});
95124
</script>
@@ -109,6 +138,7 @@ export default defineComponent({
109138
"length pageProvider" auto
110139
"pageSize pageProvider" auto
111140
"scrollTo pageProvider" auto
141+
"scrollBehavior pageProvider" auto
112142
/ 2fr 1fr;
113143
place-items: center stretch;
114144
grid-gap: 1.5rem;
@@ -134,6 +164,14 @@ export default defineComponent({
134164
grid-area: scrollTo;
135165
}
136166
167+
.scrollBehaviorProvider {
168+
grid-area: scrollBehavior;
169+
place-self: stretch;
170+
display: flex;
171+
flex-flow: column nowrap;
172+
justify-content: flex-start;
173+
}
174+
137175
.radioList {
138176
flex: 1 1 auto;
139177
display: flex;
@@ -171,19 +209,19 @@ export default defineComponent({
171209
font-weight: 700;
172210
}
173211
174-
.category {
212+
.category, .scrollBehavior {
175213
font-weight: 700;
176214
margin-bottom: 1rem;
177215
}
178216
179217
@media (min-width: 760px) {
180218
.root {
181219
grid-template:
182-
"length pageSize pageProvider scrollTo" auto
183-
/ 2fr 2fr 2fr 1fr;
220+
"length pageSize pageProvider scrollTo scrollBehavior" auto
221+
/ 2fr 2fr 2fr 1fr 1fr;
184222
}
185223
186-
.category {
224+
.category, .scrollBehavior {
187225
margin-bottom: 0.5rem;
188226
}
189227

src/demo/store.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { curry, prop } from "ramda";
55
export const length = ref<number>(1000);
66
export const pageSize = ref<number>(40);
77
export const scrollTo = ref<number | undefined>(undefined);
8+
export const scrollBehavior = ref<string>("smooth");
89

910
export type Collection = "" | "all-mens" | "womens-view-all";
1011
export const collection = ref<Collection>("");

0 commit comments

Comments
 (0)