本次项目使用到layui以下将对其进行总结
https://www.layui.com/
附上layui网站
- layui的基础引用
- layui–upload文件上传
- layui–form表单
- layui–rate评分
- layui–table表格(针对传输数据同官方文档不同)
- layui–layer弹出层
- layui-导航
一、layui的基础引用
npm i layui -S
安装全局
1、模块化的使用(官方推荐)
./layui/css/layui.css
./layui/layui.js
*引入这两个文件
遵循 layui 的模块规范建立一个入口文件,并通过 layui.use() 方式来加载该入口文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>模块化的使用</title>
<link rel="stylesheet" href="./layui/css/layui.css">
<!--引入这个JS-->
<script type="text/javascript" src="./layui/layui.js"></script>
</head>
<body>
<script>
//必须使用这个方法先引用对应的模块
layui.use(['layer'],function () {
var layer = layui.layer;
layer.alert("xxxxxxxxxxxxxxxxxxxxxxxx")
})
</script>
</body>
</html>
/**
* 一次性自调函数初始化两个全局变量
*/
var layer,form;
(function () {
layui.use(['layer','form'],function () {
layer=layui.layer,form=layui.form;
})
})();
/**
* 页面加载完成后执行一些函数
*/
$(function () {
layer.msg("消息框")
});
根据官方文档阐述,这样的办法可以在需要他的时候进行加载。
当然也可以非模块化,一次性加载完成
2、非模块化使用
注意:引入的JS是 /layui/layui.all.js
<script src="../layui/layui.all.js"></script>
<script>
function(){
//无需再执行layui.use()方法加载模块,直接使用即可
var form = layui.form
,layer = layui.layer;
}();
</script>
二、layui–upload文件上传
本次项目是采用本地图片上传,通过formdata的方式进行文件上传
html
<div class="layui-upload">
<button type="button" class="layui-btn our-btn our-up-btn" id="upicon">
上传图片
</button>
<div class="layui-upload-list">
<img class="layui-upload-img our-img our-up-img" id="imgBox" />
</div>
</div>
js
// 公用上传图片
//定义全局图片上传
(function () {
layui.use('upload',function () {
upload = layui.upload;
})
})();
//页面加载完成后引用图片上传函数;
$(function(){
golayuiUpload('#upicon', '#imgBox', "icon");
})
//封装公用 golayuiUpload(按钮, 图片展示区域, 图片的field名)
function golayuiUpload(btnId, imgShowId, imgName) {
let uploadInst = upload.render({
elem: btnId
, auto: false
, field: imgName
, choose: function (obj) {
//预读本地文件
obj.preview(function (index, file, result) {
// $(imgShowId).append('<img src="' + result + '" alt="' + file.name + '" class="layui-upload-img">') //展示文件名
layui.use('jquery', function () {
var $ = layui.$ //重点处
$(imgShowId).attr('src', result)
});
})
}
});
}
FormData格式的提交表单,要求将form表单元素的name与value进行组合
三、layui–form表单
layui封装了一套表单提交的简单方法,只要按照layui规定的html就能实现简单的formdata提交;
1、普通方法的提交(非formdata格式)
<form action="url" method="POST">
用户名:<input type="text" name="username">
密码:<input type="password" name="password">
<input type="submit" value="提交">
</form>
2、formdata格式提交(非layui)
html
<form action="url" method="POST" enctype="multipart/form-data" id="myform">
用户名:<input type="text" name="username">
密码:<input type="password" name="password">
<input type="submit" value="提交">
</form>
ajax带上FormData
$("#btnUp").click(function () {
var myform = new FormData($("#myform"));
//新增
var input = '<input type="text" name="code">';
myform.append(input);
//定义myform.append('name',value);
myform.append('kind',1);
myform.append('avg_price',666);
//传输
$.ajax({
url: "",
type: "post",
data: myform,
processData: false,
contentType: false,
success: function (res) {
console.log("res")
}
})
})
3、layui的formdata
html
此为官方文档提供的表单,只要按照这个格式,就能通过data. 获取到值
<form class="layui-form"> <!-- 提示:如果你不想用form,你可以换成div等任何一个普通元素 -->
<div class="layui-form-item">
<label class="layui-form-label">输入框</label>
<div class="layui-input-block">
<input type="text" name="" placeholder="请输入" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">下拉选择框</label>
<div class="layui-input-block">
<select name="interest" lay-filter="aihao">
<option value="0">写作</option>
<option value="1">阅读</option>
</select>
</div>
</div>
<div class="layui-form-item">
<div class="layui-input-block">
<button class="layui-btn" lay-submit lay-filter="givebTN">立即提交</button>
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
</div>
</div>
</form>
js
layui.use('form', function () {
var form = layui.form;
//'submit(givebTN)对应的是lay-filter="givebTN";
form.on('submit(givebTN)', function (data) {
//console.log(data.form) //被执行提交的form对象,一般在存在form标签时才会返回
//console.log(data.field) //当前容器的全部表单字段,名值对形式:{name: value}
//封装函数见下面 new FormData(data.form)转化为formdata格式
myTAjaxGive('post', '/store/storeupdateinfo/', new FormData(data.form), giveOK);
return false;
});
});
封装ajax 传输格式为formdata
//传输数据的give带token giveAjax("get/post", "/url/", 传到数据库的对象, 结果函数的方法名);
function myTAjaxGive(type, url, data, fn) {
Promise.all([
$.ajax({
url: "url路径" + url,
type: type,
data: data,
processData: false,
contentType: false
})
]).then(
resolve => { //成功的时候
return fn(resolve);
},
reject => { //失败
rejectTime(reject);
}
);
}
ps:文件上传在layui中虽然是独立的模块,但是其如果也在表单中的话,也是可以随着表单建立formData对象的。故此只需要将其模块中的提交去掉,从而用ajax来提交formDate表单就可以了。(见二、)
笔记(layui里的select)
layui里的select,html只有select和option
如下
<div class="layui-form-item">
<label class="layui-form-label">下拉选择框</label>
<div class="layui-input-block">
<select name="interest" lay-filter="aihao" id="selectBox>
<option value="0">写作</option>
<option value="1">阅读</option>
</select>
</div>
</div>
但是在实际的html中会生成一个input标签;
在动态生成下拉框时,就需要注意了
// 省市联动
// AJAX请求页面
$(document).ready(function () {
getDataList();
});
// 请求市区
function getDataList() {
// 请求
$.ajax({
type: "get",
url: ''url路径'',
success: function (res) {
showSelect(res);
}
});
}
// 展示页面
function showSelect(res) {
let str;
for (let i = 0; i < res.data.length; i++) {
str += `
<option value="${res.data[i].id}">${res.data[i].name}</option>
`;
}
$("#selectBox").append(str);
layui.use("form", function () {
let form = layui.form;
form.render(); //更新全部
form.render('select'); //刷新select选择框渲染
});
}
总结一下:在layui的表单当中,一定要按照官方文档给出的格式,在使用formdata格式传输数据时,要 new FormData();在ajax中processData: false,contentType: false;
四、layui–rate评分
<body>
<div id="test1"></div>
<script src="../src/layui.js"></script>
<script>
layui.use('rate', function(){
var rate = layui.rate;
//渲染
var ins1 = rate.render({
elem: '#test1' //绑定元素
});
});
</script>
</body>

value可以获取到评星的值
五、layui–table表格
不得不表演说一下layui的表格用得好,简直是前端数据渲染的福音,怪说不得官方介绍layui是----’‘准确地说,她更多是为服务端程序员量身定做,你无需涉足各种前端工具的复杂配置,只需面对浏览器本身,让一切你所需要的元素与交互,从这里信手拈来。’’ O(∩_∩)O服气!!
想要什么样的表格
直接通过查看代码就Okla~
我主要是通过实际数据传输的不同;来编写基础表格
截取了一段获取到的数据
在实际的获取数据中发现,数据嵌套多个,返回code是200;数据的名称也大不相同,我们看下官方数据格式
值得注意的是官方给出的是code为0;数据在data中并且没有数据的嵌套,于是乎,我们要做的就是把我们的数据进行改装,改成官方文档的样子
就需要用到官方问题提供的parseData;
, parseData: function (res) { //res 即为原始返回的数据!!!重要
var my_data = {
"code": 0, //解析接口状态;将200改为0;
"msg": res.msg, //解析提示文本
"count": res.data.count, //解析数据长度;分页器需要
"data": res.data.commodity_comment//解析数据列表;data>commodity_comment包裹着需要的数据
};
return my_data;//返回数据
}
当遇到列表下嵌套数据就需要使用templet重新定义field了
{ field: 'task_num', title: '订单编号', width: 100, fixed: 'left', unresize: true, sort: true }
, {title: '订单标题', width: 125, edit: 'text', templet: function (data) { return data.commodity.name}}
总结一下对于layui可以直接通过官方文档来写表格,在获取数据的时候需要关注你自己本身返回的数据;可以通过,done:function(res){console.log(res)}来查看返回的数据;通过parseData来调试匹配到官方相同的返回数据格式;
po上实现代码
// 上部模糊查询区域
layui.use(['laydate', 'form'], function () {
var laydate = layui.laydate;
//日期选择器
laydate.render({
elem: '#down'
, range: true
, done: function (value, date) {
date__gte = value.substring(0, 10);
date__lte = value.substring(13, 23);
}
});
// 后台传输数据
var form = layui.form;
form.on('submit(findSql)', function (data) {
let date__gte = data.form[2].value.substring(0, 10);
let date__lte = data.form[2].value.substring(13, 23);
urlBox = `?date__gte=${date__gte}&date__lte=${date__lte}&status=${statusVal}&name=${data.field.name}&task_num=${data.field.task_num}`
tableGO();//下部分数据渲染
return false; //阻止表单跳转。如果需要表单跳转,去掉这段即可。
});
})
//下部分数据表格
tableGO();
function tableGO() {
layui.use('table', function () {
var table = layui.table;
table.render({
elem: '#IMform' //表格id
, url:"url路径"
, toolbar: '#toolbarDemo' //绑定工具条模板。可在每行对应的列中出现一些自定义的操作性按钮
, headers: { "Authorization": "Bearer " + sessionStorage.getItem("tokenValSmall") } //头部
, title: '订单数据表'
, loading: true
, parseData: function (res) { //res 即为原始返回的数据!!!重要
var my_data = {
"code": 0, //解析接口状态
"msg": res.msg, //解析提示文本
"count": res.data.count, //解析数据长度
"data": res.data.results //解析数据列表
};
return my_data;
}
, cols: [[
{ type: 'checkbox', fixed: 'left' }
, { field: 'task_num', title: '订单编号', width: 100, fixed: 'left', unresize: true, sort: true }
, {
title: '订单标题', width: 125, edit: 'text', templet: function (data) {
return data.commodity.name
}
}
, {
title: '买家姓名', width: 110, edit: 'text', templet: function (data) {
return data.user.username
}
}
, { field: 'create_time', title: '下单时间', width: 100, sort: true }
, { field: 'price', title: '支付金额', width: 100, sort: true }
, {
title: '买家地址', width: 180, templet: function (data) {
return data.user.address_detail
}
}
, { fixed: 'right', title: '操作', toolbar: '#barDemo', width: 150 }
]]
, page: true // 允许翻页
});
// 监听行工具事件
table.on('tool(IMform)', function (obj) {
var data = obj.data;
if (obj.event === 'del') {
layer.confirm('真的拒单么?', function (index) {
obj.del();
var dataVal = new FormData();
dataVal.append('status', 4);
myTAjaxGive("post", "/store/storetaskupdate/" + data.id + "/", dataVal, closeIndex);
function closeIndex() {
layer.msg('拒单成功', { icon: 1 });
}
layer.close(index);
});
} else if (obj.event === 'detail') {
layui.use('table', function () {
// 查看信息
layer.open({
type: 1
, title: "订单详情"
, content: '<div style="padding: 20px 100px;">' + "用户姓名:" + data.commodity.name + "<br/>用户具体信息:" + data.commodity.intro +
"<br/>用户联系方式:" + data.user.phone + "<br/>用户地址:" + data.user.address_detail +
'</div>'
, btn: '确认接单'
, btnAlign: 'c' //按钮居中
, shade: 0 //不显示遮罩
, yes: function () {
var dataVal = new FormData();
dataVal.append('status', 1);
myTAjaxGive("post", "/store/storetaskupdate/"+data.id+"/", dataVal,showfn)
layer.closeAll();
}
});
})
}
});
});
}
六、layui–layer弹出层
没什么好说的~O(∩_∩)O好用;看官方文档快速操作
小笔记
parent.location.reload()刷新父亲对象(用于框架);页面刷新;
layui.use(‘layer’, function(){
var layer = layui.layer;
layer.open({
layer提供了5种层类型。可传入的值有:0(信息框,默认)1(页面层)2(iframe层) 3(加载层)4(tips层)。 若你采用layer.open({type: 1})方式调用,则type为必填项(信息框除外);
content: ‘文字’ / ‘url网页链接’ / ${数据拼接}。。。
})
})
七、layui-导航
https://www.layui.com/doc/element/nav.html
见官方文档~~~
( ఠൠఠ )ノok ~
all in all;
layui好用的时候简直像爸爸,不好用的时候分分钟要叉人啊哈哈
强烈推荐看官方文档讲得很清楚!!
https://www.layui.com/
崇拜贤心?????