【发布时间】:2021-12-29 15:38:27
【问题描述】:
我有一个可滚动的列表,我可以从中选择多个项目。我想以编程方式实现每次更改搜索输入时滚动到列表顶部的方法。
期望的行为:例如;当我在搜索列表中输入“b”并向下滚动时,如果我再次输入“e”,我希望它滚动到最顶部
这是一个显示我想做的代码示例,我尝试了两种不同的方法。我在下面的代码中尝试了两种不同的方法,我利用了 html Element 的 scrollTop 功能和 vuetify 的 goTo 功能,但它们都不起作用。
代码演示->https://www.codeply.com/p/ZGBNEHW7YS
如果演示过期,实际代码;
<div id="app">
<v-app>
<v-main class="py-3 px-5">
<h1 class="teal--text">AutoComplete Infinite Scroll Example</h1>
<v-autocomplete
id="autoComplete"
ref="autoComplete"
v-model="selected"
:items="beers"
item-text="name"
item-value="id"
:search-input.sync="search"
label="Search the beers.."
return-object
multiple
autocomplete="off"
>
<template v-slot:append-item>
<div v-intersect="onIntersect" class="pa-4 teal--text">
Loading more items ...
</div>
</template>
</v-autocomplete>
</v-main>
</v-app>
new Vue({
el: '#app',
vuetify: new Vuetify(),
data() {
return {
search:'',
beers: [],
selected: null,
perPage: 30,
page: 1,
}
},
methods: {
getBeers() {
console.log('page', this.page)
const apiUrl = `https://api.punkapi.com/v2/beers?page=${this.page}&per_page=${this.perPage}`
axios.get(apiUrl)
.then(response => {
this.beers = [
...this.beers,
...response.data
]
})
},
onIntersect () {
console.log('load more...')
this.page += 1
this.getBeers()
},
},
watch:{
search:function(){
//first method
let myId=document.getElementById('autoComplete')
if(myId){
myId.scrollTop = 0
}
//second method with ref and vuetify goto
this.$nextTick(() => {
this.$vuetify.goTo(this.$refs.autoComplete)
})
}
},
created() {
this.getBeers()
}
})
【问题讨论】:
-
您需要获取该项目的位置并将可滚动容器滚动到该坐标 e。 g
scrollableContainer.scrollTop = myIdElement.offsetTop -
我已经更新了我的代码来做到这一点,但它仍然没有工作。 @zergski
-
问题是当我搜索新的@zergski 时元素不存在。如果你想看看,我已经更新了演示中的代码
-
您需要获取正确的 DOM 元素引用。对于可滚动列表容器和搜索项目。我使用的名称只是示例名称
标签: javascript vue.js scroll vuetify.js