文章目录

  • 组件介绍
  • 开发思路
  • 组件安装与使用
  • 组件代码
  • 参数说明
  • 事件
  • 关于dxui组件库


组件介绍

“Checkbox” 组件是用户界面中的一种常见交互元素,通常用于允许用户从多个选项中选择一个或多个选项。它是一种复选框,用户可以通过勾选或取消勾选的方式来表示其选择。以下是关于 “Checkbox” 组件的介绍和特点:

  1. 多选:
  • “Checkbox” 组件允许用户从多个选项中选择一个或多个,这使得它非常适合用于多选操作,例如选择兴趣、筛选项、任务清单等。
  1. 复选框控件:
  • “Checkbox” 通常表示为一个小方框,用户可以点击或点击标签来切换勾选状态。
  1. 标签文本:
  • 通常,每个 “Checkbox” 都伴随一个文本标签,用于描述选项。用户可以点击文本或复选框来切换选择状态。
  1. 单选和多选模式:
  • “Checkbox” 组件通常可以配置为单选或多选模式。在单选模式下,只能选择一个选项,而在多选模式下,可以选择多个选项。
  1. 禁用状态:
  • “Checkbox” 可以处于禁用状态,以防止用户进行选择。禁用状态的复选框通常呈现为灰色,用户无法进行勾选操作。
  1. 全选/取消全选:
  • 在某些情况下, “Checkbox” 组件用于全选或取消全选操作,例如在表格中选择所有行。
  1. 事件处理:
  • “Checkbox” 组件通常支持事件处理,开发人员可以监听复选框状态变化事件,并在选择状态发生变化时执行自定义操作。
  1. 响应式设计:
  • “Checkbox” 组件通常支持响应式设计,以适应不同屏幕尺寸和设备类型。
  1. 可访问性:
  • 良好的 “Checkbox” 组件应该考虑到可访问性,以确保它对于使用辅助技术的用户也是可访问的。

“Checkbox” 组件是用户界面中的重要元素,它们用于用户选择操作、筛选、配置选项等各种交互式场景。它通常用于网页应用程序、移动应用程序、桌面应用程序等。前端框架和库通常提供了 “Checkbox” 组件的实现,或者你可以自行编写代码来创建适合你应用程序需求的多选元素。

开发思路

checkbox属于比较简单的组件之一,通常情况下需要实现以下逻辑

  1. 两种状态,被选中或者未被选中
  2. 可以设置默认值,或者传入一个checked值,直接使其变成一个完全受控组件
  3. 需要有状态改变的回调

实现的思路主要是依靠input type=“checkbox”,我们可以在这基础上修改样式,来实现新的组件ui,change事件和checked的逻辑,可以依靠input type="checkbox"自带的逻辑,这样可以省去很多代码。

组件安装与使用

需要先安装vue3-dxui

yarn add vue3-dxui

或者

npm install vue3-dxui

全局main.ts中引入css

import { createApp } from 'vue'
import App from './App.vue'
import router from './router'
import store from './store'
import 'vue3-dxui/dxui/dxui.css'

createApp(App).use(store).use(router).mount('#app')

按需引入

<script>
import { Checkbox } from 'vue3-dxui'

export default {
  components: {
  	Checkbox
  }
}
</script>

组件代码

<template>
  <div class="dx-checkbox-warpper" :class="checkedDisabled ? 'dx-checkbox-disabled' : ''">
    <input
      class="dx-checkbox-input"
      type="checkbox"
      v-model="checkedValue"
      :disabled="checkedDisabled"
      @change="onCheckedValueChange"
    />
    <span class="dx-checkbox-text"><slot /></span>
  </div>
</template>

<script lang="ts">
import { ComponentInternalInstance, getCurrentInstance, ref, PropType } from 'vue'
import { Data } from './types'

export default {
  props: {
    checked: {
      required: false,
      default: undefined,
      type: Boolean
    },
    defaultChecked: {
      required: false,
      default: false,
      type: Boolean
    },
    disabled: {
      required: false,
      default: false,
      type: Boolean
    },
    onChange: {
      required: false,
      default: undefined,
      type: Function
    }
  },
  setup(props: Data) {
    const currentInstance: ComponentInternalInstance | null = getCurrentInstance()
    const checkedValue = ref(props.checked || props.defaultChecked)
    const checkedDisabled = ref(props.disabled)

    const onCheckedValueChange = function (e: Event) {
      if (props.checked !== undefined) {
        checkedValue.value = props.checked
      }
      currentInstance?.emit('change', e)
    }
   
    return {
      checkedValue,
      checkedDisabled,
      onCheckedValueChange
    }
  }
}
</script>

<style lang="scss" scoped>
@import '@/scss/layout.scss';
.dx-checkbox-warpper {
  display: inline-block;
  margin-right: 8px;
  .dx-checkbox-text {
    padding: 0 8px;
    font-size: 14px;
    vertical-align: text-top;
  }
  input[type='checkbox'] {
    cursor: pointer;
    font-size: 14px;
    width: 16px;
    height: 16px;
    position: relative;
  }

  input[type='checkbox']:after {
    position: absolute;
    width: 16px;
    height: 16px;
    top: 0;
    content: ' ';
    color: $white-color;
    display: inline-block;
    visibility: visible;
    padding: 0px 3px;
    border-radius: 3px;
    background: $white-color;
    border: $border;
    box-sizing: border-box;
  }

  input[type='checkbox']:checked:after {
    content: '\2713';
    font-size: 12px;
    font-weight: 600;
    background-color: $blue-color;
    border: none;
  }
}

.dx-checkbox-disabled {
  cursor: not-allowed;
  .dx-checkbox-text {
    padding: 0 8px;
    font-size: 14px;
    vertical-align: text-top;
    color: $grey-color;
  }
  input[type='checkbox'] {
    cursor: not-allowed;
    font-size: 14px;
    width: 16px;
    height: 16px;
    position: relative;
  }

  input[type='checkbox']:after {
    position: absolute;
    width: 16px;
    height: 16px;
    top: 0;
    content: ' ';
    color: $white-color;
    display: inline-block;
    visibility: visible;
    padding: 0px 3px;
    border-radius: 3px;
    background: $white-color;
    border: $border;
    box-sizing: border-box;
  }

  input[type='checkbox']:checked:after {
    content: '\2713';
    font-size: 12px;
    font-weight: 600;
    background-color: $grey-color;
    border: none;
  }
}
</style>

参数说明

参数

说明

checked

布尔值类型,默认值是undefined 父组件传递时,将会 让组件变为一个完全受控组件,只有当父组件的checked发生变化时,checkbox的状态才会发生改变

defaultChecked

布尔值类型,默认值是false 父组件传递时,将会给与组件一个初始值,但不影响组件自身发生任何变化

disabled

布尔值类型,默认值是false, 决定组件是否被禁用

onChange

函数类型, 当组件状态发生改变,或想要发生改变时将会被调用,可以通过函数的第一个参数,event.target.checked 来获取将要改变的状态(如果父组件传递了checked,组件本身无法改变状态)

事件

事件名称

说明

change

当组件状态发生改变,或想要发生改变时将会被调用,可以通过函数的第一个参数,event.target.checked 来获取将要改变的状态(如果父组件传递了checked,组件本身无法改变状态)

关于dxui组件库