效果图
效果描述: 可以点击,无线下拉,根据用户接口异步加载数据
使用: layui/tree.js
以前使用layui不是看官网就是看其他人的代码,最后还不如自己扒源码来的舒服,
只要源码看懂了,还怕工具用不好吗????!
虽然当前还没有看懂,但是这在努力看,理解中,
在实现过程中,由于效果的问题,将tree.js改成了treeS.js,模块名改成treeS。
配置项看源码比较好,虽然源码都是a,b,c这种,但是涉及到css、html还是需要写完整的。
html:
<div class="layui-unselect layui-form-select downpanel">
<div class="layui-select-title">
<span class="layui-input layui-unselect"
id="treeclass"
style="line-height: 36px;">--请选择--</span>
<input id="pid" type="hidden"
name="selectID" value="0">
<i class="layui-edge"></i>
</div>
<dl class="layui-anim layui-anim-upbit">
<dd>
<ul id="tree-unit" class="my-tree"></ul>
</dd>
</dl>
</div>
<script src="../../layui/layui.js"></script>
<script src="../../assets/js/jquery-2.0.3.min.js"></script>
<script src="../../js/jquery/mustache.js"></script>
js:
var treeIndex = -1 // 初始化
// 请求数据(第一级)
var treeList = data;
treeList = [{
"id": "4", // 区分
"pid": "4",
"name": "墨家",
"isUser": 0, // 标记是否为用户还是组织
"isShare": null // 是否已经分享过,用来初始化select的值+选择提交
}, {
"id": "3",
"pid": "3",
"name": "盖聂",
"isUser": 1,
"isShare": null
},
{
"id": "0",
"pid": "0",
"name": "荆轲",
"isUser": 1,
"isShare": null
}, {
"id": "2",
"pid": "2",
"name": "法家",
"isUser": 0,
"isShare": null
}]
treeList = mapSelectTree(treeList)
var _this = this
if (_this.treeIndex === -1) {
renderTree(treeList)
} else {
_this.treeIndex.reload({ data: treeList });
}
renderTree = function(treeList) {
// 为防止污染原来的tree,改名叫treeS
layui.use(['treeS'], function () {
var treeS = layui.treeS;
_this.treeIndex = treeS.render({
elem: '#tree-unit',
id: 'treeId',
showCheckbox: true,
data: treeList,
drag: true,
onlyIconControl: false,
text: {
defaultNodeName: '无数据',
none: '无数据'
},
click: function (node) {
if (node.state === 'close' && node.data.isUser === 0) {
// 请求后台,加载数据
var items = [{
"id": "40288c88727d43ff01727dea9e210001",
"pid": "4028fc8a705d46d001705d51675d0001",
"name": "韩非",
"isUser": 1,
"isShare": null
}, {
"id": "40288c88727d43ff01727dea9e210001",
"pid": "4028fc8a705d46d001705d51675d0001",
"name": "小组织",
"isUser": 0,
"isShare": null
}]
items = mapSelectTree(items) // 过滤数据,给数据项加上checked、spread、title、children属性
node.data.spread = true
node.data.children = items
_this.treeIndex.reload()
} else {
node.data.spread = false
_this.treeIndex.reload()
}
return true // 好像没作用
},
oncheck: function (node) { // 看到最后才知道这个事件,找了半天点击checkbox的事件 T……T
node.data.checked = true
if (treeIndex !== -1) {
setSelectChecked() // 将选中的数据显示到select中
}
}
})
// 绑定下拉菜单事件
$(".downpanel").on("click", ".layui-select-title", function (e) {
$(".layui-form-select").not($(this).parents(".layui-form-select")).removeClass("layui-form-selected");
$(this).parents(".downpanel").toggleClass("layui-form-selected");
layui.stope(e); // 阻止事件冒泡
});
$('.downpanel .layui-anim-upbit').unbind()
$('.downpanel .layui-anim-upbit').bind('click', function (e) {
layui.stope(e);
})
$(document).on("click", function (e) {
$(".layui-form-select").removeClass("layui-form-selected");
});
setSelectChecked() // 初始化
})
}
setSelectChecked = function(){
var checked = treeIndex.getChecked()
var nameStr = checked.map(function (obj, index) {
return obj.name;
}).join(',');
if (nameStr === '') {
nameStr = '--请选择--'
}
var $select = $('#tree-unit').parents(".layui-form-select");
$select.find(".layui-select-title span").html(nameStr);
}
mapSelectTree = function (list, level) {
for (var i = 0; i < list.length; i++) {
list[i]['title'] = list[i]['name']
list[i]['spread'] = false
list[i]['field'] = level
if (list[i].isChecked === 1) {
list[i]['checked'] = true
} else {
list[i]['checked'] = false
}
if (list[i]['isParent']) {
list[i].children = []
list[i].children.push({
title: ''
})
list[i].first = true
}
}
return list
}
不喜欢重复了……别人的 -> layui-tree 一些基本的
layui全局事件
layui/modules/tree.js -> treeS.js(先格式化下)修改一点点:
// 行数145开始
}, b.prototype.spread = function (e, a) {
var n = this,
t = n.config,
r = e.children("." + p),
l = r.children("." + f),
c = r.find("." + o),
k = r.find("." + y),
m = t.onlyIconControl ? c : l,
x = "";
// @zhang 重复+t
m.on("click", function (it) {
var at = e.children("." + v),
n = m.children(".layui-icon")[0] ? m.children(".layui-icon") : m.find(
".layui-tree-icon").children(".layui-icon");
if (at[0]) {
if (e.hasClass(C)) e.removeClass(C), at.slideUp(200), n.removeClass(u).addClass(h);
else if (e.addClass(C), at.slideDown(200), n.addClass(u).removeClass(h), t.accordion) {
var r = e.siblings("." + s);
r.removeClass(C), r.children("." + v).slideUp(200), r.find(".layui-tree-icon").children(
".layui-icon").removeClass(u).addClass(h)
}
} else x = "normal"
/**
* 将下面点击事件的代码移上来了,
* 实现点击icon和数据title点击都可以触发treeS.click事件
*/
var ntmp = i(this);
ntmp.hasClass(d) || (x = e.hasClass(C) ? t.onlyIconControl ? "open" : "close" : t.onlyIconControl ?
"close" : "open", t.click && t.click({
elem: e,
state: x,
data: a
}))
}), k.on("click", function () {
// 这边只能在点击数据的时候触发treeS.click事件
// console.log(t.data)
// console.log('click too')
// console.log(i)
// var n = i(this);
// n.hasClass(d) || (x = e.hasClass(C) ? t.onlyIconControl ? "open" : "close" : t.onlyIconControl ?
// "close" : "open", t.click && t.click({
// elem: e,
// state: x,
// data: a
// }))
})
// @zhang 重复+t
}, b.prototype.setCheckbox
css:
// 样式自己调
<link rel="stylesheet" href="../../layui/css/layui.css">
#tree-unit .layui-tree-entry {
height: 2.5rem;
}
#tree-unit .layui-tree-icon {
border-width: 0;
height: auto;
width: auto;
line-height: auto;
}
#tree-unit .layui-icon-subtraction:before {
content: " ";
display: inline-block;
height: 1.4rem;
width: 1.4rem;
background: url(./img/icon_open_static.png) no-repeat;
background-size: 100%;
}
#tree-unit .layui-icon-addition:before {
content: " ";
display: inline-block;
height: 1.4rem;
width: 1.4rem;
background: url(./img/icon_close_static.png) no-repeat;
background-size: 100%;
}
#tree-unit .layui-icon-file:before {
content: " ";
display: inline-block;
height: 1.4rem;
width: 1.4rem;
background: url(./img/icon_user.png) no-repeat;
background-size: 100%;
margin-left: 5px;
margin-right: -2px;
}
#tree-unit .layui-tree-line .layui-tree-entry:hover .layui-tree-txt {
color: #009688;
text-decoration: none;
}
PS: 哈哈~,先暂时这样,后面封装成插件,用layui直接写个模块,等待————————
此文仅供学习使用,也只是为了记录和分享,希望可以帮到学习技术的人,欢迎指正~~~
还有就是求赞,发现自己一个赞都么得@_@











网友评论