<script lang="ts" setup name="AreaSelectTree">
import { defineExpose, reactive, ref } from 'vue'
import type { IlistQuerySelectTree } from './area-interface'
import { getAreaTree } from '@/api/system/area'
const emits = defineEmits(['selectDone'])
const dialogFormVisible = ref(false)
const tree = ref(null) as any
const defaultProps = {
label: 'name',
children: 'children',
isLeaf: 'leaf',
}
const listQuery: IlistQuerySelectTree = reactive({
pid: '',
})
// 初始化对话框
const initDialog = () => {
dialogFormVisible.value = true
}
defineExpose({
initDialog,
})
// 加载数据
const loadNode = (node: any, resolve: any) => {
if (node.data && node.data.id) {
listQuery.pid = node.data.id
}
getAreaTree(listQuery).then((response) => {
const data = response.data
resolve(data)
})
}
// 确认选择后的操作,传给父组件并关闭弹窗
const confirmSelect = () => {
const node = tree.value.getCurrentNode()
dialogFormVisible.value = false
emits('selectDone', node)
}
const cancel = () => {
dialogFormVisible.value = false
}
</script>
<template>
<el-dialog v-model="dialogFormVisible" custom-class="area-select-dialog" title="选择区域" append-to-body>
<el-scrollbar style="height: 400px;">
<el-tree
ref="tree"
:expand-on-click-node="false"
:props="defaultProps"
:load="loadNode"
node-key="id"
lazy
/>
</el-scrollbar>
<template #footer>
<div class="dialog-footer">
<el-button type="primary" @click="confirmSelect">
确定
</el-button>
<el-button @click="cancel">
取消
</el-button>
</div>
</template>
</el-dialog>
</template>
<style lang="scss">
.area-select-dialog {
width: 400px;
}
</style>