vue3 组件篇 Checkbox

本文详细介绍了Checkbox组件的功能特性、开发思路及使用方法。该组件适用于多选操作,支持禁用状态和事件处理,易于集成到Vue3项目中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

组件介绍

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

  1. 多选:

    • “Checkbox” 组件允许用户从多个选项中选择一个或多个,这使得它非常适合用于多选操作,例如选择兴趣、筛选项、任务清单等。
  2. 复选框控件:

    • “Checkbox” 通常表示为一个小方框,用户可以点击或点击标签来切换勾选状态。
  3. 标签文本:

    • 通常,每个 “Checkbox” 都伴随一个文本标签,用于描述选项。用户可以点击文本或复选框来切换选择状态。
  4. 单选和多选模式:

    • “Checkbox” 组件通常可以配置为单选或多选模式。在单选模式下,只能选择一个选项,而在多选模式下,可以选择多个选项。
  5. 禁用状态:

    • “Checkbox” 可以处于禁用状态,以防止用户进行选择。禁用状态的复选框通常呈现为灰色,用户无法进行勾选操作。
  6. 全选/取消全选:

    • 在某些情况下, “Checkbox” 组件用于全选或取消全选操作,例如在表格中选择所有行。
  7. 事件处理:

    • “Checkbox” 组件通常支持事件处理,开发人员可以监听复选框状态变化事件,并在选择状态发生变化时执行自定义操作。
  8. 响应式设计:

    • “Checkbox” 组件通常支持响应式设计,以适应不同屏幕尺寸和设备类型。
  9. 可访问性:

    • 良好的 “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组件库

dxui组件库是我个人搭建的vue3 前端交互组件库,倾向于pc网站的交互模式。

  1. 如果你有任何问题,请在博客下方评论留言,我尽可能24小时内回复。
  2. dxui新上线的官网域名变更 http://dxui.cn
  3. npm 官方链接 https://www.npmjs.com/package/vue3-dxui
  4. 如果你想看完整源码 https://github.com/757363985/dxui

在这里插入图片描述

### 实现 Vue 3 中 element-plus 的 el-checkbox 单选功能 为了实现在 Vue 3 中使用 `element-plus` 库中的 `el-checkbox` 组件来达到单选的效果,可以采用绑定同一个模型变量的方式,并通过监听变化事件来控制其他选项的状态。下面是一个具体的实现方法: #### HTML 结构与模板部分 ```html <template> <div> <!-- 使用v-for循环渲染多个checkbox --> <el-checkbox v-for="(item, index) in options" :key="index" :label="item.value" v-model="selectedValue" @change="handleChange(item)" > {{ item.label }} </el-checkbox> </div> </template> ``` #### JavaScript 部分 (setup 函数内) ```javascript <script setup> import { ref } from &#39;vue&#39;; // 定义可选项数组 const options = [ { label: "Option A", value: "A" }, { label: "Option B", value: "B" }, { label: "Option C", value: "C" } ]; let selectedValue = ref(null); // 初始化为空 function handleChange(currentItem){ if(selectedValue.value !== currentItem.value){ selectedValue.value = currentItem.value; }else{ selectedValue.value = null; // 如果再次点击当前项,则取消选择 } } </script> ``` 这种方法利用了 `el-checkbox` 自带的 `v-model` 双向绑定特性以及 `@change` 事件处理函数,在每次改变时更新选定值并清除非当前项的选择状态。 值得注意的是,默认情况下 `el-checkbox` 是多选模式,因此这里通过编程方式实现了单选逻辑。如果希望更接近传统意义上的单选框行为,也可以考虑直接使用 `el-radio` 或者自定义样式下的原生 `<input type="radio">` 来代替[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

可缺不可滥

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

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

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

打赏作者

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

抵扣说明:

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

余额充值