vue+elementui 折叠面板的全部展开与全部显示功能

最近的项目中涉及到了折叠面板的全部展开与全部显示功能

下面就大致的总结一下

第一种情况:开始显示全部展开(这时面板全部都是收缩的),当其中的一个面板被手动打开,那么就显示全部收缩(这时面板至少一个被打开)这个是比较简单的,看一下怎么实现吧!

1. 首先需要在折叠面板中绑定activeName,activeName用来装每个面板的唯一标识

<el-collapse v-model="activeName">
 <el-collapse-item/> //中间是具体的每一个面板 都是通过后台传过来的列表进行循环显示的
 <el-collapse-item/>
</el-collapse>

activeName需要在data里面定义 这时进入页面显示全部展示按钮,证明所有面板都是收缩的,所以activeName起初为空

activeName = [] // 为空就代表每个面板都在收缩的状态
 

2. 接下来你需要控制全部展开与全部收缩的按钮的展示后隐藏

<el-button v-if="activeName.length === 0" size="small" icon="el-icon-third-plus-arrow-down" @click="allExpand">全部展示</el-button>
<el-button v-else size="small" icon="el-icon-third-plus-arrow-up" @click="allShrink">全部收缩</el-button>

当activeName的长度为0时,就显示全部展开按钮,当不为0是就显示全部收缩按钮,这样就会控制当其中的一个面板被手动打开,那么就显示全部收缩,因为每打开一个面板那么此面板的唯一标识就会被存到activeName数组中

3. 这时就来到了我们点击按钮的事件啦!!! 

点击全部展示按钮

this.activeName = [] // 注意:由于每点开一个的单独面板 activeName都会发生变化,所以点击全部展开的时候要将activeName置空
for (const collapseTitleData of this.list) {
  this.activeName.push(collapseTitleData.id)
} // list一般为从后台拿到的列表,进行循环 将唯一标识push到面板集合绑定的activeName 这样每个面板都会被打开 按钮显示为全部收缩

点击全部收缩按钮

allShrink() {
   this.activeName = [] // 将面板集合绑定的activeName置空,这时面板会全部收缩,按钮会变为全部展示
},

第二种情况:开始显示全部展开(这时面板全部都是收缩的),当所有的面板都被打开后,那么就显示全部收缩

1. 与情况一类似呀 只是多了一个事件

<el-collapse v-model="activeName" @change="activeNameChange">
 <el-collapse-item/> //中间是具体的每一个面板 都是通过后台传过来的列表进行循环显示的
 <el-collapse-item/>
</el-collapse>

2. 控制显示的按钮呀

<el-button v-if="!showAllShrink" size="small" icon="el-icon-third-plus-arrow-down" @click="allExpand">全部展示</el-button>
<el-button v-if="showAllShrink" size="small" icon="el-icon-third-plus-arrow-up" @click="allShrink">全部收缩</el-button>

showAllShrink是用来控制是否显示按钮的,开始在data中定义默认false

3. 到了点击的时刻

点击全部展示

allExpand() {
   this.activeName = [] 
   for (const collapseTitleData of this.list) {
     this.activeName.push(collapseTitleData.id)
   } 
   this.showAllShrink = true //面板全部展开后我们要显示全部收缩按钮的呀
},

点击全部收缩

allShrink() {
   this.activeName = [] 
   this.showAllShrink = false //全部收缩后需要把全部展示按钮进行展示
},

面板集合定义的change事件,当activeName发生变化时触发,也就会点击具体的每个面板时触发

activeNameChange(val) {
     this.showAllShrink = false //当某个面板进行展开时并不会影响到按钮的变化 只有所有面板全部展开后 才会显示全部收缩按钮
     if (this.activeName.length === this.list.length) {
     this.showAllShrink = true
   } // list为渲染每一个面板的信息,那么在面板全部展开的情况下,activeName的长度与list长度是相同的,因此当长度相同时,显示全部收缩按钮
},

两种情况就结束啦... 当然还有第三种情况,就不具体说啦 提一下哦,那就是打开页面默认全部面板展开 那么就需要在created()中将list中的唯一标识都push到activeName中

  • 6
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 抱歉,由于提供完整的代码涉及到多个文件和组件,无法在此回答。不过,我可以为您提供一个基本的代码框架和思路: 1. 在 Spring Boot 中创建一个 REST API 服务,用于获取动态路由信息并返回给前端。可以使用 Spring Security 管理权限。 2. 在前端使用 Vue.js 和 ElementUI 创建页面,使用 Vue Router 管理路由,包括静态路由和动态路由。 3. 在 Vue.js 中,使用 axios 发送请求到后端获取动态路由信息,并将其添加到路由配置中。 4. 在 ElementUI 中,可以使用菜单组件和面包屑组件展示路由信息,方便用户导航。 需要注意的是,动态路由的实现需要前后端共同配合,后端提供动态路由信息接口,前端调用接口并根据返回结果动态生成路由。由于每个项目的实现细节和逻辑都可能不同,因此需要具体情况具体分析,这里提供的只是一个大致的思路和框架。 ### 回答2: Vue + ElementUI + SpringBoot + MySQL 实现动态路由的全部代码示例如下: 1. Vue 前端代码: ```javascript // main.js import Vue from 'vue' import App from './App.vue' import ElementUI from 'element-ui' import 'element-ui/lib/theme-chalk/index.css' import router from './router' // 导入路由配置 import axios from 'axios' Vue.config.productionTip = false Vue.use(ElementUI) Vue.prototype.$axios = axios new Vue({ router, render: h => h(App) }).$mount('#app') ``` ```html <!-- App.vue --> <template> <div id="app"> <router-view></router-view> </div> </template> <script> export default { name: 'App' } </script> ``` ```javascript // router.js import Vue from 'vue' import VueRouter from 'vue-router' import axios from 'axios' import { Message } from 'element-ui' Vue.use(VueRouter) const routes = [ { path: '/', name: 'Home', component: () => import('@/views/Home.vue') }, // 其他路由配置... ] const router = new VueRouter({ mode: 'history', base: process.env.BASE_URL, routes }) // 动态路由获取示例 router.beforeEach((to, from, next) => { if (to.meta.requiresAuth) { // 路由需要权限验证 axios.get('/api/checkAuth').then(response => { if (response.data.success) { next() } else { Message.error('需要登录') next('/login') } }) } else { // 其他路由直接放行 next() } }) export default router ``` 2. SpringBoot 后端代码: ```java // AuthController.java @RestController @RequestMapping("/api") public class AuthController { @GetMapping("/checkAuth") public ResponseEntity<?> checkAuth() { // 检查权限的逻辑 // 返回一个标志,表示是否有权限 return ResponseEntity.ok().body(new ApiResponse(true, "权限验证通过")); } } ``` 3. MySQL 数据库表设计: ```sql CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(255) NOT NULL, `password` varchar(255) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; CREATE TABLE `role` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; CREATE TABLE `user_role` ( `id` int(11) NOT NULL AUTO_INCREMENT, `user_id` int(11) NOT NULL, `role_id` int(11) NOT NULL, PRIMARY KEY (`id`), KEY `FK_user_role_user` (`user_id`), KEY `FK_user_role_role` (`role_id`), CONSTRAINT `FK_user_role_role` FOREIGN KEY (`role_id`) REFERENCES `role` (`id`), CONSTRAINT `FK_user_role_user` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; ``` 以上是基于 VueElementUI、SpringBoot 和 MySQL 实现动态路由的一个简单示例代码。具体的实现逻辑和业务需求可以根据实际情况进行调整和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值