{
title: '保活',
key: 'keepalive',
width: 40,
align: 'center',
render(row) {
return h(NSwitch, {
size: 'small',
rubberBand: false,
value: row.keepalive,
onUpdateValue: () => handleUpdateKeepalive(row),
})
},
},
一、代码功能概述
这段代码定义了一个表格列,显示了一个开关(Switch)组件,用于控制菜单项的"保活"状态。当用户切换开关时,会触发 handleUpdateKeepalive
函数,更新对应菜单项的保活状态。
二、代码逐行解析
{
title: '保活', // 表格列的标题
key: 'keepalive', // 对应数据中的字段名
width: 40, // 列宽
align: 'center', // 内容居中对齐
render(row) { // 渲染函数,row 是当前行的数据
return h( // Vue3 的 h 函数,用于创建虚拟 DOM 节点
NSwitch, // 使用 Naive UI 的 NSwitch 组件
{ // 组件的属性
size: 'small', // 开关大小
rubberBand: false, // 禁用橡皮筋效果
value: row.keepalive, // 绑定当前行的 keepalive 值
onUpdateValue: () => handleUpdateKeepalive(row), // 值更新时的回调
}
)
},
}
三、核心知识点详解
1. Vue3 的 Render 函数与 h 函数
-
h
是 Vue3 的核心函数,用于创建虚拟 DOM 节点 -
语法:
h(组件/标签名, 属性对象, 子节点)
-
在表格动态渲染场景中非常实用,比模板语法更灵活
讲解技巧: 可以类比为"搭积木",h
函数就是把组件和属性组合起来的工具。比如 h(NSwitch, {size: 'small'})
就像拿一个小型开关积木。
2. Naive UI 的 NSwitch 组件
-
size
: 控制组件大小,可选值有small
、medium
、large
-
rubberBand
: 橡皮筋效果,开启后开关会有弹性动画 -
value
: 绑定开关的当前状态(true/false) -
onUpdateValue
: 当开关状态改变时触发的回调
开发技巧:
-
通常配合
v-model
使用,但在这里我们用value
和onUpdateValue
实现了相同的双向绑定效果 -
如果需要禁用某些开关,可以添加
disabled
属性
3. 表格渲染机制
Naive UI 的表格组件通过 columns
属性接收列配置,每列可以定义:
-
title
: 列标题 -
key
: 对应数据字段 -
width
: 列宽 -
align
: 对齐方式 -
render
: 自定义渲染函数
注意事项:
-
render
函数接收当前行数据作为参数 -
返回值必须是 Naive UI 的 VNode 或 VNode 数组
四、FastAPI 后端配合
前端需要后端支持才能完成保活状态的持久化。我们通常这样设计:
1. API 接口定义
# 更新菜单保活状态接口
@app.put("/menus/{menu_id}/keepalive")
async def update_menu_keepalive(
menu_id: int,
keepalive: bool = Body(..., embed=True)
):
# 更新数据库逻辑
await menu_repository.update_keepalive(menu_id, keepalive)
return {"success": True}
2. 前端调用示例
async function handleUpdateKeepalive(row) {
try {
// 切换状态
row.keepalive = !row.keepalive;
// 调用后端接口保存
await api.put(`/menus/${row.id}/keepalive`, {
keepalive: row.keepalive
});
message.success('更新成功');
} catch (error) {
// 失败回滚状态
row.keepalive = !row.keepalive;
message.error('更新失败');
}
}