vue栏目分类实现
Vue 栏目分类实现
数据结构设计
使用嵌套数组或对象存储分类数据,例如:
categories: [
{
id: 1,
name: '科技',
children: [
{ id: 11, name: '人工智能' },
{ id: 12, name: '区块链' }
]
},
{
id: 2,
name: '生活',
children: [
{ id: 21, name: '美食' },
{ id: 22, name: '旅游' }
]
}
]
递归组件实现
创建可递归调用的分类组件:
<template>
<ul>
<li v-for="item in categories" :key="item.id">
{{ item.name }}
<CategoryTree v-if="item.children" :categories="item.children"/>
</li>
</ul>
</template>
<script>
export default {
name: 'CategoryTree',
props: ['categories']
}
</script>
状态管理
对于复杂分类系统,建议使用Vuex管理状态:

// store.js
state: {
categories: []
},
mutations: {
SET_CATEGORIES(state, payload) {
state.categories = payload
}
},
actions: {
async fetchCategories({ commit }) {
const res = await api.getCategories()
commit('SET_CATEGORIES', res.data)
}
}
动态路由配置
结合vue-router实现分类页面:
{
path: '/category/:id',
name: 'Category',
component: () => import('./views/Category.vue'),
props: true
}
分类筛选功能
实现基于分类的内容筛选:

computed: {
filteredPosts() {
return this.posts.filter(post =>
post.categoryId === this.selectedCategoryId
)
}
}
交互优化
添加展开/折叠功能:
<template>
<div @click="toggle">
{{ category.name }}
<div v-show="isOpen">
<CategoryItem
v-for="child in category.children"
:key="child.id"
:category="child"
/>
</div>
</div>
</template>
<script>
export default {
data() {
return {
isOpen: false
}
},
methods: {
toggle() {
this.isOpen = !this.isOpen
}
}
}
</script>
样式处理
使用CSS实现视觉层级:
.category-item {
padding-left: 20px;
}
.category-item .children {
margin-left: 15px;
transition: all 0.3s ease;
}
性能优化
对于大型分类数据:
- 使用虚拟滚动(vue-virtual-scroller)
- 实现懒加载子分类
- 添加loading状态处理






