实现左边可搜索可选择展开树tree,右边已选列表可移除联动显示

这篇文章介绍了如何在Vue应用中使用ElementUI的el-tree组件实现一个可过滤的多级菜单,用户可以筛选节点并选择节点,适用于内容管理或数据展示场景。
摘要由CSDN通过智能技术生成
<template>
  <basic-container>
    <el-row>
      <el-col :span="4">
        <el-input
            placeholder="输入关键字进行过滤"
            v-model="filterText"
            style="width: 200px"
        ></el-input>

        <el-tree
            show-checkbox
            class="filter-tree"
            :data="data"
            :props="defaultProps"
            default-expand-all
            :filter-node-method="filterNode"
            @check="handleCheack"
            ref="treeRef"
        ></el-tree>
      </el-col>
      <el-col :span="3">
        <div class="selected-list">
          <h3>已选择列表</h3>
          <ul>
            <li v-for="selectedItem in selectedItems" :key="selectedItem.id">
              {{ selectedItem.label }}
              <span @click="removeSelected(selectedItem)">—</span>
            </li>
          </ul>
        </div>
      </el-col>
    </el-row>
  </basic-container>
</template>

<script>
import  {ref,reactive,watch, computed } from "vue";

export default {
  setup() {
    const filterText = ref('');

    const data = ref([
      {
        id: 1,
        label: '一级 1',
        children: [
          {
            id: 4,
            label: '二级 1-1',
            children: [
              {
                id: 9,
                label: '三级 1-1-1',
              },
              {
                id: 10,
                label: '三级 1-1-2',
              },
            ],
          },
        ],
      },
      {
        id: 2,
        label: '一级 2',
        children: [
          {
            id: 5,
            label: '二级 2-1',
          },
          {
            id: 6,
            label: '二级 2-2',
          },
        ],
      },
      {
        id: 3,
        label: '一级 3',
        children: [
          {
            id: 7,
            label: '二级 3-1',
          },
          {
            id: 8,
            label: '二级 3-2',
          },
        ],
      },
    ]);
    const treeRef = ref(null);
    const defaultProps = {
      children: 'children',
      label: 'label',
    };
    const selectedItems = ref([])
    const filterNode = (value, dataItem) => {
      if (!value) return true;
      return dataItem.label.indexOf(value) !== -1;
    };
    const removeSelected = (item) =>{
        let index = selectedItems.value.indexOf(item);
        if (index > -1) selectedItems.value.splice(index,1)
        treeRef.value.setChecked(item,false); //设置item为不可见
    }
    const handleCheack = ()=>{
      showCheckedNodes();
    }
    watch(filterText, (val) => {
        treeRef.value.filter(val);
    });

    const showCheckedNodes = () => {
        const checkedNodes = treeRef.value.getCheckedNodes(true);
        console.log('Checked Nodes:', checkedNodes);
        selectedItems.value = checkedNodes;
    };

    return {
      filterText,
      data,
      defaultProps,
      filterNode,
      removeSelected,
      handleCheack,
      treeRef,
      selectedItems
    };
  }}
</script>

<style></style>

  • 7
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Ant Design Tree 组件提供了一个 `treeData` 属性,通过这个属性可以渲染出一棵树形结构。要实现可编辑的菜单,需要在这个属性的基础上进行一些扩展。 首先,需要为每个节点添加一个可编辑的标识,用来表示该节点是否可以编辑。可以在 `treeData` 中为每个节点添加一个 `editable` 属性。 其次,当用户点击一个节点时,需要判断该节点是否可编辑,如果可编辑,则将该节点的文本内容转换成一个可编辑的文本框,让用户进行编辑。 最后,当用户完成编辑后,需要将编辑后的值保存到该节点中,并且将文本框转换回文本内容。 下面是一个简单的示例代码: ```jsx import { Tree, Input } from 'antd'; import { useState } from 'react'; const { TreeNode } = Tree; const treeData = [ { title: 'Node 1', key: '1', editable: true, children: [ { title: 'Child Node 1', key: '1-1', editable: true, }, { title: 'Child Node 2', key: '1-2', editable: true, }, ], }, { title: 'Node 2', key: '2', editable: true, }, ]; const EditableTree = () => { const [editingKey, setEditingKey] = useState(''); const onDoubleClick = (event, node) => { if (node.editable) { setEditingKey(node.key); } }; const onBlur = (event, node) => { setEditingKey(''); node.title = event.target.value; }; const renderTreeNode = (node) => { const { title, key, editable, children } = node; if (editingKey === key) { return ( <TreeNode title={<Input defaultValue={title} onBlur={(event) => onBlur(event, node)} />} key={key} /> ); } return ( <TreeNode title={title} key={key} editable={editable}> {children && children.map(renderTreeNode)} </TreeNode> ); }; return ( <Tree showLine defaultExpandAll onDoubleClick={onDoubleClick}> {treeData.map(renderTreeNode)} </Tree> ); }; export default EditableTree; ``` 这段代码中,我们使用了 Ant Design 的 `Tree` 和 `Input` 组件,使用 `useState` 钩子保存了当前正在编辑的节点的 `key` 值。在双击事件中,如果该节点可编辑,则将该节点的 `key` 值保存到 `editingKey` 中,这样就可以将该节点的文本内容转换成一个可编辑的文本框。在失去焦点事件中,将编辑后的值保存到该节点中,并将文本框转换回文本内容。最后,通过递归渲染树形节点,实现了可编辑的菜单

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值