基于layui的tree组件
因公司使用的是layui框架,而layui的树组件实现的功能太少,所以便想着自己实现一个,顺便练练手,期间因逻辑混乱代码重构过一次。
插件整体思路
对外仅暴漏出eleTree接口,eleTree有两个方法,on方法是layui封装的事件机制,render方法为初始化,调用render方法时,初始化树,生成实例对象
thisTree为实例对象上对外的方法
Class为真正的构造函数,主体结构如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34var eleTree={
on: function(events, callback){
return layui.onevent.call(this, MOD_NAME, events, callback);
},
render: function(options) {
var inst = new Class(options);
return thisTree.call(inst);
}
}
var thisTree=function() {
var _self=this;
var options = _self.config;
// 暴漏外面的方法
return {
append: function(key,data) {
if(options.data.length===0) return;
return _self.append.call(_self,key,data);
},
// ...
}
}
var Class=function(options) {
// ...
};
Class.prototype={
constructor: Class,
append: function(key,data) {
// ...
}
// ...
}
代码执行过程
- 当调用
var el=eleTree.render({})
的时候调用Class构造函数初始化树,执行thisTree.call(inst);
,即执行thisTree函数,函数内部的this为inst实例对象,然后返回一个包含多个方法的对象 - 所以返回值el为包含多个方法的对象
- 当调用
el.append()
方法时,执行inst实例对象的append方法,即执行Class原型链上的append方法,append方法内部this还是inst实例对象