灏天阁

vue3.2/Vite/Ts49: 已有属性和属性值展示业务

· Yin灏

目录结构

└─src
    ├─api
    │  └─product
    │      └─attr
    │          ├─index.ts
    │          └─type.ts
    └─views
        └─product
            └─attr
                └─index.vue

展示已有属性和属性值

src/views/product/attr/index.vue

<template>
  <!-- 三级分类 -->
  <div>
    <Category />
    <el-card>
      <el-button
        type="primary"
        size="default"
        icon="Plus"
        :disabled="categoryStore.c3Id"
        >添加属性</el-button
      >
      <el-table border>
        <el-table-column
          label="序号"
          type="index"
          align="center"
          width="80px"
        ></el-table-column>
        <el-table-column
          label="属性名称"
          width="120px"
          prop="attrName"
        ></el-table-column>
        <el-table-column label="属性值名称">
          <template #="{row}">
            <el-tag v-for="(item, index) in row.attrValueList" :key="item.id">{{ item.valueName }}</el-tage>
          </template>
        </el-table-column>
        <el-table-column label="操作" width="120px">
          <template #="{row}">
            <el-button type="primary" size="small" icon="Edit"></el-button>
            <el-button type="primary" size="small" icon="Delete"></el-button>
          </template>
        </el-table-column>
      </el-table>
    </el-card>
  </div>
</template>
<script setup lang="ts">
  import { watch, ref } from "vue";

  import type { AttrResponseData, Attr } from "@/api/product/attr";

  import useCategoryStore from "@/store/modules/category";
  let categoryStore = useCategoryStore();

  import { reqAttr } from "@/api/product/attr";

  let attrArr = ref<Attr[]>([]);

  const getAttr = () => {
    const { c1Id, c2Id, c3Id } = categoryStore;
    const result: AttrResponseData = await reqAttr(c1Id, c2Id, c3Id);
    if (result.code === 200) {
      attrArr.value = result.data;
    }
  };

  // 监听三级分类数据
  watch(
    () => categoryStore.c3Id,
    () => {
      attrArr.value = [];
      if (!categoryStore.c3Id) return;
      getAttr();
    }
  );
</script>

添加获取属性值的接口

src/api/product/attr/index.ts

import request from "@/utils/request";
import type { AttrResponseData } from './type';

enum API {
  //...
  ATTR_URL: '/admin/product/attrInfoList/'
}

//...
export const reqAttr = (
  category1Id: string | number,
  category2Id: string | number,
  category3Id: string | number
) => request.get<any, AttrResponseData>(API.ATTR_URL + `${category1Id}/${category2Id}/${category3Id}`)
//...

定义属性接口的 TS 类型

src/api/product/attr/type.ts

//...
export interface ResponseData {
  code: number;
  message: string;
  ok: boolean;
}

//...

export interface AttrValue {
  id: number;
  valueName: string;
  attrId: number;
}

export type AttrValueList = AttrValue[];

export interface Attr {
  id: number;
  attrName: string;
  categoryId: number;
  categoryLevel: number;
  attrValueList: AttrValueList[];
}

export type AttrList = Attr[];

export interface AttrResponseData extends ResponseData {
  data: Attr[];
}
//...

- Book Lists -