gaoluyang
2026-06-24 bfdc0e0e6d5e47aa501f9b6fadd143d9c97cf00a
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
<script lang="ts" setup>
import { computed, onMounted, ref } from 'vue';
 
import { handleTree } from '../../../../../packages/utils/src';
 
import { TreeSelect } from 'ant-design-vue';
 
import { getCategoryList } from '#/api/mall/product/category';
 
/** 商品分类选择组件 */
defineOptions({ name: 'ProductCategorySelect' });
 
const props = defineProps({
  modelValue: {
    type: [Number, Array<number>],
    default: undefined,
  }, // 选中的 ID
  multiple: {
    type: Boolean,
    default: false,
  }, // 是否多选
  parentId: {
    type: Number,
    default: undefined,
  }, // 上级品类的编号
});
 
/** 分类选择 */
const emit = defineEmits(['update:modelValue']);
 
const categoryList = ref<any[]>([]); // 分类树
 
/** 选中的分类 ID */
const selectCategoryId = computed({
  get: () => {
    return props.modelValue;
  },
  set: (val: number | number[]) => {
    emit('update:modelValue', val);
  },
});
 
/** 初始化 */
onMounted(async () => {
  const data = await getCategoryList({
    parentId: props.parentId,
  });
  categoryList.value = handleTree(data, 'id', 'parentId');
});
</script>
<template>
  <TreeSelect
    v-model:value="selectCategoryId"
    :tree-data="categoryList"
    :field-names="{
      children: 'children',
      label: 'name',
      value: 'id',
    }"
    :multiple="multiple"
    :tree-checkable="multiple"
    class="w-full"
    placeholder="请选择商品分类"
    allow-clear
    tree-default-expand-all
  />
</template>