checkbox 多选框

Siona

checkbox 多选框

1. 多选框组 CheckboxGroup

<template>
    <div>
        <a-table :columns="columns"
                 :data-source="menuPermissionData"
                 :bordered="true"
        >
            <template #bodyCell="{column, record }">
                <template v-if="column.dataIndex === 'interface' && record.interface">
                    <a-checkbox-group v-model:value="record.checkedActionList" :options="record.interface" />
                </template>
            </template>
        </a-table>
    </div>
</template>
<script setup>
    import PermissionApi from '@/api/system/Permission'
    import { onMounted, ref } from 'vue'
    import { useRoute } from 'vue-router'

    const route = useRoute()
    const roleId = route.query.id

    const systemData = ref([])
    
    const columns = [
        {
            title: '菜单',
            dataIndex: 'menu',
            key: 'menu'
        },
        {
            title: '接口',
            key: 'interface',
            dataIndex: 'interface'
        }
    ]

    const menuPermissionData = ref([])
    
    const getSubSystemList = async () => {
        const params = {
            roleId: roleId
        }
        const { data: result } = await PermissionApi.getSubSystemList(params)
        if (result.status) {
            const subSystemList = result.data.subSystemList
            systemData.value = subSystemList.map(item => {
                return {
                    id: item.id,
                    label: item.menuName
                }
            })
            // 默认显示第一个系统的菜单
            if (subSystemList[0] && subSystemList[0].menuActionList) {
                menuPermissionData.value = subSystemList[0].menuActionList.map(item => {
                    // 注意,在处理 item.sysActionList 时添加一个检查,如果 item.sysActionList 为 null,则将 actionList 设为一个空数组 []。
                    // 可以通过逻辑运算符 || 来简化这一检查和赋值的过程
                    const checkedActionList = []
                    const actionList = (item.sysActionList || []).map(action => {
                        // 封装 checkedActionList
                        if (!action.Checked) {
                            checkedActionList.push(action.label)
                        }

                        return {
                            label: action.label,
                            value: action.label
                        }
                    })

                    return {
                        id: item.id,
                        key: item.id,
                        menu: item.menuName,
                        interface: actionList
                    }
                })
            }
        } else {
            this.$message.error(result.msg)
        }
    }

    /* 监听多选框改变 */
    watch(() => menuPermissionData.value, value => {
        console.log(333, value)
    }, { deep: true }) // 深度监听
</script>

深度监听:

  • 使用 watch 监听 menuPermissionData.value 的变化,并添加 { deep: true } 选项来进行深度监听。这将确保监听到对象和数组内部的变化。

实际接口中数据格式,需要处理一下,适用于 Antd 的 a-checkbox-group 组件数据渲染。

[
    {
        "id": 2,
        "actionUrl": "",
        "actionMethod": "",
        "createTime": null,
        "updateTime": null,
        "label": "系统报名列表",
        "menuId": 0,
        "Checked": false
    },
    {
        "id": 21,
        "actionUrl": "",
        "actionMethod": "",
        "createTime": null,
        "updateTime": null,
        "label": "系统报名删除",
        "menuId": 0,
        "Checked": false
    }
]
Last Updated 8/18/2024, 10:22:42 AM