Vue3计算属性终极实战:可媲美Element Plus Tree组件研发之节点勾选

前面完成了JuanTree组件的节点编辑和保存功能后,我们把精力放到节点勾选功能实现上来。**注意,对于组件的开发者来说,要充分考虑用户的使用场景,组件提供的多个特性同时启用时必须要工作良好。**就拿Tree组件来说,用户完全可以在启用勾选的情况下,同时启用节点增删功能,此时增删不能影响到勾选的一致性。

Tree组件的节点勾选会向下级联所有子孙节点,向上也会影响父节点的全选和半选状态。大部分教程在实现节点勾选,主导的思路就是手动的遍历处理,实现的非常麻烦;本教程的思路让功能实现变得非常简单——使用可写的计算属性即可!

在这里插入图片描述

可以拿官方的例子来复习下可写计算属性的用法:

在这里插入图片描述

然后我们开始上车,进入计算属性的终极实战,Are you ready? Gooooo!

用法示例

示例演示

在这里插入图片描述

启用设置:

在这里插入图片描述

具体实现如下

组件属性和ts类型

JuanTree组件的可选配置上再新增一个可选项,基于它来决定是否启用节点勾选功能。

export interface OptionProps {
  ...
  checkable?: boolean // 是否启用勾选,默认不启用
}

节点勾选会用三种状态:未选中、选中和半选中,为此定义一个枚举类型:

export enum ECheckedStatus {
  UNCHECKED,
  CHECKED,
  HALF_CHECKED
}

JuanTree的结构化节点类型ITreeNode中新增勾选相关的属性:

// 结构化节点
export interface ITreeNode {
  ...
  checkedStatus?: WritableComputedRef<ECheckedStatus> // 可写的勾选计算属性
  checked?: boolean // 是否被选中,实际操作时用到的属性,也会参与到勾选计算属性的计算中
}

计算属性核心逻辑

utils.ts工具中编写结构化节点ITreeNode的初始化绑定函数,关键代码的注释都加了,操作逻辑非常的简单易读:

// 初始化结构化节点
function initTreeNode(treeNode: ITreeNode, props: OptionProps) {
  // 如果没有启用checkable,则返回
  if (!props.checkable) return
  // 获得节点的响应式操作对象
  const node = ref(treeNode).value
  const childrenName = props.childrenName as 'children'
  // 绑定节点的勾选计算属性
  treeNode.checkedStatus = computed({
    get() {
      // 如果是叶子节点,返回checked属性值
      if (!node[childrenName]) {
        // 叶子节点只有两种状态:选中和未选中
        return node.checked ? ECheckedStatus.CHECKED : ECheckedStatus.UNCHECKED
      } else {
        // 父节点的勾选状态判断逻辑,需要统计子节点的勾选状态
        let checkedCount = 0,
          uncheckedCount = 0
        // 遍历子一代节点列表
        node[childrenName].forEach((item) => {
          // 获取子节点的勾选计算属性得到的状态枚举值
          const status = item.checkedStatus
          // 统计选中的数量
          if (status === ECheckedStatus.CHECKED) {
            checkedCount++
          } else if (status === ECheckedStatus.UNCHECKED || status == null) {
            // 统计未选中的数量
            uncheckedCount++
          }
        })
        const childrenLength = node[childrenName].length
        // 先进行全选中的判断:存在选中的且选中数量等于子一代节点数量
        if (checkedCount > 0 && checkedCount === childrenLength) {
          return ECheckedStatus.CHECKED
        } else if (uncheckedCount === childrenLength) {
          // 再进行未选中的判断:没有全选中并且未选中的数量等于子一代节点数量
          return ECheckedStatus.UNCHECKED
        } else {
          // 其余则归结为半选
          return ECheckedStatus.HALF_CHECKED
        }
      }
    },
    set(status: ECheckedStatus) {
      // 基于写入的状态来判断checked值
      const checked = status === ECheckedStatus.CHECKED
      // 设置checked属性
      node.checked = checked
      // 如果是父节点则进行子一代节点的级联设置,注意设置子节点的checkedStatus计算属性会触发递归调用,达到我们向下递归设置的目的!
      if (node[childrenName]) {
        node[childrenName].forEach((child) => {
          child.checkedStatus = status
          child.checked = checked
        })
      }
    }
  })
}

初始化扁平化节点的逻辑完善:

在这里插入图片描述

新增一级节点的处理逻辑完善:

在这里插入图片描述

Tree原始数据结构拍平函数的完善:

在这里插入图片描述

tsx模板完善

新增一个点击勾选的事件处理函数

// 节点勾选点击事件处理函数
const checkNode = (node: IFlatTreeNode) => {
  // 注意,是对原始节点进行操作
  const oNode = node.originalNode
  const status = oNode.checkedStatus as any
  // 如果没有选中(可能是半选),执行选中的计算属性写入
  if (status !== ECheckedStatus.CHECKED) {
    oNode.checkedStatus = ECheckedStatus.CHECKED as any
  } else {
    // 如果选中则执行反选写入计算属性
    oNode.checkedStatus = ECheckedStatus.UNCHECKED as any
  }
}

tsx模板中增加选中的图标组件svg-icon,并按照选中状态动态设置icon属性

在这里插入图片描述

  • 7
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
大学生就业服务平台管理系统按照操作主体分为管理员和用户。管理员的功能包括学生档案管理、字典管理、试卷管理、试卷选题管理、试题表管理、考试记录表管理、答题详情表管理、错题表管理、法律法规管理、法律法规收藏管理、法律法规留言管理、就业分析管理、论坛管理、企业管理、简历管理、老师管理、简历投递管理、新闻资讯管理、新闻资讯收藏管理、新闻资讯留言管理、学生信息管理、宣传管理、学生管理、职位招聘管理、职位收藏管理、招聘咨询管理、管理员管理。用户的功能等。该系统采用了Mysql数据库,Java语言,Spring Boot框架等技术进行编程实现。 大学生就业服务平台管理系统可以提高大学生就业服务平台信息管理问题的解决效率,优化大学生就业服务平台信息处理流程,保证大学生就业服务平台信息数据的安全,它是一个非常可靠,非常安全的应用程序。 管理员权限操作的功能包括管理新闻信息,管理大学生就业服务平台信息,包括考试管理,培训管理,投递管理,薪资管理等,可以管理新闻信息。 考试管理界面,管理员在考试管理界面中可以对界面中显示,可以对考试信息的考试状态进行查看,可以添加新的考试信息等。投递管理界面,管理员在投递管理界面中查看投递种类信息,投递描述信息,新增投递信息等。新闻信息管理界面,管理员在新闻信息管理界面中新增新闻信息,可以删除新闻信息。新闻信息类型管理界面,管理员在新闻信息类型管理界面查看新闻信息的工作状态,可以对新闻信息的数据进行导出,可以添加新新闻信息的信息,可以编辑新闻信息信息,删除新闻信息信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Java小卷

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

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

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

打赏作者

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

抵扣说明:

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

余额充值