vue+elementUI实现el-tree默认选中第一层级的第一个节点

项目场景:

查询成绩时,按照左侧年级和班级树来查询学生成绩
默认选中第一层级下的第一个节点
并给出选中样式

在这里插入图片描述


问题描述:

此图为el-tree官方文档给出的数据,数据为对应的id、label、children
在这里插入图片描述
该项目数据为接口返回,并且返回的数据格式并不是像el-tree提供的那么规整,需要自己组装

在这里插入图片描述


组装数据:

规整数据,统一保持相同的名称,使用replace替换成label和id
id为整个字段唯一的,不能把年级的id也进行替换,因为会重复
如果不需要默认展开第一个层级下的第一个节点,id可不用替换,

     this.gradeTree = JSON.parse(
              JSON.stringify(data)
                .replace(/gradeName|className/g, 'label')
                .replace(/classId/g, 'id')
            );

默认传进去的数据为defaultProps

 defaultProps: {
        children: 'classList',
        label: 'label'
      },

默认展开第一层级下的第一个节点,就要使用default-expanded-keys和node-key(上面替换的id)
如果只是想选中第一层级并不选中第一层级下的任何节点,在watch的时候querySelector选中.el-tree-node__content即可

 expandDefault: [], //默认选中第一项
 
 this.expandDefault.push(this.gradeTree[0].classList[0].id);

 watch: {
    expandDefault(newVal, oldVal) {
      if (newVal) {
        this.$nextTick(() => {
          document
            .querySelector('.el-tree-node__children .el-tree-node__content')
            .click();
        });
      }
    }
  }

完整代码:

 <el-tree
          ref="tree"
          :data="gradeTree"
          :props="defaultProps"
          accordion
          @node-click="handleNodeClick"
          highlight-current
          node-key="id"
          :default-expanded-keys="expandDefault"
        ></el-tree>
 expandDefault: [], //默认选中第一项
      gradeTree: [], // 左侧年级树
      defaultProps: {
        children: 'classList',
        label: 'label'
      },
 // 查询左侧年级树
    getGradeTree() {
      return new Promise((resolve, reject) => {
        const { examId } = this;
        let params = {
          examId
        };
        service
          .getGradeTree(params)
          .then(data => {
            data = data.data;
            this.gradeList = data;
            this.gradeTree = JSON.parse(
              JSON.stringify(data)
                .replace(/gradeName|className/g, 'label')
                .replace(/classId/g, 'id')
            );
            this.expandDefault.push(this.gradeTree[0].classList[0].id);

            resolve(data);
          })
          .catch(err => {
            console.log(err);
            reject(err);
          });
      });
    },

 // 获取列表的方法
 getStudentScoreList(){}

 // 切换左侧选项的方法(因为替换了id,所以就没有classId了,可以自己打印了data看下)
 handleNodeClick(data) {
      this.searchInfo.studentNum = '';
      this.searchInfo.studentName = '';
      this.tableData.pageNum = 1;
      this.$refs.pagination.curPage = 1;
      if (data.id) {
        this.tempClassInfo = {};
        this.gradeList.forEach(item => {
          if (item.gradeCode === data.gradeCode) {
            this.gradeName = item.gradeName;
          }
        });
        this.tempClassInfo = data;
        this.className = data.label;
        this.getStudentScoreList();
      }
    },
    
// 为了选中第一层级下的第一个节点
watch: {
    expandDefault(newVal, oldVal) {
      if (newVal) {
        this.$nextTick(() => {
          document
            .querySelector('.el-tree-node__children .el-tree-node__content')
            .click();
        });
      }
    }
  }

// 修改选中的样式
/deep/.el-tree--highlight-current
  .el-tree-node.is-current
  > .el-tree-node__content {
  color: #368fff;
}

以上,可根据自己的数据结构进行组装和修改
最重要:在开发前跟后台定义好数据的格式!!!

  • 5
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Vue el-tree组件是一个支持层级树结构的组件,可以用于展示组织结构、文件目录等树型结构。给每个节点后面添加输入框的需求可能是为了让用户编辑节点的名称或其他信息。实现这个需求的步骤如下: 1. 在el-tree中的node默认插槽中添加一个输入框,如下: ``` <el-tree :data="data"> <template slot="node" slot-scope="{ node, data }"> <span>{{ node.label }}</span> <el-input v-model="node.name"></el-input> </template> </el-tree> ``` 2. 在data中添加需要修改的节点的name属性,然后在用户编辑输入框中的内容时实时更新该节点的name属性,如下: ``` data() { return { data: [ { label: '第一层', children: [ { label: '第二层', children: [ { label: '第三层', name: '节点名称' } ] } ] } ] } } ``` ``` <el-tree :data="data"> <template slot="node" slot-scope="{ node, data }"> <span>{{ node.label }}</span> <el-input v-model="node.name"></el-input> </template> </el-tree> ``` 3. 在用axios发送保存请求时,将修改的节点数据传给后端,让后端修改相应节点的数据,如下: ``` methods: { saveNodeData(node) { axios.post('/api/saveNodeData', { node }).then(res => { console.log(res.data) }).catch(error => { console.log(error.response.data) }) } } ``` 通过以上几个步骤,即可实现el-tree中给每个节点后面添加输入框并保存数据的功能。注意,这只是实现的一个思路,具体实现还需要结合项目实际情况进行调整和优化。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值