el-tree实现定位功能

根据初始搜索关键字,实现定位功能,如图:

该功能是根据初始的搜索关键字,获取该关键字对应的id,设置高亮,因为高亮才会有.is-current,this.$refs.treeData.store._getAllNodes()是获取树的全部节点。

created(){
      
        this.$nextTick(()=>{
            for (let i = 0; i < this.$refs.treeData.store._getAllNodes().length; i++) {
                    if(this.$refs.treeData.store._getAllNodes()[i].data.label===this.selectData){
                        this.$refs.treeData.setCurrentKey(this.$refs.treeData.store._getAllNodes()[i].data.id);
                    }
                }
        })

该功能实现定位效果

 triggerVisible(visible) {
            if (visible && this.selectData) {
                this.$nextTick(() => {
                    let nodeOffsetTop = document.querySelector('.select-tree .is-current').offsetTop
                    if (nodeOffsetTop > 120) {
                        document.querySelector('.public-select-tree-options').scrollTop = nodeOffsetTop - 120 / 2
                    }
                })
            }
        },

完整代码如下

<template>
    <div id="app">
        <el-select ref="selectTree" v-model="selectData" placeholder="请选择" clearable @visible-change="triggerVisible"
            style="position:initial;width: 100%">
            <el-option value="el-tree" class="public-select-tree-options">
                <el-tree :data="data" ref="treeData" highlight-current :props="defaultProps" default-expand-all
                    @node-click="handleNodeClick" class="select-tree" node-key="id">
                </el-tree>
            </el-option>
        </el-select>
    </div>
</template>

<script>

export default {
    data() {
        return {
            selectData: '三级 2-2-1',
            data: [{
                id: 1,
                label: '一级 1',
                children: [{
                    id: 11,
                    label: '二级 1-1',
                    children: [{
                        id: 111,
                        label: '三级 1-1-1'
                    }]
                }]
            }, {
                id: 2,
                label: '一级 2',
                children: [{
                    id: 22,
                    label: '二级 2-1',
                    children: [{
                        id: 222,
                        label: '三级 2-1-1'
                    }]
                }, {
                    id: 3,
                    label: '二级 2-2',
                    children: [{
                        id: 31,
                        label: '三级 2-2-1'
                    }]
                }]
            }, {
                id: 4,
                label: '一级 3',
                children: [{
                    id: 44,
                    label: '二级 3-1',
                    children: [{
                        id: 444,
                        label: '三级 3-1-1'
                    }]
                }, {
                    id: 5,
                    label: '二级 3-2',
                    children: [{
                        id: 55,
                        label: '三级 3-2-1'
                    }]
                }]
            }],

            defaultProps: {
                children: 'children',
                label: 'label'
            }
        }
    },
    created(){
      
        this.$nextTick(()=>{
            for (let i = 0; i < this.$refs.treeData.store._getAllNodes().length; i++) {
                    if(this.$refs.treeData.store._getAllNodes()[i].data.label===this.selectData){
                        this.$refs.treeData.setCurrentKey(this.$refs.treeData.store._getAllNodes()[i].data.id);
                    }
                }
        })
      
    },
    methods: {
        handleNodeClick() {
            let $object = this.$refs.treeData.getCurrentNode();        
            this.selectData = $object.label;
            this.$refs.selectTree.blur();
        },
        triggerVisible(visible) {
            if (visible && this.selectData) {
                this.$nextTick(() => {
                    let nodeOffsetTop = document.querySelector('.select-tree .is-current').offsetTop
                    if (nodeOffsetTop > 120) {
                        document.querySelector('.public-select-tree-options').scrollTop = nodeOffsetTop - 120 / 2
                    }
                })
            }
        },
    },

}
</script>

<style>
.public-select-tree-options {
    height: 150px !important;
    padding: 10px 0;
    background-color: #fff !important;
    overflow-y: auto !important;
    overflow-x: hidden;
}

.select-tree {
    width: 100%;
}
</style>

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现el-tree的编辑功能,可以通过以下步骤: 1. 在el-tree的每个节点上添加一个编辑按钮,点击编辑按钮可以进入编辑模式。 ``` <el-tree-node :data="node" :props="defaultProps"> <span slot-scope="{ node, data }"> <span>{{ data.name }}</span> <el-button type="text" icon="el-icon-edit" @click.stop="editNode(node, data)">编辑</el-button> </span> </el-tree-node> ``` 2. 在vue组件中定义editNode方法,该方法将节点的label设置为可编辑状态。 ``` methods: { editNode(node, data) { this.$nextTick(() => { const label = node.$el.querySelector('.el-tree-node__label') label.setAttribute('contenteditable', true) label.focus() label.addEventListener('blur', () => { label.setAttribute('contenteditable', false) label.removeEventListener('blur') if (label.innerText.trim()) { data.name = label.innerText.trim() this.updateNode(data) } }) }) }, updateNode(data) { axios.put('/api/updateNode', { id: data.id, name: data.name }).then(res => { if (res.data.success) { this.$message.success('更新成功') } else { this.$message.error('更新失败') } }) } } ``` 3. 当用户编辑完节点名称后,将节点的label设置为不可编辑状态,并将编辑后的名称保存到数据库中。 以上是el-tree实现编辑功能的代码实现。需要注意的是,当用户编辑节点名称时,需要将el-tree节点的label设置为可编辑状态,并在编辑完成后将其设置为不可编辑状态,否则会影响其他节点的编辑。另外,需要根据具体的业务场景进行调整和优化。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值