对话框中使用el-input和el-tree做树形组件表单元素,解决点击其他区域树形组件无法自动收回的bug

对话框中表单某一项以树的形式展示,点击el-input弹出el-tree树形组件后如果不继续点击选择树节点而是点击其他地方(或者直接关闭对话框),树形组件收不回去了(不能像下拉框表单一样自动隐藏收回去),这个是有解决办法的,即通过监听body的click事件,然后判断鼠标点击的dom(event.target)是不是点击弹出树形组件的那个input,如果不是,就让树形组件隐藏,如果是,就不做任何操作,具体代码如下:
template里面:

<el-form-item label="工作组" prop="workGroupName">
  <el-input v-model="form.workGroupName" @focus="showWorkGroupTree" class="workGroupItem" auto-complete="off" :clearable="isClearable"></el-input>
  <el-tree
    ref="workGroup"
    :data="workGroups"
    :props="defaultProps"
    class="workGroupTree workGroupItem"
    node-key="id"
    default-expand-all
    v-show="workGroupTreeShow"
    @node-click="handleNodeClick"
    :expand-on-click-node="false">
  </el-tree>
</el-form-item>

script里面:

mounted() {
    let dom = document.getElementsByClassName('workGroupItem');
    document.body.addEventListener('click', (e)=> {
      e = window.event || e;
      var target = e.target || e.srcElement;
      // flagParent是用来判断点击的是不是class为workGroupItem的el-input的标志,如果为-1,则点击的不是class为workGroupItem的el-input
      var flagParent = target.offsetParent.className.indexOf('workGroupItem');
      if (flagParent == -1) {
        this.workGroupTreeShow = false;
      }
    });
},

OK,问题解决~
后期经实践发现上述代码还有一点不完善,就是当打开对话框,点击弹出树形组件后,再去点击对话框以外区域(即div.el-dialog__wrapper)时树形组件仍不能收回去,为了让树形组件除了 点击与它相关联的el-input 这种情况,其他情况的点击都能收回去,完善代码逻辑如下:
script里面:

mounted() {
    // 解决工作组树形组件弹出后 点击其他位置不能收回去的bug
    let 
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
1. el-tree el-tree是Element UI组件的一种树形组件使用非常方便。只需要在Vue组件引入el-tree组件,然后传入相应的数据即可。 首先需要安装Element UI,可以使用npm命令进行安装: ``` npm install element-ui --save ``` 接着在Vue组件引入el-tree组件: ``` <template> <el-tree :data="treeData"></el-tree> </template> <script> import { Tree } from 'element-ui' export default { components: { 'el-tree': Tree }, data() { return { treeData: [ { label: 'Node1', children: [ { label: 'Child1' }, { label: 'Child2' } ] }, { label: 'Node2' } ] } } } </script> ``` 以上代码el-tree的data属性传入了一个树形数据结构,包含了两个节点Node1和Node2,Node1节点下有两个子节点Child1和Child2。 2. 自定义树形组件结构 如果想要自定义树形组件的结构,可以使用Vue的插槽(slot)功能。插槽可以让父组件传入子组件的内容,让子组件可以自定义渲染。 首先,在Vue组件定义一个自定义树形组件,并在其使用插槽: ``` <template> <ul> <li v-for="item in treeData" :key="item.id"> <slot name="tree-node" :item="item"> <div>{{ item.label }}</div> </slot> <ul v-if="item.children"> <tree :tree-data="item.children"></tree> </ul> </li> </ul> </template> ``` 以上代码使用v-for循环渲染树形结构的每一个节点,使用插槽渲染节点的内容,插槽名为"tree-node",插槽传入了一个item属性,值为当前节点的数据。如果没有传入插槽,则默认渲染节点的label属性。 接着,在使用该自定义组件的父组件,可以使用template标签来定义插槽的内容: ``` <template> <my-tree :tree-data="treeData"> <template v-slot:tree-node="{ item }"> <div> <span>{{ item.label }}</span> <button @click="editNode(item)">Edit</button> <button @click="deleteNode(item)">Delete</button> </div> </template> </my-tree> </template> <script> import MyTree from './MyTree.vue' export default { components: { 'my-tree': MyTree }, data() { return { treeData: [ { id: 1, label: 'Node1', children: [ { id: 2, label: 'Child1' }, { id: 3, label: 'Child2' } ] }, { id: 4, label: 'Node2' } ] } }, methods: { editNode(item) { console.log(`Edit node: ${item.label}`) }, deleteNode(item) { console.log(`Delete node: ${item.label}`) } } } </script> ``` 以上代码使用v-slot指令定义了一个名为"tree-node"的插槽,并在插槽渲染了节点的内容,包括节点的label、编辑按钮和删除按钮。在父组件使用自定义组件时,将插槽作为template标签的内容传入。在点按钮时,可以调用父组件的方法进行相应的操作。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值