mirror of
https://github.com/nagisa77/OpenIsle.git
synced 2026-02-06 23:21:16 +08:00
fix: keep dropdown at bottom after loading more
This commit is contained in:
@@ -52,6 +52,7 @@
|
|||||||
v-if="open && !isMobile && (loading || filteredOptions.length > 0 || showSearch)"
|
v-if="open && !isMobile && (loading || filteredOptions.length > 0 || showSearch)"
|
||||||
:class="['dropdown-menu', menuClass]"
|
:class="['dropdown-menu', menuClass]"
|
||||||
v-click-outside="close"
|
v-click-outside="close"
|
||||||
|
ref="menuRef"
|
||||||
>
|
>
|
||||||
<div v-if="showSearch" class="dropdown-search">
|
<div v-if="showSearch" class="dropdown-search">
|
||||||
<search-icon class="search-icon" />
|
<search-icon class="search-icon" />
|
||||||
@@ -89,7 +90,7 @@
|
|||||||
<next class="back-icon" @click="close" />
|
<next class="back-icon" @click="close" />
|
||||||
<span class="mobile-title">{{ placeholder }}</span>
|
<span class="mobile-title">{{ placeholder }}</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="dropdown-mobile-menu">
|
<div class="dropdown-mobile-menu" ref="mobileMenuRef">
|
||||||
<div v-if="showSearch" class="dropdown-search">
|
<div v-if="showSearch" class="dropdown-search">
|
||||||
<search-icon class="search-icon" />
|
<search-icon class="search-icon" />
|
||||||
<input type="text" v-model="search" placeholder="搜索" />
|
<input type="text" v-model="search" placeholder="搜索" />
|
||||||
@@ -153,6 +154,8 @@ export default {
|
|||||||
const loaded = ref(false)
|
const loaded = ref(false)
|
||||||
const loading = ref(false)
|
const loading = ref(false)
|
||||||
const wrapper = ref(null)
|
const wrapper = ref(null)
|
||||||
|
const menuRef = ref(null)
|
||||||
|
const mobileMenuRef = ref(null)
|
||||||
const isMobile = useIsMobile()
|
const isMobile = useIsMobile()
|
||||||
|
|
||||||
const toggle = () => {
|
const toggle = () => {
|
||||||
@@ -202,6 +205,13 @@ export default {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const scrollToBottom = () => {
|
||||||
|
const el = isMobile.value ? mobileMenuRef.value : menuRef.value
|
||||||
|
if (el) {
|
||||||
|
el.scrollTop = el.scrollHeight
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const reload = async () => {
|
const reload = async () => {
|
||||||
await loadOptions(props.remote ? search.value : undefined)
|
await loadOptions(props.remote ? search.value : undefined)
|
||||||
}
|
}
|
||||||
@@ -255,7 +265,7 @@ export default {
|
|||||||
return /^https?:\/\//.test(icon) || icon.startsWith('/')
|
return /^https?:\/\//.test(icon) || icon.startsWith('/')
|
||||||
}
|
}
|
||||||
|
|
||||||
expose({ toggle, close, reload })
|
expose({ toggle, close, reload, scrollToBottom })
|
||||||
|
|
||||||
return {
|
return {
|
||||||
open,
|
open,
|
||||||
@@ -265,6 +275,8 @@ export default {
|
|||||||
search,
|
search,
|
||||||
filteredOptions,
|
filteredOptions,
|
||||||
wrapper,
|
wrapper,
|
||||||
|
menuRef,
|
||||||
|
mobileMenuRef,
|
||||||
selectedLabels,
|
selectedLabels,
|
||||||
isSelected,
|
isSelected,
|
||||||
loading,
|
loading,
|
||||||
|
|||||||
@@ -42,7 +42,7 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import { computed, reactive, ref, watch } from 'vue'
|
import { computed, reactive, ref, watch, nextTick } from 'vue'
|
||||||
import { toast } from '~/main'
|
import { toast } from '~/main'
|
||||||
import Dropdown from '~/components/Dropdown.vue'
|
import Dropdown from '~/components/Dropdown.vue'
|
||||||
const config = useRuntimeConfig()
|
const config = useRuntimeConfig()
|
||||||
@@ -164,6 +164,8 @@ const loadMoreRemoteTags = async () => {
|
|||||||
loadMoreRequested.value = true
|
loadMoreRequested.value = true
|
||||||
try {
|
try {
|
||||||
await dropdownRef.value?.reload()
|
await dropdownRef.value?.reload()
|
||||||
|
await nextTick()
|
||||||
|
dropdownRef.value?.scrollToBottom?.()
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.error('Failed to load more tags', e)
|
console.error('Failed to load more tags', e)
|
||||||
loadMoreRequested.value = false
|
loadMoreRequested.value = false
|
||||||
|
|||||||
Reference in New Issue
Block a user