image-20230104123514646

要实现如上所示分级展开el-select选项:

在onMounted的时候获得一级分类的数据

当我们点击一级分类的选项后 执行函数获得二级分类的数据

点击二级分类的数据之后再获得三级分类的数据

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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
<template>
<el-card>
<!-- inline="true"设置行内表单展示为1行 -->
<el-form :inline="true">
<el-form-item label="一级分类">
<!--
其中c1Arr在onMounted的时候获得
change:选中值发生变化时触发
scene:通过父组件传递过来的的sence来控制是否进行展示
-->
<el-select
:disabled="scene == 0 ? false : true"
v-model="categoryStore.c1Id"
@change="handler"
>
<!-- label:即为展示数据 value:即为select下拉菜单收集的数据 -->
<el-option
v-for="(c1, index) in categoryStore.c1Arr"
:key="c1.id"
:label="c1.name"
:value="c1.id"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="二级分类">
<el-select
:disabled="scene == 0 ? false : true"
v-model="categoryStore.c2Id"
@change="handler1"
>
<el-option
v-for="(c2, index) in categoryStore.c2Arr"
:key="c2.id"
:label="c2.name"
:value="c2.id"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="三级分类">
<el-select
:disabled="scene == 0 ? false : true"
v-model="categoryStore.c3Id"
>
<el-option
v-for="(c3, index) in categoryStore.c3Arr"
:key="c3.id"
:label="c3.name"
:value="c3.id"
></el-option>
</el-select>
</el-form-item>
</el-form>
</el-card>
</template>

<script setup lang="ts">
//引入组件挂载完毕方法
import { onMounted } from 'vue'
//引入分类相关的仓库
import useCategoryStore from '@/store/modules/category'
let categoryStore = useCategoryStore()
//分类全局组件挂载完毕,通知仓库发请求获取一级分类的数据
onMounted(() => {
getC1()
})
//通知仓库获取一级分类的方法
const getC1 = () => {
//通知分类仓库发请求获取一级分类的数据
categoryStore.getC1()
}

//此方法即为一级分类下拉菜单的change事件(选中值的时候会触发,保证一级分类ID有了)
const handler = () => {
//需要将二级、三级分类的数据清空
categoryStore.c2Id = ''
categoryStore.c3Arr = []
categoryStore.c3Id = ''
//通知仓库获取二级分类的数据
categoryStore.getC2()
}
//此方法即为二级分类下拉菜单的change事件(选中值的时候会触发,保证二级分类ID有了)
const handler1 = () => {
//清理三级分类的数据
categoryStore.c3Id = ''
categoryStore.getC3()
}

//接受父组件传递过来scene
defineProps(['scene'])
</script>

<style scoped></style>

其中API定义如下:

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
//商品分类全局组件的小仓库
import { defineStore } from 'pinia'
import { reqC1, reqC2, reqC3 } from '@/api/product/attr'
import type { CategoryResponseData } from '@/api/product/attr/type'
import type { CategoryState } from './types/type'
const useCategoryStore = defineStore('Category', {
state: (): CategoryState => {
return {
//存储一级分类的数据
c1Arr: [],
//存储一级分类的ID
c1Id: '',
//存储对应一级分类下二级分类的数据
c2Arr: [],
//收集二级分类的ID
c2Id: '',
//存储三级分类的数据
c3Arr: [],
//存储三级分类的ID
c3Id: '',
}
},
actions: {
//获取一级分类的方法
async getC1() {
//发请求获取一级分类的数据
const result: CategoryResponseData = await reqC1()
if (result.code == 200) {
this.c1Arr = result.data
}
},
//获取二级分类的数据
async getC2() {
//获取对应一级分类的下二级分类的数据
const result: CategoryResponseData = await reqC2(this.c1Id)
if (result.code == 200) {
this.c2Arr = result.data
}
},
//获取三级分类的数据 其中三级的数据是由一级和二级的数据共同确定下来

async getC3() {
const result: CategoryResponseData = await reqC3(this.c2Id)
if (result.code == 200) {
this.c3Arr = result.data
}
},
},
getters: {},
})

export default useCategoryStore