更多ruoyi-nbcio功能请看演示系统
gitee源代码地址
前后端代码: https://gitee.com/nbacheng/ruoyi-nbcio
演示地址:RuoYi-Nbcio后台管理系统http://218.75.87.38:9666/
更多nbcio-boot功能请看演示系统
gitee源代码地址
后端代码: https://gitee.com/nbacheng/nbcio-boot
前端代码:https://gitee.com/nbacheng/nbcio-vue.git
在线演示(包括H5) : http://218.75.87.38:9888
这里提供一种VUE3用户可以设置显示隐藏列表内容的方法,但这个方法比较简单,说白了就硬写代码的方式,实际以后应该需要动态实现,满足所有业务列表页面的需要。
1、先建一个显示隐藏列表的组件RightToolbar
这里主要使用el-tree 相关里面具体代码原理可以参考el-tree组件
这里主要传入两个组件属性:showSearch和columns
其中这里的showSearch 通过子组件的update来更新,如下:
const emits = defineEmits(['update:showSearch', 'queryTable'])
同时刷新定义了queryTable来触发父组件重新查询数据
<template> <div class="top-right-btn" :style="style"> <el-row> <el-tooltip class="item" effect="dark" :content="showSearch ? '隐藏搜索' : '显示搜索'" placement="top" v-if="search"> <el-button circle icon="Search" @click="toggleSearch()" /> </el-tooltip> <el-tooltip class="item" effect="dark" content="刷新" placement="top"> <el-button circle icon="Refresh" @click="refresh()" /> </el-tooltip> <el-tooltip class="item" effect="dark" content="显示/隐藏列" placement="top" v-if="columns"> <div class="show-btn"> <el-popover placement="bottom" trigger="click"> <div class="tree-header">显示/隐藏列</div> <el-tree ref="columnRef" :data="columns" show-checkbox @check="columnChange" node-key="key" :props="{ label: 'label', children: 'children' }" ></el-tree> <template #reference> <el-button circle icon="Menu" /> </template> </el-popover> </div> </el-tooltip> </el-row> </div> </template> <script setup lang="ts"> import { propTypes } from '@/utils/propTypes'; const props = defineProps({ showSearch: propTypes.bool.def(true), columns: { type: Array as PropType<FieldOption[]>, }, search: propTypes.bool.def(true), gutter: propTypes.number.def(10), }) const columnRef = ref<ElTreeInstance>(); const emits = defineEmits(['update:showSearch', 'queryTable']); const style = computed(() => { const ret: any = {}; if (props.gutter) { ret.marginRight = `${props.gutter / 2}px`; } return ret; }); // 搜索 function toggleSearch() { emits("update:showSearch", !props.showSearch); } // 刷新 function refresh() { emits("queryTable"); } // 更改数据列的显示和隐藏 function columnChange(...args: any[]) { props.columns?.forEach((item) => { item.visible = args[1].checkedKeys.includes(item.key); }) } // 显隐列初始默认隐藏列 onMounted(() => { props.columns?.forEach((item) => { if (item.visible) { columnRef.value?.setChecked(item.key, true, false); // value.value.push(item.key); } }) }) </script> <style lang="scss" scoped> :deep(.el-transfer__button) { border-radius: 50%; display: block; margin-left: 0px; } :deep(.el-transfer__button:first-child) { margin-bottom: 10px; } .my-el-transfer { text-align: center; } .tree-header{ width: 100%; line-height: 24px; text-align: center; } .show-btn { margin-left: 12px; } </style>
2、父组件调用
其中这里的showSearch 调用的时候v-model:showSearch="showSearch"来绑定,所以可以通过子组件的update来更新。
同时@queryTable事件 由子组件触发重查刷新数据
另外通过columnChange也同时修改了父组件里的columns值,所以子组件选择相应的列数据后,父组件列表数据也更新了,相关原理见下面的说明:
当在子组件中改变基本数据类型时,父组件中的值不会改变,但是当改变引用类型数据时,因为父组件和子组件中的props保存的引用类型数据的地址时一样的,对应地址的值也一起改变。
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList" :columns="columns" :search="true"></right-toolbar> <el-table-column type="selection" width="50" align="center" /> <el-table-column label="用户编号" align="center" key="userId" prop="userId" v-if="columns[0].visible" /> <el-table-column label="用户名称" align="center" key="userName" prop="userName" v-if="columns[1].visible" :show-overflow-tooltip="true" /> <el-table-column label="用户昵称" align="center" key="nickName" prop="nickName" v-if="columns[2].visible" :show-overflow-tooltip="true" /> <el-table-column label="部门" align="center" key="deptName" prop="dept.deptName" v-if="columns[3].visible" :show-overflow-tooltip="true" /> <el-table-column label="手机号码" align="center" key="phonenumber" prop="phonenumber" v-if="columns[4].visible" width="120" /> <el-table-column label="状态" align="center" key="status" v-if="columns[5].visible"> <template #default="scope"> <el-switch v-model="scope.row.status" active-value="0" inactive-value="1" @change="handleStatusChange(scope.row)"></el-switch> </template> </el-table-column> <el-table-column label="创建时间" align="center" prop="createTime" v-if="columns[6].visible" width="160"> <template #default="scope"> <span>{{ scope.row.createTime }}</span> </template> </el-table-column> // 列显隐信息 const columns = ref<FieldOption[]>([ { key: 0, label: `用户编号`, visible: false,children: [] }, { key: 1, label: `用户名称`, visible: true,children: [] }, { key: 2, label: `用户昵称`, visible: true,children: [] }, { key: 3, label: `部门`, visible: true,children: [] }, { key: 4, label: `手机号码`, visible: true,children: [] }, { key: 5, label: `状态`, visible: true,children: [] }, { key: 6, label: `创建时间`, visible: true,children: [] } ]) /** 查询用户列表 */ const getList = async () => { loading.value = true; const res = await api.listUser(proxy?.addDateRange(queryParams.value, dateRange.value)); loading.value = false; userList.value = res.rows; total.value = res.total; }
3、效果图