vue栏目分类实现
Vue栏目分类实现方法
数据准备与结构设计
在Vue组件中定义栏目分类数据,通常使用数组存储分类信息。每个分类对象包含id、name等基本属性,可根据需求扩展子分类字段。
data() {
return {
categories: [
{ id: 1, name: '科技', children: [
{ id: 11, name: '人工智能' },
{ id: 12, name: '区块链' }
]},
{ id: 2, name: '生活', children: [
{ id: 21, name: '美食' },
{ id: 22, name: '旅行' }
]}
]
}
}
模板渲染实现
使用v-for指令循环渲染分类列表,嵌套v-for处理多级分类。通过v-if或v-show控制子分类的显示隐藏。
<ul class="category-list">
<li v-for="category in categories" :key="category.id">
<div @click="toggleChildren(category)">
{{ category.name }}
<span v-if="category.children">▶</span>
</div>
<ul v-show="category.showChildren" v-if="category.children">
<li v-for="child in category.children" :key="child.id">
{{ child.name }}
</li>
</ul>
</li>
</ul>
交互逻辑处理
在methods中定义分类展开/收起的方法,通过修改数据对象的showChildren属性控制子分类显示状态。

methods: {
toggleChildren(category) {
if (category.children) {
this.$set(category, 'showChildren', !category.showChildren)
}
}
}
样式优化
添加CSS样式美化分类列表,包括悬停效果、过渡动画等增强用户体验。
.category-list {
list-style: none;
padding: 0;
}
.category-list li {
padding: 8px 12px;
cursor: pointer;
transition: background 0.3s;
}
.category-list li:hover {
background: #f5f5f5;
}
.category-list ul {
padding-left: 20px;
}
动态数据加载
对于大量分类数据,可采用异步加载方式,通过API获取分类数据。

async created() {
try {
const response = await axios.get('/api/categories')
this.categories = response.data.map(cat => ({
...cat,
showChildren: false
}))
} catch (error) {
console.error('获取分类失败:', error)
}
}
组件化实现
将分类功能封装为独立组件,通过props接收分类数据,emit事件处理分类选择。
// Category.vue
props: {
categories: {
type: Array,
required: true
}
},
methods: {
handleSelect(category) {
this.$emit('select', category)
}
}
状态管理
对于复杂应用,可使用Vuex管理分类状态,实现跨组件共享和持久化。
// store.js
state: {
categories: []
},
mutations: {
SET_CATEGORIES(state, categories) {
state.categories = categories
}
},
actions: {
async fetchCategories({ commit }) {
const res = await getCategories()
commit('SET_CATEGORIES', res.data)
}
}






