提示:这里可以添加本文要记录的大概内容:
在 Vue 中,列表渲染是通过 v-for
指令实现的,用于基于数据源动态生成重复的 DOM 元素或组件。
key
,避免使用索引
提升用户体验通过合理运用这些列表渲染技巧,可以构建出既高效又易维护的动态列表界面。在你的权限管理模块中,可以进一步:
<template>
<ul>
<li v-for="(item, index) in items" :key="item.id">
{{ index }} - {{ item.name }}
</li>
</ul>
</template>
<script>
export default {
data() {
return {
items: [
{ id: 1, name: 'Apple' },
{ id: 2, name: 'Banana' }
]
}
}
}
</script>
<template>
<ul>
<li v-for="(value, key, index) in obj" :key="key">
{{ index }}. {{ key }}: {{ value }}
</li>
</ul>
</template>
<script>
export default {
data() {
return {
obj: { name: 'John', age: 30 }
}
}
}
</script>
关键特性解析
:key
的重要性id
),避免使用数组索引push()
, pop()
, shift()
, unshift()
, splice()
, sort()
, reverse()
Vue.set
或 splice
)<s-table :columns="columns" :data="loadData">
<!-- 嵌套列表渲染 -->
<template #actions="{ record }">
<a-tag v-for="action in record.actionList" :key="action.value">
{{ action.label }}
</a-tag>
</template>
</s-table>
<div v-for="(field, index) in formFields" :key="field.id">
<input
v-model="field.value"
:placeholder="field.placeholder"
>
<button @click="removeField(index)">删除</button>
</div>
<a-cascader :options="options">
<template v-for="level in [1,2,3]">
<a-select-option
v-for="item in getLevelData(level)"
:key="item.value"
:value="item.value"
>
{{ item.label }}
</a-select-option>
</template>
</a-cascader>
this.$set(this.items, 0, newItem)
// 或
this.items.splice(0, 1, newItem)
<template>
<div v-for="item in filteredList" :key="item.id">
{{ item.name }}
</div>
</template>
<script>
export default {
computed: {
filteredList() {
return this.items.filter(item => item.active)
}
}
}
</script>
<template>
<div v-if="items.length === 0" class="empty-state">
暂无数据
</div>
<div v-else v-for="item in items" :key="item.id">
{{ item.name }}
</div>
</template>
以下是整理后的列表渲染相关代码:
<!-- 列表渲染核心代码汇总 -->
<!-- 1. 主表格列表渲染 -->
<s-table
:columns="columns"
:data="loadData"
>
<!-- 表格列定义 -->
<template>
<!-- 其他列... -->
<!-- 2. 嵌套标签列表渲染 -->
<span slot="actions" slot-scope="text, record">
<a-tag
v-for="(action, index) in record.actionList"
:key="index"
>
{{ action.describe }}
</a-tag>
</span>
</template>
</s-table>
<!-- 3. 权限选择器选项列表渲染 -->
<a-select-option
v-for="(action, index) in permissionList"
:key="index"
:value="action.value"
>
{{ action.label }}
</a-select-option>
<script>
// 相关数据定义
export default {
data() {
return {
// 表格列配置(主列表结构)
columns: [
{
title: '唯一识别码',
dataIndex: 'id'
},
{
title: '权限名称',
dataIndex: 'name',
},
{
title: '可操作权限',
dataIndex: 'actions',
scopedSlots: { customRender: 'actions' }, // 关联嵌套列表渲染
},
// ...其他列
],
// 权限选项数据源
permissionList: [
{ label: '新增', value: 'add' },
{ label: '查询', value: 'get' },
{ label: '修改', value: 'update' },
// ...其他权限项
]
}
},
methods: {
// 主列表数据加载
loadData: parameter => {
return this.$http.get('/mock/api/permission')
.then(res => {
res.result.data.forEach(permission => {
// 准备嵌套列表数据
permission.actionList = JSON.parse(permission.actionData)
})
return res.result
})
},
// 权限选项加载(演示用)
loadPermissionList() {
this.permissionList = [
{ label: '新增', value: 'add' },
{ label: '查询', value: 'get' },
// ...其他权限项
]
}
}
}
</script>
<s-table :columns="columns" :data="loadData">
columns
定义表头结构loadData
方法加载表格数据<a-tag v-for="(action, index) in record.actionList" :key="index">
v-for
循环渲染每个权限的操作标签actionList
数据生成多个标签元素<a-select-option v-for="(action, index) in permissionList" ...>
permissionList
生成下拉选项permission.actionList = JSON.parse(permission.actionData)