ykt-team-wxapp/pages/library/diagnosis-list.vue
2026-01-20 19:36:49 +08:00

159 lines
3.5 KiB
Vue

<template>
<full-page>
<template #header>
<view class="page-item border-bottom bg-white">
<input class="search-input" placeholder-style="font-size:28rpx" placeholder="请搜索名称" v-model="name"
@input="search" />
</view>
</template>
<view v-for="i in list" :key="i.label" class="search-item bg-white" @click="select(i.label)">
<view class="name">{{ i.label }}</view>
<icon class="icon-checked" :class="selectMap[i.label] ? '' : 'hidden'" type="success_no_circle" size="18" />
</view>
<template #footer>
<button-footer confirmText="确定" :showCancel="false" @confirm="confirm()" />
</template>
</full-page>
</template>
<script setup>
import { computed, ref } from 'vue';
import { storeToRefs } from 'pinia';
import { onLoad } from "@dcloudio/uni-app";
import api from '@/utils/api';
import { remove, get } from '@/utils/cache';
import useDebounce from '@/utils/useDebounce';
import { toast } from '@/utils/widget';
import ButtonFooter from '@/components/button-footer.vue';
import FullPage from '@/components/full-page.vue';
const name = ref('');
const list = ref([]);
const page = ref(1);
const pageSize = ref(30);
const more = ref(false);
const selections = ref([]);
const eventName = ref('')
const selectMap = computed(() => selections.value.reduce((val, i) => {
i && (val[i] = i);
return val
}, {}))
const search = useDebounce(() => {
page.value = 1;
getList()
})
function confirm() {
if (selections.value.length) {
uni.$emit(eventName.value, selections.value);
uni.navigateBack()
} else {
toast('请选择疾病')
}
}
function select(label) {
if (selections.value.includes(label)) {
selections.value = selections.value.filter(i => i !== label)
} else {
selections.value.push(label)
}
}
async function getList() {
const res = await api('getPageDisease', { name: name.value.trim(), page: page.value, pageSize: pageSize.value });
const diseases = res && Array.isArray(res.list) ? res.list.map(i => ({
label: i.diseaseName,
value: i.diseaseName
})).filter(i => i.label !== name.value.trim()) : [];
const pages = res && res.pages ? res.pages : 0;
more.value = pages > page.value;
if (page.value === 1) {
const data = name.value.trim() ? [{
label: name.value.trim(),
value: name.value.trim()
}] : [];
data.push(...diseases);
list.value = data
} else {
list.value = [...list.value, ...diseases];
}
}
onLoad(options => {
eventName.value = options.eventName;
const data = get('diagnosis-list-selections');
selections.value = Array.isArray(data) ? data : [];
remove('diagnosis-list-selections');
if (selections.value.length) {
list.value = selections.value.map(i => ({
label: i,
value: i
}))
} else {
getList()
}
})
</script>
<style scoped lang="scss">
.hidden {
opacity: 0;
}
.border-bottom {
border-bottom: 1px solid #eee;
}
.border-top {
border-top: 1px solid #eee;
}
.list-page {
display: flex;
flex-direction: column;
height: 100%;
height: 100vh;
}
.search-input {
border: 1px solid #eee;
padding: 16rpx 20rpx;
border-radius: 12rpx;
font-size: 28rpx;
}
.scroll-wrapper {
position: relative;
flex-grow: 1;
}
.list-scroll {
position: absolute;
inset: 0;
}
.search-item {
display: flex;
justify-content: space-between;
align-items: center;
padding: 20rpx 30rpx;
border-bottom: 1px solid #eee;
}
.icon-checked {
flex-shrink: 0;
}
.name {
flex-grow: 1;
margin-right: 20rpx;
font-size: 28rpx;
}
.page-item {
flex-shrink: 0;
padding: 30rpx;
}
</style>