Layui
layui是一款采用自身模块规范编写的前端 UI 框架,遵循原生 HTML/CSS/JS 的书写与组织形式,门槛极低,基本都是套用内容。但是想用它,必须要按照他的规矩来,毕竟拿人的手短。
预先加载模块
layui 通过 use 方法加载模块。当你的 JS 需要用到 layui 模块的时候,且避免到处写 layui.use() 的麻烦。你应该在最外层如此定义:
layui.use(['form', 'upload'], function(){ //如果只加载一个模块,可以不填数组。如:layui.use('form') var form = layui.form //获取form模块 var upload = layui.upload; //获取upload模块 //监听提交按钮 form.on('submit(test)', function(data){ console.log(data); }); });
获取模块的命名规则
layui.use(['form', 'upload'], function(){ var a=layui.a; })
交互数据格式
layui有自己的一套特定的数据格式交互,而且必须有值
默认的数据格式
字段 | 说明 | 值 |
---|---|---|
code | 状态码(成功 0,失败其他) | int |
msg | 错误提示 | string |
count | 总数 | int |
data | 实体对象的集合 | object[] |
也就是说你从后台返回的值必须是下面这个样子的
{ "code": 0, "msg": "", "count": 1000, "data": [{}, {}] }
其他情况
如果你的字段名称不同于默认的字段,需要借助parseData将其解析成table所规定的数据格式
{ "status": 0, "message": "", "total": 180, "data": { "item": [{}, {}] } } //如果你的字段名称和默认字段不一样,你需要进行以下操作 table.render({ elem: '#demp' ,url: '' ,parseData: function(res){ //res 即为原始返回的数据 return { "code": res.status, //解析接口状态 "msg": res.message, //解析提示文本 "count": res.total, //解析数据长度 "data": res.data.item //解析数据列表 }; } });
拼接
在使用Layui对表格进行渲染的过程中,你可能会遇到多个字段放在同一栏的情况,这时候就需要使用拼接,这里直接使用代码演示。
//多个字段拼接 {field:'area',title:'房屋名称', width:200, templet:function (d) { //templet可以进行方法的编写 return d.area + '-' + d.ased + '-' + d.aasd; // return d.area+"我是啦啦啦"; //拼接字符 } }
模板templet
layui中有很多模板,但是这些模板并不能完全满足于我们的需求,就比如我们想要展示一些数据,但是这些数据不是我们想要的数据或者不是我们想要的样子,我们就可以通过templet在前台进行更改。
就比如我们从后台传输过来的日期格式是String,但这个String中存储的却是时间戳。
//时间戳:1635264000 时间:2021-10-27 //这就是在表格中将时间戳1635264000转化为了2021-10-27 templet: "<div>{{layui.util.toDateString(1635264000,'yyyy-MM-dd')}}</div>" //在正式使用中,你可以将1635264000换成你的字段名,这样的话可以将你的字段的值自动转化 //这里我就是将我的ctime转换成了日期格式 field:'ctime', title:'签署时间', width:200, templet: "<div>{{layui.util.toDateString(d.ctime,'yyyy-MM-dd')}}</div>"
弹窗
基础语法
layui.use('layer',function(){ var layui = layui.layer; layer,msg('HELLO WORLD'); })
弹窗嵌套
这里说下type的意思 他代表着你弹出层的类型 共5个数字
-
0是默认 一般是信息
-
1是页面层 一般弹出写好的html代码
-
2是iframe层 这里内容是一个地址 ,引入别的页面 注意:这里的地址是controller的地址
-
3是加载层 一般是加载动画
-
4是tips层 一般是弹出提示
//使用方式 table.on('tool(test)', function(obj){ var data = obj.data; if(obj.event === 'det'){ open("详情页面",'/static/view/contract/details.html?cid='+data.cid); } else if(obj.event === 'upd'){ open("修改页面","/static/view/contract/update.html?cid="+data.cid); } }); function open (title,url) { layer.open({ type: 2, // 2 - url content: url, // 弹出层的 url []不出现滚动,'no' area: ["400px", "530px"], // 大小 title: title, // 定义弹出层名称 fixed: false, // 鼠标滚动时,层是否固定在可视区域 //maxmin: true, // 最大小化按钮 shadeClose: true, //是否点击遮罩关闭 cancel: function () { //请求回调,右上角关闭执行return false开启该代码可禁止点击该按钮关闭 }, success: function (layero, index) { //请求回调,打开窗口时执行 }, end: function () { //请求回调,窗口销毁时执行 location.reload(); //窗口销毁时刷新主页面数据 } }) }
表格
<table class="layui-hide" id="test" lay-filter="test"></table> layui.use('table', function(){ var table = layui.table; var $=layui.$; table.render({ elem: '#test' ,url:'/ContractServlet?method=queryAll' ,method: 'post' ,page: true //开启分页 ,toolbar: '#toolbarDemo' //开启头部工具栏,并为其绑定左侧模板 ,id:'testReload' ,title: '用户数据表' ,cols: [[ {type: 'checkbox', fixed: 'left'} ,{field:'cid', title:'ID', width:80, unresize: true, sort: true} ,{field:'harea',title:'房屋名称', width:200} ,{field:'lname', title:'租户名称', width:200} //edit: 'text' 开启页面修改 ,{field:'crental', title:'总金额', width:100} ,{field:'ccash', title:'押金', width:100} ,{field:'cname', title:'签署人', width:200} ,{field:'ctime', title:'签署时间', width:200, templet: "<div>{{layui.util.toDateString(d.ctime,'yyyy-MM-dd')}}</div>" } ,{fixed: 'right', title:'操作', toolbar: '#barDemo', width:200} ]] , parseData: function (rs) {//数据格式解析 console.log(rs); if (rs.code == 0) { return { "code": rs.code, "msg": rs.msg, "count": rs.data.totalCount, "data": rs.data } } } }); })
表单
<form class="layui-form" action=""> <div class="layui-form-item layui-form-text"> <label class="layui-form-label">文本域</label> <div class="layui-input-block"> <textarea name="desc" placeholder="请输入内容" class="layui-textarea"></textarea> </div> </div> <div class="layui-form-item"> <label class="layui-form-label">输入框</label> <div class="layui-input-block"> <input type="text" name="title" required lay-verify="required" placeholder="请输入标题" autocomplete="off" class="layui-input"> </div> </div> <div class="layui-form-item"> <label class="layui-form-label">复选框</label> <div class="layui-input-block"> <input type="checkbox" name="like[write]" title="写作"> <input type="checkbox" name="like[read]" title="阅读" checked> <input type="checkbox" name="like[dai]" title="发呆"> </div> </div> <div class="layui-form-item"> <label class="layui-form-label">选择框</label> <div class="layui-input-block"> <select name="city" lay-verify="required"> <option value=""></option> <option value="0">北京</option> <option value="1">上海</option> <option value="2">广州</option> <option value="3">深圳</option> <option value="4">杭州</option> </select> </div> </div> <div class="layui-form-item"> <div class="layui-input-block"> <button class="layui-btn" lay-submit lay-filter="formDemo">立即提交</button> <button type="reset" class="layui-btn layui-btn-primary">重置</button> </div> </div> </form> <script> //Demo layui.use('form', function(){ var form = layui.form; //监听提交 form.on('submit(formDemo)', function(data){ layer.msg(JSON.stringify(data.field)); return false; }); }); </script>
日期
在项目中,会用到时间格式,选择对应的时间
比如:合同签署时间
<input type="text" class="layui-input" id="test1">
在layui里,已经封装了一个时间框,用法如下:
laydate.render({ elem: '#test1' //指定元素 type:'year' //年选择器 });
elem
必填项,用于绑定执行日期渲染的元素,值一般为选择器,或DOM对象
type
type可选值 | 名称 | 用途 |
---|---|---|
year | 年选择器 | 只提供年列表选择 |
month | 年月选择器 | 只提供年、月选择 |
date | 日期选择器 | 可选择:年、月、日。type默认值,一般可不填 |
time | 时间选择器 | 只提供时、分、秒选择 |
datetime | 日期时间选择器 | 可选择:年、月、日、时、分、秒 |
表单效验(lay-verify)
Layui自带表单效验功能,可以验证输入信息的问题
layui表单元素效验需要在元素上加入lay-verify 如:
<input type="text" name="ctime" id="ctime" lay-verify="required" class="layui-input">
格式
单条默认规则:lay-verify=“验证A”
多条默认规则:lay-verify=“验证A|验证B” (多条使用|来隔开)
默认
目前layui提供了以下规则
元素 | 效验的对象 |
---|---|
required | 必填项 |
phone | 手机号 |
邮箱 | |
url | 网址 |
number | 数字 |
data | 日期 |
identity | 身份证 |
自定义
同样的,在layui中支持自定义效验方法
//调用自定义效验form.verify() form.verify({ //这里的username,pass随便设置了 username: function(value, item){ //value:表单的值、item:表单的DOM对象 if(!new RegExp("^[a-zA-Z0-9_\u4e00-\u9fa5\\s·]+$").test(value)){ return '用户名不能有特殊字符'; } if(/(^\_)|(\__)|(\_+$)/.test(value)){ return '用户名首尾不能出现下划线\'_\''; } if(/^\d+\d+\d$/.test(value)){ return '用户名不能全为数字'; } } //我们既支持上述函数式的方式,也支持下述数组的形式 //数组的两个值分别代表:[正则匹配、匹配不符时的提示文字] ,pass: [ /^[\S]{6,12}$/ ,'密码必须6到12位,且不能出现空格' ] }); //使用自定义效验的方式等同于默认方式
正则表达式
既然上面提到了正则表达式,下面简单提一下正则表达式
普通字符
字符 | 描述 |
---|---|
[ ] | 匹配[ ]中的所有字符 |
[^] | 匹配除了[^]中的所有字符 |
[A-Z] [a-z] [0-9] | 匹配所有大写字母 小写字母 0-9的整数 |
[\s\S] | 匹配所有 \s是匹配所有空白符 \S是非空白符 |
[\w] | 匹配字母、数字、下划线 |
限定符
字符 | 描述 |
---|---|
* | 匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。* 等价于{0,}。 |
+ | 匹配前面的子表达式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于 {1,}。 |
? | 匹配前面的子表达式零次或一次。例如,"do(es)?" 可以匹配 "do" 、 "does" 中的 "does" 、 "doxy" 中的 "do" 。? 等价于 {0,1}。 |
{n} | n 是一个非负整数。匹配确定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个 o。 |
{n,} | n 是一个非负整数。至少匹配n 次。例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o。'o{1,}' 等价于 'o+'。'o{0,}' 则等价于 'o*'。 |
{n,m} | m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,"o{1,3}" 将匹配 "fooooood" 中的前三个 o。'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。 |
特殊字符
特别字符 | 描述 |
---|---|
$ | 匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性,则 $ 也匹配 '\n' 或 '\r'。要匹配 $ 字符本身,请使用 $。 |
( ) | 标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。要匹配这些字符,请使用 ( 和 )。 |
* | 匹配前面的子表达式零次或多次。要匹配 * 字符,请使用 *。 |
+ | 匹配前面的子表达式一次或多次。要匹配 + 字符,请使用 +。 |
. | 匹配除换行符 \n 之外的任何单字符。要匹配 . ,请使用 . 。 |
[ | 标记一个中括号表达式的开始。要匹配 [,请使用 [。 |
? | 匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。要匹配 ? 字符,请使用 \?。 |
\ | 将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。例如, 'n' 匹配字符 'n'。'\n' 匹配换行符。序列 '\' 匹配 "",而 '(' 则匹配 "("。 |
^ | 匹配输入字符串的开始位置,除非在方括号表达式中使用,当该符号在方括号表达式中使用时,表示不接受该方括号表达式中的字符集合。要匹配 ^ 字符本身,请使用 \^。 |
{ | 标记限定符表达式的开始。要匹配 {,请使用 {。 |
| | 指明两项之间的一个选择。要匹配 |,请使用 |。 |
非打印字符
字符 | 描述 |
---|---|
\cx | 匹配由x指明的控制字符。例如, \cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 'c' 字符。 |
\f | 匹配一个换页符。等价于 \x0c 和 \cL。 |
\n | 匹配一个换行符。等价于 \x0a 和 \cJ。 |
\r | 匹配一个回车符。等价于 \x0d 和 \cM。 |
\s | 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。注意 Unicode 正则表达式会匹配全角空格符。 |
\S | 匹配任何非空白字符。等价于 \f\n\r\t\v。 |
\t | 匹配一个制表符。等价于 \x09 和 \cI。 |
\v | 匹配一个垂直制表符。等价于 \x0b 和 \cK。 |