这篇文章给大家分享的是有关xmlplus如何实现Tree组件的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

超过十余年行业经验,技术领先,服务至上的经营模式,全靠网络和口碑获得客户,为自己降低成本,也就是为客户降低成本。到目前业务范围包括了:
网站设计制作、做网站,成都网站推广,成都网站优化,整体网络托管,
成都小程序开发,微信开发,
App定制开发,同时也可以让客户的网站和网络营销和我们一样获得订单和生意!
树形组件是一种具有层级结构的组件,广泛应用于各种场景。

数据源
树形组件的数据源可以是 JSON 格式的数据对象,也可以是具有 XML 结构的数据或者是其它的具有层级结构的数据。本章将采用具有如下 JSON 格式的数据对象。
var data = {
name: 'My Tree',
children: [
{ name: 'hello' },
{ name: 'world' },
{
name: 'child folder',
children: [
{ name: 'alice' }
]
}
]
};
上述数据源中,name 值会作为树结点的名称显示,含 children 的数组代表节点的子级。
递归结构的设计
由 HTML 中的列表元素 ul 以及 li 组合而成对象具有天然的树形结构,我们不妨采用它们作为构建树形组件的基本元素。树形组件的最外层必然是一个 ul 元素,所以我们可以暂时定义树形组件如下:
Tree: {
xml: `
这里的未定义的组件 Item 是一个需要递归定义的子项组件,它会根据提供的数据递归地生成子孙对象。下面是一种可能的设计:
Item: {
xml: `
`,
map: { defer: "entries" }
}注意,上面的 neme 对象是用于显示 name 属性的。expand 对象用于展开或者关闭子级对象 entries。子级对象 entries 被设置为需要延迟实例化,只有当用户点击 expand 对象展开子级时,该对象才会实例化。
数据的加载与渲染
如上一节所述,我们设定了子级对象 entries 需要延迟实例化。所以,在给子项 Item 提供的数据设置接口不应该立马对 entries 实例化。下面我们先给出数据接口函数。
Item: {
// css, xml, map 项同上
fun: function (sys, items, opts) {
var data;
function val(value) {
data = value;
sys.neme.text(data.name);
data.children && data.children.length && sys.expand.show().text(" [+]");
}
return { val: val };
}
}
该接口函数 val 只是设置了当前节点相关的内容。下面我们来侦听 expand 对象的点击事件,并适时地完成组件对象 entries 的实例化。
Item: {
// css, xml, map 项同上
fun: function (sys, items, opts) {
var data, open;
sys.expand.on("click", function () {
open = !open;
sys.expand.text(open ? " [-]" : " [+]");
open ? (sys.entries.show() && load()) : sys.entries.hide();
});
function load() {
if ( sys.entries.children().length == 0 )
for ( var item of data.children )
sys.add.before("Item").value().val(item);
}
function val(value) {
data = value;
sys.neme.text(data.name);
data.children && data.children.length && sys.expand.show().text(" [+]");
}
return { val: val };
}
}
上述代码中包含一个 open 参数,该参数记录了当前节点的是否处于展开状态以供相关的侦听器使用。
动态添加节点
现在我们对上述组件进行一个小的扩展,使得它支持动态添加树节点的功能。首先,我们在对象 entries 的子级添加一个触发按钮,并命名为 add。
Item: {
xml: "