效果预览
组件封装
src\pages\index\components\CategoryPanel.vue
<script setup lang="ts">
import type { CategoryItem } from '@/types/index'
defineProps<{
list: CategoryItem[]
}>()
</script>
<template>
<view class="category">
<navigator
class="category-item"
hover-class="none"
:url="item.url"
v-for="item in list || []"
:key="item.id"
>
<image class="icon" :src="item.icon"></image>
<text class="text">{{ item.name }}</text>
</navigator>
</view>
</template>
<style lang="scss">
.category {
margin: 20rpx 0 0;
padding: 10rpx 0;
display: flex;
flex-wrap: wrap;
min-height: 328rpx;
.category-item {
width: 150rpx;
display: flex;
justify-content: center;
flex-direction: column;
align-items: center;
box-sizing: border-box;
.icon {
width: 100rpx;
height: 100rpx;
}
.text {
font-size: 26rpx;
color: #666;
}
}
}
</style>
类型声明
src\types\index.d.ts
/** 首页-分类导航 */
export type CategoryItem = {
/** 图标路径 */
icon: string
/** id */
id: string
/** 分类名称 */
name: string
// 导航地址
url: string
}
相关接口
src\apis\index.ts
import { http } from '@/utils/http'
import type { CategoryItem } from '@/types/index'
/**
* 首页-分类导航
*/
export const getHomeCategoryAPI = () => {
return http<CategoryItem[]>({
method: 'GET',
url: '/home/category/mutli',
})
}
实战使用
src\pages\index\index.vue
import CategoryPanel from './components/CategoryPanel.vue'
<CategoryPanel :list="CategoryList" />
import { onLoad } from '@dcloudio/uni-app'
import { ref } from 'vue'
import type { CategoryItem } from '@/types/'
import { getHomeCategoryAPI } from '@/apis/index'
let CategoryList = ref<CategoryItem[]>([])
const getCategoryInfo = async () => {
let res = await getHomeCategoryAPI()
CategoryList.value = res.result
}
onLoad(() => {
getCategoryInfo()
})