jquery *** 作table节点问题

jquery *** 作table节点问题,第1张

选取出以前表格里面的数据,存入变量中,然后

选择table,设置其HTML

$("#tableId")html("<tr><td></td><td></td><td></td><td></td></tr>

<tr><td></td><td></td><td></td><td></td></tr>

<tr><td></td><td></td><td></td><td></td></tr>

<tr><td></td><td></td><td></td><td></td></tr>");

把变量放到对应的TD中

之所以会造成卡顿,是因为该组件是一次性将所有数据全部渲染,dom数量过于庞大,并且在展开树 *** 作的时候,用了大量递归循环语句,性能受到严重影响,造成卡顿。

我想到的解决方式有两种:

一:分页,让后端添加分页查询,以节点数统计数据条数进行展示。(但实际需求中较少,一般树形表格都是不分页)。

二:将请求到的树形数组数据备份(tableDataCopy),初始化仅仅展示指定层级(如第一层树)的数据,将第一层下面的所有的children全部置为null,并记录存在children的节点,设置hasChild的状态,判断是否存在子节点。这样就不会在初始化页面时展示完所有数据,实现按需加载。

        以上仅仅能满足展示功能,当存在 *** 作节点上移下移/删除/编辑等 *** 作的情况下,展示的节点就不能同步刷新(因为备份数据不能双向数据绑定了)。处理办法:更新节点(两种方式,第一种使用render()来实现,第二种是给表格绑定key(利用diff算法),只要 *** 作了数据,就改变key就能实现节点更新)。

请求数据和展开代码如下:

// 获取树形列表

getList(active) {

thisloading = true;

let data = Objectassign({}, thissearchForm);

APIgetDepartmentListAll(data)

then((res) => {

// thistableData = resdata;

thisexpandRowpush(resdata[0]id); //默认展开

thistableDataCopy = resdata || [] // 备份的全量数据

if (active) { //是否是 *** 作按钮点击的数据

thistableData = thiscommonJsmapNewTableData(resdata,thisexpandRow); //展开已展开的数据

} else {

thistableData = thiscommonJsmapNewTableData(resdata,resdata[0]id); //默认展开第一层

}

thiscomponentKey += 1; //销毁更新dom

})finally(() => {

thisloading = false;

thisgetTableHeight();

})

},

// 展开按钮

getChildrens(tree, treeNode, resolve) {

let data = Objectassign({}, thissearchForm, {

deptId: treeid

});

APIgetDepartmentListAll(data) //传入展开按钮层级节点的id,获取子节点

then((res) => {

thistableDatas = JSONparse(JSONstringify(resdatachildren))map(item => { // 展示数据

// hasChildren 表示需要展示一个箭头图标

itemhasChildren = itemchildren && itemchildrenlength > 0

// 只展示一层也可以配置tree-props里面的children为其他字段

itemchildren = null

// 记住层级关系

itemidList = [itemid]

return item

})

resolve(thistableDatas)

})

},

登录后复制

当存在 *** 作按钮,数据更新后,利用上述key更新节点后 ,会将展开的状态初始为初次进度页面的状态,不能停留在 *** 作的节点。解决方法:可以在点击 *** 作按钮的时候,使用findParentNode方法递归查询到该节点所有的祖先节点id并记录(expandRow,该变量也是树形表格:expand-row-keys默认展开的数据),然后再请求刷新数据时,通过mapNewTableData()方法递归处理将对应的祖先节点id对应的children给展示处理,其他的节点还是一样的置为null。代码如下:

/

@param 递归,当前节点的祖先节点id数组(包含自身)

acceptUnitNodes树状结构数据,ids当前节点的id

/

findParentNode(acceptUnitNodes, ids) {

var parentNodes = [] // 所有父节点

var forfun = function(id, nodes) {

for (var i = 0; i < nodeslength; i++) {

var currentNode = nodes[i]

if (currentNodeid === id) {

return currentNodeid

} else if (currentNodechildren) {

var validNodeId = forfun(id, currentNodechildren)

if (validNodeId && parentNodesindexOf(validNodeId) < 0) {

parentNodespush(validNodeId)

}

if (validNodeId) {

return currentNodeid

}

}

}

}

var validNodeId = forfun(ids, acceptUnitNodes)

if (validNodeId && parentNodesindexOf(validNodeId) < 0) {

parentNodespush(validNodeId)

}

return parentNodes

},

//递归处理数据,当有展开记录的时候,将有展开记录的数据的子节点显示出来

mapNewTableData(data, pidArr) {

let dataNew = JSONparse(JSONstringify(data));

function mapNewArr(dataNew, pidArr) {

dataNewmap(item => {

if (pidArrindexOf(itemid) === -1) {

itemidList = [itemid]

itemhasChildren = true

itemchildren = null

// 记住层级关系

return item;

} else {

mapNewArr(itemchildren, pidArr)

}

})

return dataNew;

}

mapNewArr(dataNew, pidArr);

return mapNewArr(dataNew, pidArr);;

},

登录后复制

*** 作按钮:

//上移//下移

upDownLayer(index, row, type) {

thisexpandRow = (thiscommonJsfindParentNode(thistableDataCopy, rowid))splice(1); //调工具,获取点击当前节点的祖先节点id数组。

let loading = Loadingservice({

target: documentquerySelector("tableBox"),

});

可能一个查询语句是完成不了你这个东西了。

DECLARE

CURSOR V_CURSOR IS

SELECT FROM TABLE_TEST;

V_COUNT NUMBER;

BEGIN

FOR C1 IN V_CURSOR LOOP

SELECT COUNT(1)

INTO V_COUNT

FROM TABLE_TEST A

START WITH AID = C1ID

CONNECT BY PRIOR AID = APID;

DBMS_OUTPUTPUT_LINE(C1NAME || ',' || V_COUNT);

END LOOP;

END;

你可以使用 JavaScript 中自带的 rowIndex 和 cellIndex 来获取行和列的键值 (从0开始)

点击 checkbox,获取 parentNode (也就是 td),tdcellIndex 就是所在列的键值

点击 checkbox,获取 parentNodeparentNode (也就是 tr),trrowIndex 就是所在行的键值

<script type="text/javascript">

// 点击

documentonclick = function(e) {

    // 兼容 event 和 target

    e = e || windowevent;

    var target = etarget || esrcElement;

    // 确认是 checkbox

    if(targettagNametoLowerCase() === "input"

        && targettype === "checkbox") {

        // 获取行列键值

        var row_num = targetparentNodeparentNoderowIndex;

        var col_num = targetparentNodecellIndex;

        // 输出

        alert(row_num + " " + col_num);

    }

};

</script>

因为键值是从 0 开始,一般需要 +1 才是行列数,但因为你表单中第一行个第一列都是文字,所以不需要 +1 正好输出需要的数字,例如点击周四 + 6,会输出 4 6

// 查找人员

private void button4_Click(object sender, EventArgs e)

{

string username = thistextBox1TextToString()Trim();

if (username == "")

return;

TreeNodeCollection tc = treeView1Nodes;

thistreeView1CollapseAll();

FindUser(tc, username);

}

private void FindUser(TreeNodeCollection tc,string username)

{

foreach (TreeNode Node in tc)

{

if (NodeTextIndexOf(username) >= 0)

{

thistreeView1SelectedNode = Node;

NodeForeColor = ColorOrange;

}

FindUser(NodeNodes, username);

}

}

一个遍历Treeview节点查找节点名字的例子,

其实就是递归循环所有节点

希望对你有用。如果还有问题可以发消息

以上就是关于jquery *** 作table节点问题全部的内容,包括:jquery *** 作table节点问题、elementui表格更新卡住、Oracle 查询所有树节点的包含的子节点的数量等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9760427.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-01
下一篇2023-05-01

发表评论

登录后才能评论

评论列表(0条)

    保存