使用.LayUI实现动态选项卡Tab的强大功能

news2024/12/23 18:56:28

标题

  • 正文:
    • 1.引入.LayUI框架文件
    • 2.创建选项卡容器
    • 3.初始化.LayUI组件和创建选项卡项以及获取数据准备
      • 3.1 Permission实体类
      • 3.2 PermissionDao类
      • 3.3 TreeVo类
      • 3.4 PermissionAction类
    • 4.监听选项卡的切换事件
    • 5.运行和测试
    • 6.总结:

在这里插入图片描述

正文:

在Web界面开发中,动态选项卡Tab是一种常见且实用的功能。它可以让用户在页面中切换不同的内容,提供了更好的用户体验。而.LayUI作为一款流行的前端框架,提供了丰富的组件,包括可以轻松实现动态选项卡Tab的功能。在本文中,我们将学习如何使用.LayUI来创建动态选项卡Tab,并探索其强大的功能。

1.引入.LayUI框架文件

首先,我们需要引入.LayUI框架的相关文件。你可以从.LayUI官方网站上下载最新的框架文件,并将其引入到你的项目中。以下是一个示例的HTML代码,用于引入.LayUI框架文件:

<!DOCTYPE html>
<html>
<head>
    <link rel="stylesheet" href="path/to/layui/css/layui.css">
    <script src="path/to/layui/layui.js"></script>
</head>
<body>
</body>
</html>
接下来,我们需要创建一个容器元素来显示选项卡。你可以使用一个div元素作为容器,并为其指定一个唯一的id用于后续的操作。以下是一个示例的HTML代码:

<body>
    <div id="tabContainer"></div>
</body>

2.创建选项卡容器

现在,我们可以使用.LayUI的JavaScript API来初始化选项卡,并添加动态选项卡项。以下是一个使用.LayUI实现动态选项卡Tab的示例:

<div class="layui-tab">
  <ul class="layui-tab-title">
    <li class="layui-this">网站设置</li>
    <li>用户管理</li>
    <li>权限分配</li>
    <li>商品管理</li>
    <li>订单管理</li>
  </ul>
  <div class="layui-tab-content">
    <div class="layui-tab-item layui-show">
      1. 高度默认自适应,也可以随意固宽。
      <br>2. Tab进行了响应式处理,所以无需担心数量多少。
    </div>
    <div class="layui-tab-item">内容2</div>
    <div class="layui-tab-item">内容3</div>
    <div class="layui-tab-item">内容4</div>
    <div class="layui-tab-item">内容5</div>
  </div>
</div>

3.初始化.LayUI组件和创建选项卡项以及获取数据准备

 var element,layer,util;
layui.use(['element', 'layer', 'util'], function(){
  element = layui.element
  ,layer = layui.layer
  ,util = layui.util
  ,$ = layui.$;
 	$.ajax({
 		url:'${pageContext.request.contextPath }/permission.action?methodName=menus',
 		dataType:'json',
 		success:function(data){
 			console.log(data)
 			var htmlStr = '';
 			
 			$.each(data,function(i,n){
 				htmlStr+='<li class="layui-nav-item layui-nav-itemed">';
 				htmlStr+='<a class="" href="javascript:;">'+n.text+'</a>';
 				if(n.hasChildren){
 					var children = n.children;
 					
 					htmlStr+='<dl class="layui-nav-child">';
 					$.each(children,function(index,node){
 					htmlStr+=' <dd><a href="javascript:;" onclick="tabAdd(\''+node.text+'\',\''+node.attributes.url+'\',\''+node.id+'\')">'+node.text+'</a></dd>';
 		 			})
 					htmlStr+='</dl>';
 				}
 				htmlStr+=' </li>';
 			})
 			$("#menu").html(htmlStr);
 		 	element.render('menu'); 
 		}
 		
 	});
  
 	
});


function tabAdd(text,url,id){
     //新增一个Tab项
     var $node = $('li[lay-id="'+id+'"]');
     if($node.length == 0){
     element.tabAdd('demo', {
       title: text//用于演示
       ,content: "<iframe frameborder='0' src='"+url+"' scrolling='auto' style='width:100%;height:100%;'></iframe>"
       ,id: id //实际使用一般是规定好的id,这里以时间戳模拟下
     })
     }
     element.tabChange('demo', id); //切换到:用户管理


}

3.1 Permission实体类

package com.zking.entity;

public class Permission {
 private long id;
 private String name;
 private String description;
 private String url;
 private long pid;
 private int ismenu;
 private long displayno;
 
 public Permission() {
	// TODO Auto-generated constructor stub
}

public Permission(String name, String description, String url, long pid, int ismenu, long displayno) {
	super();
	this.name = name;
	this.description = description;
	this.url = url;
	this.pid = pid;
	this.ismenu = ismenu;
	this.displayno = displayno;
}

public long getId() {
	return id;
}

public void setId(long id) {
	this.id = id;
}

public String getName() {
	return name;
}

public void setName(String name) {
	this.name = name;
}

public String getDescription() {
	return description;
}

public void setDescription(String description) {
	this.description = description;
}

public String getUrl() {
	return url;
}

public void setUrl(String url) {
	this.url = url;
}

public long getPid() {
	return pid;
}

public void setPid(long pid) {
	this.pid = pid;
}

public int getIsmenu() {
	return ismenu;
}

public void setIsmenu(int ismenu) {
	this.ismenu = ismenu;
}

public long getDisplayno() {
	return displayno;
}

public void setDisplayno(long displayno) {
	this.displayno = displayno;
}

public Permission(long id, String name, String description, String url, long pid, int ismenu, long displayno) {
	super();
	this.id = id;
	this.name = name;
	this.description = description;
	this.url = url;
	this.pid = pid;
	this.ismenu = ismenu;
	this.displayno = displayno;
}

@Override
public String toString() {
	return "Permission [id=" + id + ", name=" + name + ", description=" + description + ", url=" + url + ", pid=" + pid
			+ ", ismenu=" + ismenu + ", displayno=" + displayno + "]";
}
 
	
	
}

3.2 PermissionDao类

package com.zking.dao;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.zking.entity.Permission;
import com.zking.util.BaseDao;
import com.zking.util.BuildTree;
import com.zking.util.PageBean;
import com.zking.util.TreeVo;

public class PermissionDao extends BaseDao<Permission> {

	
	public List<Permission> QueryAll(Permission permission,PageBean pagebean) throws Exception {
		String sql = "select * from t_oa_permission";
		return super.executeQuery(sql, Permission.class, pagebean);
	}
	
	public List<TreeVo<Permission>> menus(Permission permission,PageBean pagebean) throws Exception{
		List<TreeVo<Permission>> lst = new ArrayList<TreeVo<Permission>>();
		
		List<Permission> list = this.QueryAll(permission, pagebean);
		for (Permission p : list) {
			TreeVo<Permission> tv = new TreeVo<Permission>();
			tv.setId(p.getId()+"");
			tv.setText(p.getName());
			tv.setParentId(p.getPid()+"");
			Map<String, Object> map = new HashMap<String, Object>();
			map.put("skyl",p);
			tv.setAttributes(map);
			lst.add(tv);
		}
		
		return BuildTree.buildList(lst,"-1");
	}
	
	public static void main(String[] args) {
		try {
			List<TreeVo<Permission>> menus = new PermissionDao().menus(null, null);
			ObjectMapper om  = new ObjectMapper();
			System.out.println(om.writeValueAsString(menus));
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

3.3 TreeVo类

package com.zking.util;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;


public class TreeVo<T> {
	/**
	 * 节点ID
	 */
	private String id;
	/**
	 * 显示节点文本
	 */
	private String text;
	/**
	 * 节点状态,open closed
	 */
	private Map<String, Object> state;
	/**
	 * 节点是否被选中 true false
	 */
	private boolean checked = false;
	/**
	 * 节点属性
	 */
	private Map<String, Object> attributes;

	/**
	 * 节点的子节点
	 */
	private List<TreeVo<T>> children = new ArrayList<TreeVo<T>>();

	/**
	 * 父ID
	 */
	private String parentId;
	/**
	 * 是否有父节点
	 */
	private boolean hasParent = false;
	/**
	 * 是否有子节点
	 */
	private boolean hasChildren = false;

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getText() {
		return text;
	}

	public void setText(String text) {
		this.text = text;
	}

	public Map<String, Object> getState() {
		return state;
	}

	public void setState(Map<String, Object> state) {
		this.state = state;
	}

	public boolean isChecked() {
		return checked;
	}

	public void setChecked(boolean checked) {
		this.checked = checked;
	}

	public Map<String, Object> getAttributes() {
		return attributes;
	}

	public void setAttributes(Map<String, Object> attributes) {
		this.attributes = attributes;
	}

	public List<TreeVo<T>> getChildren() {
		return children;
	}

	public void setChildren(List<TreeVo<T>> children) {
		this.children = children;
	}

	public boolean isHasParent() {
		return hasParent;
	}

	public void setHasParent(boolean isParent) {
		this.hasParent = isParent;
	}

	public boolean isHasChildren() {
		return hasChildren;
	}

	public void setChildren(boolean isChildren) {
		this.hasChildren = isChildren;
	}

	public String getParentId() {
		return parentId;
	}

	public void setParentId(String parentId) {
		this.parentId = parentId;
	}

	public TreeVo(String id, String text, Map<String, Object> state, boolean checked, Map<String, Object> attributes,
                  List<TreeVo<T>> children, boolean isParent, boolean isChildren, String parentID) {
		super();
		this.id = id;
		this.text = text;
		this.state = state;
		this.checked = checked;
		this.attributes = attributes;
		this.children = children;
		this.hasParent = isParent;
		this.hasChildren = isChildren;
		this.parentId = parentID;
	}

	public TreeVo() {
		super();
	}

}

3.4 PermissionAction类

该类继承了ActionSupport类并且实现了ModelDriver接口
package com.zking.web;

import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.zking.dao.PermissionDao;
import com.zking.entity.Permission;
import com.zking.framework.ActionSupport;
import com.zking.framework.ModelDriver;
import com.zking.util.ResponseUtil;
import com.zking.util.TreeVo;

public class PermissionAction extends ActionSupport implements ModelDriver<Permission> {
	private Permission p = new Permission();
	private PermissionDao pd = new PermissionDao();
	
	public void menus(HttpServletRequest req, HttpServletResponse resp) {
		try {
			List<TreeVo<Permission>> menus = pd.menus(null, null);
			ResponseUtil.writeJson(resp, menus);
		
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	@Override
	public Permission getModel() {
		// TODO Auto-generated method stub
		return p;
	}

}

4.监听选项卡的切换事件

 element.tabChange('demo', id); //切换到:用户管理

5.运行和测试

在这里插入图片描述

如此简单,我们就成功地使用.LayUI实现了动态选项卡Tab的功能!你可以根据需要添加更多的选项卡项,并在其中放置自己的内容。此外,.LayUI还提供了其他丰富的方法和事件,可以根据你的项目需求进行定制和扩展。

6.总结:

通过本文,我们了解了如何使用.LayUI来创建动态选项卡Tab,并展示了其强大的功能。借助.LayUI框架提供的丰富组件和灵活的API,我们可以轻松实现动态选项卡Tab,为用户提供更好的使用体验。希望这篇博客对你有所帮助,祝你在Web开发中取得成功!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/754739.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【导航地图DB】

地图DB概述 车载导航地图DB 主要侧重道路交通网&#xff0c;并从实用性、加快检索速度和减少数据容量的角度来考虑&#xff0c;有自己特有格式的电子地图。 含有空间位置地理坐标&#xff0c;能够与空间定位系统结合&#xff0c;准确引导人或交通工具从出发地到达目的地的电子…

ylb-接口10用户登录

总览&#xff1a; 在api模块下的service包&#xff0c;补充用户接口&#xff08;UserService&#xff09;&#xff1a;用户登录 package com.bjpowernode.api.service;import com.bjpowernode.api.model.User; import com.bjpowernode.api.pojo.UserAccountInfo;public inte…

运维小知识(三)——BIOS密码忘记怎么办(一键清除)

&#x1f349;&#x1f349;问题 为了防止恶意更改BIOS程序&#xff0c;一些人会设置BIOS密码&#xff0c;但这个密码若不常用的话会被人遗忘&#xff0c;或者一台旧电脑&#xff0c;需要重装系统&#xff0c;没有BIOS密码怎么办&#xff1f;有没有童靴遇到过&#xff0c;网上找…

bash脚本文件windows上的和linux上格式不同问题

脚本执行时报&#xff1a; syntax error: unexpected end of file&#xff0c;由于脚本是给定的。之前没有考虑这个问题&#xff0c;后查阅资料发现问题如下&#xff1a; 可能发生场景&#xff1a;windows环境编辑/生成的shell脚本&#xff0c;在linux系统上运行时报错 编辑和…

备战秋招009(20230714)

文章目录 前言一、Java内存区域1、JVM组成部分2、运行时数据区域01、基础02、程序计数器03、虚拟机栈04、本地方法栈05、堆06、方法区07、直接内存 3、HotSpot虚拟机对象01、对象的创建02、内存分配03、内存布局04、访问定位 二、垃圾回收1、堆空间01、空间结构02、GC 分类03、…

linux之vscod编译源代码

vscode想要编译c/c程序 在本地的linux上首先要安装gcc与g编译器&#xff0c;因为这个后面会写到配置文件里面去 先在这个软件里面安装上c/c的扩展插件&#xff0c;然后当我们开始编译c/c程序的时候 会自动生成一个.vscode目录 然后先来看一个配置文件launch.json的配置文件…

【观察】杉数科技:释放智能决策“乘数效应”,驱动智能制造高质量增长

毫无疑问&#xff0c;中国制造业在时代背景与国家政策的双重驱动下&#xff0c;正加速向数智化转型&#xff0c;而以数据驱动的智能决策也正成为制造业资源优化配置的“利器”&#xff0c;通过端到端的数据深度感知与决策优化&#xff0c;显然能够将工业和制造业的数据价值发挥…

波奇学Linux: sudo提权,gcc编译,动静态链接,debug版本

sudo给普通用户提权 在root用户下输入 vim /etc/sudoers 添加白名单&#xff0c;名单上的用户可以用root权限运行 gcc和g编译c和c文件 g可以编译c和c文件 gcc只能编译c文件 ./a.out 执行a.out可执行文件 通过g编译器展示预处理->编译->汇编->链接的文件 预处理&am…

甲骨文注册

1、去官网注册 https://www.oracle.com/cn/cloud/free/ 2、邮箱验证填写注册信息 选择区域再点继续 申请失败MD&#xff0c;成功再更新&#xff01;

Java数据结构与算法:稀疏数组(SparseArray)

编译软件&#xff1a;IntelliJ IDEA 2019.2.4 x64 操作系统&#xff1a;win10 x64 位 家庭版 文章目录 一、稀疏数组是什么&#xff1f;1.1 基本介绍1.2 稀疏数组的处理方法1.3 举例说明 二、为什么要使用稀疏数组&#xff1f;2.1 先看这一个具体的应用需求问题解决方案 2.2 使…

SpringBoot学习——项目用maven打包成jar包 windows + Linux平台运行 Linux安装java 遇到的问题

目录 引出认识maven以及packageMaven 构建生命周期package&#xff1a;打包&#xff0c;打包成jar包和使用&#xff08;1&#xff09;引入maven插件&#xff08;2&#xff09;打包jar包 windows平台运行jar包1.windows下安装java环境2.直接运行一个jar包 Linux平台运行jar包1.L…

RocketMQ 为何性能高

本文主要从性能角度考虑 RocketMQ 的实现。 整体架构 这是网络上流行的 RocketMQ 的集群部署图。 RocketMQ 主要由 Broker、NameServer、Producer 和 Consumer 组成的一个集群。 **NameServer&#xff1a;整个集群的注册中心和配置中心&#xff0c;管理集群的元数据。包括 T…

将本地MySql数据库导入到linux服务器上

首先 你的linux服务器上需要有MySql 如果您还没有安装 可以参考我的文章 在阿里云linux上安装MySql数据库 然后 我们在本地打开MySql的管理工具 我这里使用的 Navicat for MySQL 右击需要导入的数据库 如下图操作 选择一个目录存放文件 然后点击开始 走完一次之后点击关闭 查…

【多线程系列-01】深入理解进程、线程和CPU之间的关系

深入理解进程线程的关系 一&#xff0c;深入理解进程、线程与CPU之间的关系1&#xff0c;进程与线程1.1&#xff0c;进程与线程的关系1.2&#xff0c;在java中进程与线程的关系 2&#xff0c;进程间的通信方式2.1&#xff0c;管道2.2&#xff0c;信号2.3&#xff0c;消息队列2.…

taro-ui-vue3 的虚拟列表组件VirtualScroll

项目&#xff1a;taro3vue3 用法&#xff1a; <at-virtual-scrollbench"5":height"listHeight":items"fieldList":item-height"itemHeight" ><template #default"{ index, item }"><view :id"merchan…

【力扣算法12】之 11. 盛最多水的容器 python

文章目录 问题描述示例1示例2提示 思路分析代码分析完整代码详细分析运行效果截图调用示例运行结果完结 问题描述 给定一个长度为 n 的整数数组 height 。有n条垂线&#xff0c;第i条线的两个端点是(i, 0)和(i, height[i])。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构…

SQL 优化换汤不换药的时代变了与SQL审核

开头还是介绍一下群&#xff0c;如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题&#xff0c;有需求都可以加群群内有各大数据库行业大咖&#xff0c;CTO&#xff0c;可以解决你的问题。加群请联系 liuaustin3 &#xff0c;在新加的朋友会分到3群&#xff08;共…

Kubernetes轻量级日志工具Loki安装及踩坑记录

Loki简介 Loki是Grafana出品的一个轻量级日志系统&#xff0c;熟悉ELK的都知道ELK使用起来的成本&#xff0c;而且仅仅是日志检索使用ELK的话有点大材小用了。Loki8技术栈中使用了以下组件。 Promtail 用来将容器日志发送到 Loki 或者 Grafana 服务上的日志收集工具&#xff0c…

谷歌Bard更新中文支持;GPT-4:1.8万亿参数、混合专家模型揭秘; Meta推出商用版本AI模型

&#x1f989; AI新闻 &#x1f680; 谷歌的AI聊天工具Bard更新&#xff0c;增加中文支持 摘要&#xff1a;谷歌的AI聊天工具Bard新增中文环境&#xff0c;用户可以使用简体和繁体中文进行交流。然而&#xff0c;与竞品相比&#xff0c;Bard的回复略显生硬&#xff0c;语义理…

C# Winfrom将DataGridView数据导入Excel

1.项目添加Word和Excel的COM类型库引用 2.创建Excel工作表 //定义Excel操作对象Microsoft.Office.Interop.Excel.Application excelApp new Microsoft.Office.Interop.Excel.Application();//定义Excel工作表Microsoft.Office.Interop.Excel.Worksheet worksheet excelApp.Wo…