Element中Tree树结构组件中实现Ctrl和Shift多选

直接上图

<el-tree
    :data="treeData"
    @node-click="handleNodeClick"
    :default-expand-all="true"
    :highlight-current="true"
    node-key="id"
    :expand-on-click-node="true"
    ref="treeRef"
></el-tree>
// node点击事件
const handleNodeClick = async (data, node) => {
    let event_ = window.event || arguments.callee.caller.arguments[0];
    let shiftKeyDowned = event_.shiftKey;
    let ctrlKeyDowned = event_.ctrlKey;
    if (ctrlKeyDowned == false && shiftKeyDowned == false) {
        // 都没有点击
        treeRef.value.setCheckedKeys([data.id]);
        batchSelectTree.value = [data];
    } else if (ctrlKeyDowned == true && shiftKeyDowned == false) {
        //只点击ctrl
        if (node.checked) {
            treeRef.value.setChecked(data.id, false);
            let index = batchSelectTree.value
                .map((el) => el.id)
                .indexOf(data.id);
            batchSelectTree.value.splice(index, 1);
        } else {
            treeRef.value.setChecked(data.id, true);
            batchSelectTree.value.push(data);
        }
    } else if (ctrlKeyDowned == false && shiftKeyDowned == true) {
        //只点击shift
        /**
         * 思路:通过计算开始索引到结束索引的差值,计算这段区间里有多少个数据,
         * 并且取数组第一个作为开始索引,往数组里push,每次shift,清空数据,因开始索引不会变化,只需要计算结束的索引即可。
         * 1.需要先判断一开始有没有选中一个。(以下情况,都是选中了一个的情况)
         * 2.往上选择,每次清空,从下往上把数据push到数组里,for --
         * 3.往下选择,每次清空,从上往下把数据push到数组里,for ++
         * 原始思路(但不完整实现):
         * 也是通过计算开始索引到结束索引的差值,计算这段区间里有多少个数据,
         * 但是是取数组最后一个作为开始索引,记录上次的开始索引和结束索引,插入到数组时是用unshift
         * 与vscode 的shift多选的差异:
         * 因每次shift都会清空上一次的选择,没有实现ctrl和shift交替使用,目前只支持同一文件夹里多选,且不支持多层级多选
         * 欢迎补充完善
         */
        // 需要判断一开始有没有空的
        // 若是一开始选择数组里是空的,直接retrun,不让操作,(或是把当前激活的窗口选中,并放到数组中,暂不实现这种方式)
        if (batchSelectTree.value.length == 0) return;
        let showNodes = node.parent.childNodes;

        let start = batchSelectTree.value[0]; //数值列里第一个
        let startIndex = showNodes.map((el) => el.data.id).indexOf(start.id);
        let endIndex = showNodes.map((el) => el.data.id).indexOf(data.id); //当前的node
        // console.log(start, startIndex, endIndex, "开始索引");
        if (startIndex > endIndex) {
            // 往上选择
            await cancelSelectTree();
            for (let index = startIndex; index >= endIndex; index--) {
                const el = showNodes[index];
                treeRef.value.setChecked(el.data.id, true);
                batchSelectTree.value.push(el.data);
            }
        } else {
            // 往下选择
            await cancelSelectTree();
            for (let index = startIndex; index <= endIndex; index++) {
                const el = showNodes[index];
                treeRef.value.setChecked(el.data.id, true);
                batchSelectTree.value.push(el.data);
            }
        }
    } else {
        // 都有点击,当做都没点击处理
        treeRef.value.setCheckedKeys([data.id]);
        batchSelectTree.value = [data];
    }
};

// 取消原来的选中
const cancelSelectTree = () => {
    batchSelectTree.value.forEach((el) => {
        treeRef.value.setChecked(el.id, false);
    });
    batchSelectTree.value = [];
};

参考:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
您好!要在Vue使用Element UI的Tree组件并实现懒加载,您可以按照以下步骤进行操作: 1. 首先,确保您已经安装了Vue和Element UI,并在您的项目引入它们。 2. 在需要使用Tree组件的Vue文件,先引入Tree组件和相关的样式: ```javascript import { Tree } from 'element-ui'; import 'element-ui/lib/theme-chalk/tree.css'; ``` 3. 在Vue组件注册Tree组件: ```javascript export default { components: { 'el-tree': Tree }, // ... } ``` 4. 在模板使用Tree组件,并设置相关属性和事件: ```html <template> <div> <el-tree :data="treeData" :load="lazyLoad" :lazy="true" :expand-on-click-node="false" @node-click="handleNodeClick" ></el-tree> </div> </template> ``` 在上面的代码,我们通过`:data`属性将的数据传递给Tree组件。`:load`属性用于指定懒加载函数,`:lazy`属性设置为`true`以启用懒加载功能,而`:expand-on-click-node`属性设置为`false`以禁用节点点击展开功能。同时,我们还可以通过`@node-click`事件处理节点的点击操作。 5. 在Vue组件的方法定义懒加载函数和节点点击事件处理方法: ```javascript export default { // ... methods: { lazyLoad(node, resolve) { // 模拟异步请求 setTimeout(() => { const children = [ { id: 1, label: '节点1' }, { id: 2, label: '节点2' }, { id: 3, label: '节点3' } ]; resolve(children); }, 1000); }, handleNodeClick(node) { console.log('点击了节点:', node); } } } ``` 在上面的代码,`lazyLoad`方法模拟了一个异步请求,通过`resolve`函数将加载到的子节点数据传递给Tree组件。`handleNodeClick`方法用于处理节点的点击事件,您可以根据需要进行相应的处理。 这样,您就可以在Vue使用Element UI的Tree组件并实现懒加载了。请注意,上述代码的数据和延时仅作为示例,您可以根据实际需求进行调整。希望对您有所帮助!如果您还有其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

天弈初心

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

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

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

打赏作者

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

抵扣说明:

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

余额充值