关于layui的树形表格回显

关于layui默认的tree再回显时会进行级联勾选,这是个bug,已有人在社区发表讨论与建议了。目前个人采用的解决办法:是在后台判断当前角色拥有的子级id进行设置checked:true,这样在前台展示的时候它就会通过子级的id自动去级联勾选父级的id,是我们想要的展示效果。

主后台代码:

// layui 菜单权限 start

    /**
     * layui 的tree 方式
     * @author master
     */

    /**
     * 获取封装方法
     *
     * @param myMenus  当前自身的菜单集合
     * @param allMenus 所有的菜单集合
     * @return
     */
    public static List<LayUINode> getLayUIMenus(List<SysMenu> allMenus, List<SysMenu> myMenus) {
        List<LayUINode> layUINodes = new ArrayList<>();
        if (allMenus.size() != 0) {
            LayUINode treeNode;
            for (int i = 0; i < allMenus.size(); i++) {
                if (null == allMenus.get(i).getParentId() || "".equals(allMenus.get(i).getParentId())) { //封装父节点
                    treeNode = new LayUINode();
                    treeNode.setId(String.valueOf(allMenus.get(i).getId()));
                    treeNode.setTitle(allMenus.get(i).getName());
                    treeNode.setHref(allMenus.get(i).getHref());
                    //treeNode.setChecked(checkMenu(String.valueOf(allMenus.get(i).getId()), myMenus));
                    treeNode.setChildren(getLayChildren(allMenus, myMenus, String.valueOf(allMenus.get(i).getId())));
                    layUINodes.add(treeNode);
                }
            }
        }
        return layUINodes;
    }

    /**
     * 校验菜单是否选中
     *
     * @param id
     * @param myMenus
     * @return
     */
    private static boolean checkMenu(String id, List<SysMenu> myMenus) { // 回显判断
        for (int j = 0; j < myMenus.size(); j++) {
            if (id.equals(String.valueOf(myMenus.get(j).getId()))) {
                return true;
            }
        }
        return false;
    }

    /**
     * 菜单children
     *
     * @param allMenus
     * @param myMenus
     * @param id
     * @return
     */
    private static List<LayUINode> getLayChildren(List<SysMenu> allMenus, List<SysMenu> myMenus, String id) {
        List<LayUINode> layUINodes = new ArrayList<>();
        LayUINode treeNode;
        if (allMenus.size() != 0) {
            for (int i = 0; i < allMenus.size(); i++) {
                if (null != allMenus.get(i).getParentId()) {
                    if (id.equals(String.valueOf(allMenus.get(i).getParentId()))) { // 子菜单为1标识
                        treeNode = new LayUINode();
                        treeNode.setId(String.valueOf(allMenus.get(i).getId()));
                        treeNode.setTitle(allMenus.get(i).getName());
                        treeNode.setHref(allMenus.get(i).getHref());
                        if (allMenus.get(i).getIsButton() == 0) { // 是按钮
                            treeNode.setChecked(checkMenu(String.valueOf(allMenus.get(i).getId()), myMenus));
                        }
                        treeNode.setChildren(getLayChildren(allMenus, myMenus, String.valueOf(allMenus.get(i).getId())));
                        layUINodes.add(treeNode);
                    }
                }
            }
        }
        return layUINodes;
    }

    // layui 菜单权限 方式end

前台主代码:

<script src="../../../layuiadmin/layui/layui.js"></script>
<script>
    let menuIds = [];
    let t;
    layui.config({
        base: '../../../layuiadmin/' //静态资源所在路径
    }).extend({
        index: 'lib/index' //主入口模块
    }).use(['index', 'form', 'tree'], function () {
        let $ = layui.$
            , form = layui.form
            , tree = layui.tree;

        layui.config({base: '../../../layuiadmin/js/layui_exts/'})
        // 自定义ajax模块组件使用示例,继承自上方的base根目录属性
            .use(['tokenAjax2'], function () {
                let $token = layui.tokenAjax2;
                let roleId = $('#roleId').val();
                $token.tokenAjax2('sys/treeMenu', {'roleId':roleId}, function (data) {
                    if (data.code == 0) {
                        //渲染
                        t = tree.render({
                            id: 'treeId'
                            ,
                            elem: '#treeId'  //绑定元素
                            , showCheckbox: true
                            , accordion: false
                            , data: data.data
                            , oncheck: function (obj) {
                            }
                        });
                        // 获取选中的节点id
                        // getTreeId(t.getChecked());
                        //tree.setChecked('treeId', [2]); //批量勾选 id 为 2、3 的节点
                    }
                });
            });
    });

    /**
     * 递归获取选中菜单的id
     * @type {Array}
     */
    function getTreeId(node) {
        if (node.length > 0) {
            for (let i = 0; i < node.length; i++) {
                menuIds.push(node[i].id);
                if (node[i].children) {
                    getTreeId(node[i].children);
                }
            }
            return menuIds;
        }
    }

    /**
     * 父页面调用返回数组参数
     * @returns {[]}
     */
    function returnMenuIds() {
        menuIds = [];
        // 获取选中的节点id
        getTreeId(t.getChecked());
        return menuIds;
    }


</script>
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
1.在页面中引入layui的css和js文件: ``` <link rel="stylesheet" href="/layui/css/layui.css"> <script src="/layui/layui.js"></script> ``` 2.创建一个div作为树形组件的容器: ``` <div id="tree"></div> ``` 3.定义树形组件的数据: ``` var treeData = [{ "id": 1, "name": "节点1", "children": [{ "id": 11, "name": "节点1-1" }, { "id": 12, "name": "节点1-2" }] }, { "id": 2, "name": "节点2", "children": [{ "id": 21, "name": "节点2-1" }, { "id": 22, "name": "节点2-2" }] }]; ``` 4.使用layui.tree组件创建树形结构: ``` layui.use(['tree'], function(){ var tree = layui.tree; tree.render({ elem: '#tree', data: treeData, id: 'treeId', showCheckbox: true, accordion: true, checkArr: [1, 11] //默认勾选节点1和节点1-1 }); }); ``` 其中,id为树形组件的唯一标识,showCheckbox表示是否显示复选框,accordion表示是否开启手风琴模式(只展开一个节点),checkArr表示默认勾选的节点的id数组。 5.获取勾选的节点: ``` var checkedData = layui.tree.getChecked('treeId'); ``` 其中,treeId为树形组件的id。 6.将勾选的节点id数组转换成树形组件需要的格式: ``` var checkedIds = []; for (var i = 0; i < checkedData.length; i++) { checkedIds.push(checkedData[i].id); } var checkedArr = layui.tree.ConvertToArr('treeId', checkedIds); ``` 7.将勾选的节点回显树形组件中: ``` layui.use(['tree'], function(){ var tree = layui.tree; tree.render({ elem: '#tree', data: treeData, id: 'treeId', showCheckbox: true, accordion: true, checkArr: checkedArr //勾选之前已经勾选的节点 }); }); ``` 完整代码如下: ``` <link rel="stylesheet" href="/layui/css/layui.css"> <script src="/layui/layui.js"></script> <div id="tree"></div> <script> var treeData = [{ "id": 1, "name": "节点1", "children": [{ "id": 11, "name": "节点1-1" }, { "id": 12, "name": "节点1-2" }] }, { "id": 2, "name": "节点2", "children": [{ "id": 21, "name": "节点2-1" }, { "id": 22, "name": "节点2-2" }] }]; layui.use(['tree'], function(){ var tree = layui.tree; tree.render({ elem: '#tree', data: treeData, id: 'treeId', showCheckbox: true, accordion: true, checkArr: [1, 11] //默认勾选节点1和节点1-1 }); var checkedData = layui.tree.getChecked('treeId'); var checkedIds = []; for (var i = 0; i < checkedData.length; i++) { checkedIds.push(checkedData[i].id); } var checkedArr = layui.tree.ConvertToArr('treeId', checkedIds); tree.render({ elem: '#tree', data: treeData, id: 'treeId', showCheckbox: true, accordion: true, checkArr: checkedArr //勾选之前已经勾选的节点 }); }); </script> ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ruchiruzui2012

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值