要实现如上所示分级展开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: [], c1Id: '', c2Arr: [], c2Id: '', c3Arr: [], 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
|