0


Element Ui Tree组件实现增、删、改、查、拖拽节点 的树形结构

介绍:首先组件 | Element官网某些功能都具备了,这里我就把这些功能结合在一起更完美的使用,其次编辑节点官网是没有实例,所以这里搞了一套较完整的功能,其次编辑和添加,这里直接使用了弹窗(顾及到多个参数设置),接下来效果图展示!

效果图如下:

1,其中点击展开/折叠看个人需求;

2,组件中 :default-checked-keys="List_id" (如: 获取所有权限,匹配改个节点(角色)所包含的权限,修改时默认勾选,List_id 该角色拥有权限的id的集合!)讲述的可能稍有复杂,代码有注释可以看看!

(自己引入相关插件)

src: url('../css/element-icons.woff') format("woff");这个是图标不展示问题

这里就直接展示代码了!

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title></title>
        <link rel="stylesheet" href="../css/index.css" />
        <link rel="stylesheet" href="../css/element-ui.css" />
        <script src="../js/vue.js"></script>
        <script src="../js/element-ui.js"></script>
        <style type="text/css">
            @font-face {
                font-family: element-icons;
                src: url('../css/element-icons.woff') format("woff");
                font-weight: 400;
                font-display: "auto";
                font-style: normal
            }

            .fade-enter-active,
            .fade-leave-active {
                transition: opacity 5s
            }

            .fade-enter,
            .fade-leave-active {
                opacity: 0
            }

            .custom-tree-node {
                flex: 1;
                /* display: flex; */
                align-items: center;
                justify-content: space-between;
                font-size: 14px;
                padding-right: 8px;
            }

            .show-hide:hover :nth-child(2) {
                display: inline-block !important;
            }

            .el-tree-node__content {
                height: 30px !important;
            }

            .el-input__inner {
                height: 28px !important;
            }

            em {
                color: red;
                font-style: inherit !important;
            }

            .el-input__inner {
                height: 20px;
            }

            .dialog_input>input {
                height: 34px !important;
            }

            input.el-input__inner {
                height: 34px !important;
            }

            .btn_is {
                padding: 7px !important;
                font-size: 15px !important;
                background: rgb(39, 99, 220);
                color: white;
            }

            .el-tree {
                overflow-y: auto;
                max-height: calc(100vh - 180px);
                border-bottom: 1px solid #c8c8c8;
                padding: 5px 0px;
            }

            .dialog_input {
                width: 400px !important;
            }

            input.el-input__inner {
                width: 80%;
            }
        </style>
    </head>
    <body>
        <div id="app">
            <template>
                <el-button class="btn_is" size="medium" @click="toggleRowExpansion()">全部展开/折叠</el-button>
                <el-input placeholder="输入关键字" v-model="filterText" highlight-current></el-input>
                <!-- default-expand-all:默认打开全部
                 :expand-on-click-node="true" 打开点击当前行节点-->
                <el-tree v-if="refreshTable" :default-expand-all="isExpandAll" :data="data" class="filter-tree"
                    :highlight-current="true" :filter-node-method="filterNode" show-checkbox node-key="id" ref="tree"
                    highlight-current :props="defaultProps" @node-drag-start="handleDragStart"
                    @node-drag-leave="handleDragLeave" @node-drag-over="handleDragOver" @node-drag-end="handleDragEnd"
                    @node-drop="handleDrop" :allow-drop="allowDrop" :allow-drag="allowDrag" draggable
                    :expand-on-click-node="false" :default-checked-keys="List_id">
                    <span class="custom-tree-node show-hide keywords_em" slot-scope="{ node, data }">
                        <span class="ssss" v-if="filterText != ''" v-html="ruleTitle(node.label)"></span>

                        <span class="ddd" v-if="filterText == ''" v-text="data.label"></span>
                        <span style="display:none">
                            <el-button v-if="data.id !== 1" v-if="data.id!=1" type="text" size="mini"
                                @click="() => edit(node,data)">
                                <i class="el-icon-edit"></i>
                            </el-button>
                            <el-button type="text" size="mini" @click="() => append(node,data)">
                                <i class="el-icon-plus"></i>
                            </el-button>
                            <el-button type="text" size="mini" @click="() => remove(node, data)">
                                <i class="el-icon-delete"></i>
                            </el-button>
                        </span>
                    </span>
                </el-tree>
                <!-- 编辑 -->
                <el-dialog style="width: 100%;height: 100%;" title="角色权限修改" :visible.sync="upd_dialog">
                    <div>
                        <el-form :model="upd_data">
                            <el-form-item label="名称:" width="80px">
                                <el-input class="dialog_input" v-model="upd_data.label"></el-input>
                            </el-form-item>
                            <el-form-item label="id:" width="80px">
                                <el-input class="dialog_input" v-model="upd_data.id"></el-input>
                            </el-form-item>
                        </el-form>
                    </div>
                    <div slot="footer" class="dialog-footer">
                        <button class="submitbtn" @click="upd_submit">提 交</button>
                        <button class="censelbtn" @click="cancel">取 消</button>
                    </div>
                </el-dialog>
                <!-- 添加 -->
                <el-dialog style="width: 100%;height: 100%;" title="角色权限添加" :visible.sync="zdydialog">
                    <div>
                        <el-form :model="add_data">
                            <el-form-item label="名称:" width="80px">
                                <el-input class="dialog_input" v-model="add_data.label"></el-input>
                            </el-form-item>
                            <el-form-item label="序号:" width="80px">
                                <el-input class="dialog_input" v-model="add_data.id"></el-input>
                            </el-form-item>
                        </el-form>
                    </div>
                    <div slot="footer" class="dialog-footer">
                        <button class="submitbtn" @click="add_submit">提 交</button>
                        <button class="censelbtn" @click="cancel">取 消</button>
                    </div>
                </el-dialog>
            </template>
        </div>
    </body>
    <script>
        new Vue({
            el: "#app",
            data() {
                return {
                    data: [{
                        id: 1,
                        label: '一级',
                        children: [{
                            id: 4,
                            label: '二级',
                            children: [{
                                id: 9,
                                label: '三级'
                            }, {
                                id: 10,
                                label: '三级'
                            }]
                        }]
                    }, {
                        id: 2,
                        label: '一级',
                        children: [{
                            id: 5,
                            label: '二级'
                        }, {
                            id: 6,
                            label: '二级'
                        }]
                    }, {
                        id: 3,
                        label: '一级',
                        children: [{
                            id: 7,
                            label: '二级'
                        }, {
                            id: 8,
                            label: '二级'
                        }]
                    }],
                    newApiGroupName: '',
                    defaultProps: {
                        children: 'children',
                        label: 'label'
                    },
                    updateApiGroup: {},
                    id: 1000,
                    resetNodeForm: {},
                    filterText: '',
                    newname: '',
                    isExpandAll: true,
                    refreshTable: true,
                    List_id: [5, 7], //匹配到的id默认勾选,
                    zdydialog: false,
                    upd_dialog: false,
                    add_data: {},
                    upd_data: {},
                };
            },
            watch: {
                filterText(val) {
                    console.log(val)
                    this.$refs.tree.filter(val);
                }
            },
            created() {},
            methods: {
                edit(node, row) {
                    console.log(row)
                    this.upd_dialog = true
                    this.upd_data = row
                },
                upd_submit() {
                    //调取相关接口
                    this.upd_dialog = false
                },

                append(node, row) {
                    this.add_data = {
                        id: '',
                        label: '',
                    }
                    if (!row.children) {
                        this.$set(row, 'children', [])
                    }
                    row.children.push(this.add_data)
                    console.log(this.add_data)
                    this.zdydialog = true
                },
                add_submit() {
                    //调取相关接口
                    this.zdydialog = false
                },
                cancel() {
                    this.upd_dialog = false;
                    this.zdydialog = false;
                },
                // 全部展开/折叠
                toggleRowExpansion() {
                    this.refreshTable = false;
                    this.isExpandAll = !this.isExpandAll;
                    this.$nextTick(() => {
                        this.refreshTable = true;
                    });
                },
                // 高亮搜索的关键字
                ruleTitle(items) {
                    const title = items
                    const rep = new RegExp(this.filterText, 'g')
                    const resDtring = `<span style="color: #145afe">${this.filterText}</span>`
                    return title.replace(rep, resDtring)
                },
                //筛选结点
                filterNode(value, data, node) {
                    if (!value) return true;
                    return this.findSearKey(node, value);
                },
                // 拖拽
                handleDragStart(node, ev) {
                    console.log('drag start', node.data.label)
                },
                handleDragEnter(draggingNode, dropNode, ev) {
                    console.log('tree drag enter: ', dropNode.data.label)
                },
                handleDragLeave(draggingNode, dropNode, ev) {
                    console.log('tree drag leave: ', dropNode.data.label)
                },
                handleDragOver(draggingNode, dropNode, ev) {
                    console.log('tree drag over: ', dropNode.data.label)
                },
                handleDragEnd(draggingNode, dropNode, dropType, ev) {
                    console.log(
                        'tree drag end: ',
                        dropNode && dropNode.data.label,
                        dropType
                    )
                    // 调后端更新
                    // this.updateApiGroup(this.data)
                },
                handleDrop(draggingNode, dropNode, dropType, ev) {
                    console.log('tree drop: ', dropNode.data.label, dropType)
                },
                allowDrop(draggingNode, dropNode, type) {
                    if (dropNode.data.id === 1) {
                        return false
                    } else {
                        return true
                    }
                },
                allowDrag(draggingNode) {
                    // 顶层默认分组不允许拖拽
                    if (draggingNode.data.id === 1) {
                        return false
                    } else {
                        return true
                    }
                    // return draggingNode.data.apiGroupName.indexOf('三级 3-2-2') === -1
                },
                remove(node, data) {
                    const parent = node.parent
                    const children = parent.data.children || parent.data
                    const index = children.findIndex(d => d.id === data.id)
                    children.splice(index, 1)
                    // this.updateApiGroup(this.data)
                },
            }
        })
    </script>
</html>
标签: ui 前端 elementui

本文转载自: https://blog.csdn.net/qq_45904018/article/details/131601874
版权归原作者 云边小卖铺. 所有, 如有侵权,请联系我们删除。

“Element Ui Tree组件实现增、删、改、查、拖拽节点 的树形结构”的评论:

还没有评论