使用vue构建自己的组件库 — checkbox 多选框「建议收藏」

使用vue构建自己的组件库 — checkbox 多选框「建议收藏」组件设计初期需要判断在哪种场景使用组件,组件中需要定义计算属性,通过组件是否被group组件包裹,从而判断组件而定应用场景. group也会在保存自己的组内多选框,以便实现全选和反选的功能. model的get需要优先获取group的值,其次是组件传入的v-model,self…

使用vue构建自己的组件库

说在前面,组件库的UI是参照vant,毕竟自己不会设计,配色和样式用他们的也比较合适,功能上也参照了element-ui,也仅仅只是一个学习项目 组件设计时的一些觉得有点意思的地方,可以跟各位分享一下

Github地址

多选框

可能会用到的场景

  1. 状态切换
  2. 表单多选

对组件的设计可以分为样式部分和功能部分考虑

样式上可能需要定制化的部分

定制需要区分全局(多选框组)和局部(单个多选框)

  1. 禁用状态 | 多选框禁止点击
  2. 文本禁止点击 | 点击label无法触发
  3. 选中颜色 | 可以传入css颜色值
  4. 图标大小 | 可以传入css长度值
  5. 图标形状 | 默认圆形,可以使用方形图标
  6. 图标自定义 | 包括使用内置图标 和 使用第三方图片
  7. 多选框组内联

功能上需要区别应用场景

多选框的组件的设计需要考虑到 两种使用场景的区别, 切换状态表单多选

如果是状态切换时

组件只有一个,需要绑定Boolean类型的v-model值

如果是表单多选

基础多选框组件需要外层被group组件包裹,group绑定一个Array数组类型的v-model值

组件设计初期需要判断在哪种场景使用组件,组件中需要定义计算属性,通过组件是否被group组件包裹,从而判断组件而定应用场景.

 parentGroup() {
      let parent = this.$parent;
      // 这里使用循环的原因是 多选框可能不会直接嵌套在group组中,可能会与cell组件混用,需要向上查找group组件
      while (parent) {
        if (parent.$options.componentName && parent.$options.componentName === 'JiemiccChockboxGroup') {
          break;
        }
        parent = parent.$parent;
      }
      return parent;
    },

group也会在保存自己的组内多选框,以便实现全选和反选的功能.


多选框组件的许多特性会区别对待两种使用场景:

多选框自身绑定的v-mode值

model: {
      get() {
        return this.parentGroup
          ? this.parentGroup.value
          : this.value !== undefined
            ? this.value
            : this.selfModel;
      },
      set(val) {
        if (this.parentGroup) {
          this.parentGroup.$emit('change', val);
        } else if (this.value !== undefined) {
          this.$emit('input', val);
        } else {
          this.selfModel = true;
        }
      },

model为多选框自身的v-model计算属性

  1. model的get需要优先获取group的值,其次是组件传入的v-model,selfModel为获取失败时组件自身的缺省值.
  2. model的set也会分三个部分去区分当前组件的使用场景

自定义样式

 checkboxIconSize() {
      return this.iconSize || (this.parentGroup && this.parentGroup.iconSize);
    },

样式自定义使用计算属性来实现,可全局设置和局部设置,且局部设置优先.

多选框组功能定制

限制选择数

多选时,经常需要限定最大或最小选择数,可以在group组件中传入 min 以及 max 的prop属性,进行控制

 isLimitDisbled() {
      if (!this.parentGroup) return false;
      const { max, min } = this.parentGroup;

      return !!(min || max) && (this.model.length <= min && this.checkboxChecked) || (this.model.length >= max && !this.checkboxChecked);
    },

计算属性 isLimitDisbled代表着 多选框的限制状态,包括样式和功能上的体现. 我们需要思考在什么情况下限制多选框的选择:

  1. 当min 和 max 至少有一个限定
  2. 当前选择组的选定数量小于等于最小数,且选定框当前为选定状态
  3. 当前选择组的选定数量大于等于最小数,且选定框当前不在选定状态
反选和全选

group组件中定义相关方法,可以在适当的时候触发

chooseToggle(all) {
      if (all) {
        this.checkboxChild.forEach((child) => {
          child.initChecked();
        });
      } else {
        const allValue = this.checkboxChild.map(child => child.label);
        const subValue = allValue.filter(val => !this.value.includes(val));
        this.$emit('change', subValue);
      }
    },
  1. 传入参数all代表全选, 遍历group组件的多选框子组件触发initChecked方法(不是选定更改为选定)
  2. 不传入参数即为反选, 求得全部可选和已选的差值即可.(之前考虑过模拟触发checkbox的click事件,但是会vue的dom处理时是异步更新的,只会缓存最后一个点击结果的model值)

与cell组件嵌套使用

 chooseItem(index) {
      this.checkboxChild[index].$el.click();
    },

group定义主动点击多选框方法,当cell点击时触发即可. 但是要注意,不能在需要在多选框组件禁止点击冒泡, 不禁止会在点击多选框时同时触发cell点击事件,两这样就两次点击效果相反.

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/13889.html

(0)

相关推荐

  • 用Python实现可变空白的美观排版

    用Python实现可变空白的美观排版排版作为出版的一个重点环节,对于一本书籍或者一份报纸杂志,其排版质量直接影响着读者的阅读体验。在排版过程中,空白的使用非常重要。空白可以分隔不同的内容,同时可以让阅读更为舒适和美观。

    2024-03-15
    97
  • redis妙用_生活小诀窍

    redis妙用_生活小诀窍Redis 在当前的技术社区里是非常热门的。从来自 Antirez 一个小小的个人项目到成为内存数据存储行业的标准,Redis已经走过了很长的一段路。 随之而来的一系列最佳实践,使得大多数人可以正确地

    2023-02-15
    154
  • 数据库的维护「终于解决」

    数据库的维护「终于解决」事务 数据库并发控制的对象 事务是数据库的逻辑工作单位 序列中的操作要么全做,要么全不做 特性; 原子性 一个事务中的所有操作是不可分割的,要么全部执行,要么 全部不执行,这就是事务的原子性。 一致性

    2023-03-04
    152
  • 用正则表达式(Regex)在Python中进行文本匹配和替换

    用正则表达式(Regex)在Python中进行文本匹配和替换正则表达式,简称为Regex,是用来匹配字符串的一种工具。在Python中使用正则表达式需要引入re模块。正则表达式的基本语法如下:

    2024-01-15
    96
  • 深度系统安装mysql

    深度系统安装mysql# 安装 Mysql 8.0.19下载 MySQL Community Server 8.0.19 【Compressed TAR Archive】(mysql-8.0.19-linux-glibc…

    2023-04-05
    149
  • Elasticsearch + Logstash + Filebeat + Kibana搭建ELK日志分析平台(官方推荐的BEATS架构)[亲测有效]

    Elasticsearch + Logstash + Filebeat + Kibana搭建ELK日志分析平台(官方推荐的BEATS架构)[亲测有效]俗话话说的号,没有金刚钻,也不揽那瓷器活;日志分析可以说是所有大小系统的标配了,不知道有多少菜鸟程序员有多喜欢日志,如果没了日志,那自己写的bug想不被别人发现,可就难了; 有了它,就可将bug们统统

    2023-08-02
    144
  • clickhouse 预聚合_clickhouse入门

    clickhouse 预聚合_clickhouse入门上篇笔记讲到了聚合函数的实现并且带大家看了聚合函数是如何注册到ClickHouse之中的并被调用使用的。这篇笔记,笔者会续上上篇的内容,将剖析一把ClickHouse聚合流程的整体实现。 第二篇文章,

    2023-03-22
    149
  • Anaconda和Pandas:Python工程师的必备工具

    Anaconda和Pandas:Python工程师的必备工具Python是一门广泛应用于科学计算、数据分析和人工智能领域的高级编程语言。Python的快速发展和广泛应用,带来了许多强大的工具,其中Anaconda和Pandas无疑是Python工程师必备的两大工具。Anaconda是一个含有多种数据分析工具和科学计算环境的Python发行版,而Pandas是用于Python编程语言的、基于NumPy的数据处理工具。

    2024-09-11
    27

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注