DiagnosePicker.vue 2.49 KB
<template>
    <van-popup :show="show" position="bottom"
        :teleport="teleport"
        class="diagnose-picker">
        <van-picker
            title="请选择"
            :columns="array"
            :columns-field-names="fieldNames"
            v-model="innerValue"
            @confirm="onConfirm"
            @cancel="onCancel"
        >
            <template #columns-top>
                <div class="px-3">
                    <van-field v-model="searchValue" placeholder="请输入" clearable maxlength="100"/>
                </div>
            </template>
        </van-picker>
    </van-popup>
</template>

<script>
import  { queryDiseaseCode } from '@/api/doctor/disease.js'

export default {
    props: {
        show: Boolean,
        value: [String, Number],
        fieldNames: {
            type: Object,
            default: () => {
                return {text: 'name', value: 'icdCode'}
            }
        },
        // 疾病类型
        diseaseType: [String, Number],
        teleport: [String, Element]
    },
    emits: ['update:show', 'update:value', 'change'],
    data() {
        return {
            innerValue: undefined,
            searchValue: '',
            diagnoseNameList: []
        }
    },
    computed: {
        array() {
            const array = this.diagnoseNameList || []
            return array.filter(e => e.name.startsWith(this.searchValue))
        }
    },
    methods: {
        load() {
            queryDiseaseCode({ diseaseType: this.diseaseType }).then(res => {
                const result = []
                for (let item of res.data) {
                    item.name = item.diseaseName + '(' + item.icdCode + ')'
                    result.push(item)
                }
                this.diagnoseNameList = result
            })
        },
        onConfirm({ selectedValues, selectedOptions }) {
            this.$emit('update:value', selectedValues[0])
            this.$emit('change', selectedOptions[0] || {})
            this.$emit('update:show', false)
            this.searchValue = ''
        },
        onCancel() {
            this.$emit('update:show', false)
        }
    },
    watch: {
        value: {
            handler(value) {
                if (value == null) return
                this.innerValue = [value]
            },
            immediate: true
        },
        diseaseType: {
            handler() {
                this.load()
            },
            immediate: true
        }
    }
}
</script>

<style lang="less" scoped>

</style>