element树形控件单选

本文介绍了如何在Vue应用中使用ElementUI的el-tree组件,实现在树形结构中进行单选和双击节点编辑功能,包括获取选中节点、清空状态和修改节点名称的处理逻辑。
需求功能:
1,element树形控件单选
2,双击节点编辑

在这里插入图片描述

<div style="height: calc(100% - 48px)">
  <el-scrollbar class="scrollbar-wrapper">
    <el-tree :data="treesObj" show-checkbox default-expand-all check-strictly check-on-click-node
      node-key="subCode" ref="tree" highlight-current :props="defaultProps"
      @check-change="getCheckedNodes">
      <template slot-scope="{ node, data }" :ref="node.data.subCode">
        <span class="enumText" @dblclick.stop="editCateName(data, node)"
          v-if='!data.inputStatus'>{{ data.subCodeDesc }}</span>
        <el-input class="inputStyle" @blur="$event => editSave($event, data)" size="small" show-word-limit
          v-on:keyup.native.enter="$event.target.blur" placeholder="请输入" v-else="data.inputStatus"
          :ref="data.subCode" v-model.trim="cateNameInput"></el-input>
      </template>
    </el-tree>
  </el-scrollbar>
</div>
data() {
    return {
    	defaultProps: {
          children: 'subNodeList',
          label: 'subCodeDesc'
        },
        cateNameInput: '',//编辑节点值
        selectTreeNode:{],//选中节点
        treesObj:[{
		"highlight": null,
		"subCode": "1",
		"parentCode": null,
		"subNodeList": [{
			"highlight": null,
			"subCode": "11",
			"parentCode": "1",
			"subNodeList": [],
			"subCodeDesc": "子节点11"
		}],
		"subCodeDesc": "父节点1"
	},
	{
		"highlight": null,
		"subCode": "2",
		"parentCode": null,
		"subNodeList": [],
		"subCodeDesc": "父节点2"
	},
	{
		"highlight": null,
		"subCode": "3",
		"parentCode": null,
		"subNodeList": [],
		"subCodeDesc": "父节点3"
	}
],
    }
  },

获取当前选中节点,清空其他节点,再设置当前节点为选中状态

editCateName(data) {
    //双击节点的名称修改名称
      this.cateNameInput = data.subCodeDesc;
      this.treeIsEdit = data.subCode;
      this.$set(data, "inputStatus", true);
      this.$nextTick(() => {
        this.$refs[data.subCode] && this.$refs[data.subCode].focus(); // 获取输入框,自动获取焦点
      });
    };
async editSave(val, data) {
    //失去焦点之后执行的方法
      const inputName = val.target.value.trim();
      if (inputName == '') {
        this.$message({
          type: 'warning',
          message: '名称不能为空,请重新输入'
        });
        this.$set(data, "inputStatus", false); // 让文本span标签显示,输入框隐藏
        return;
      }
      if (inputName == data.subCodeDesc) {
        this.$set(data, "inputStatus", false);
        return;
      }
      this.$set(data, "inputStatus", false);
      let param = {
        groupType:"0103",//订单组
        costControlScope:this.costControlScope,
        code:data.subCode,
        codeDesc: inputName,
      };

      await this.$axios.post('/api/', param).then(res => {
        if (res.code === 200) {
          this.treedata.subCodeDesc = inputName;
          data.subCodeDesc = inputName;
          this.$message({
            type: 'success',
            message: '修改名称成功'
          });
        }
        // else {
        //   this.$message({
        //     type: 'warning',
        //     message: res.msg
        //   });
        // }
        this.getTrees();
      });
    };
getCheckedNodes(nodeData,nodeSelected){
	if (nodeSelected) {
        this.selectTreeNode = nodeData;
        this.$refs.tree.setCheckedKeys([]);//清空
        this.$refs.tree.setCheckedNodes([this.selectTreeNode])//设置
      }
      else{
        this.selectTreeNode={}
      }

}
### 关于Element Plus树形单选组件的使用 在Element Plus框架内,`Tree` 组件本身并不直接提供单选功能,但是可以通过配置属性 `check-strictly` 和设置事件处理逻辑来实现树形结构中的单选效果。为了达到这一目的,通常会结合 `default-checked-keys` 属性指定默认选中的节点,并通过监听 `node-click` 或者 `check-change` 事件控制用户的交互行为。 对于希望仅允许一次选择的情况,在每次点击新节点时清除之前的选择状态是一个常见的做法。下面给出了一段简单的Vue代码片段用于展示如何创建一个具有单选特性的树形控件: ```html <template> <div> <!-- Tree component with single selection --> <el-tree :data="treeData" show-checkbox node-key="id" ref="singleSelectTree" default-expand-all highlight-current check-strictly @check-change="handleCheckChange"> </el-tree> </div> </template> <script> export default { data() { return { treeData: [{ id: 1, label: 'Level one 1', children: [{ id: 4, label: 'Level two 1-1' }] }, { id: 2, label: 'Level one 2', children: [{ id: 5, label: 'Level two 2-1' }] }], selectedNodeId: null, // Store the currently selected node ID here. }; }, methods: { handleCheckChange(data, checked) { const { id } = data; if (checked && this.selectedNodeId !== id) { // Unselect previous item before selecting a new one. if(this.selectedNodeId){ this.$refs.singleSelectTree.setCheckedKeys([]); } this.$nextTick(() => { this.$refs.singleSelectTree.setChecked(id, true); this.selectedNodeId = id; }); } if (!checked) { this.selectedNodeId = null; } } } }; </script> ``` 上述代码实现了当用户在一个新的节点上打勾时自动取消其他所有已有的选择,从而模拟出了单选的效果[^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值