当前位置: 首页 > news >正文

JeecgBoot自定义多选组件JCheckBtnGroup

使用JDictSelectTag组件过程中,想实现多选标签组件,如下:

官方文档只支持单选,就需要自定义多选组件,官方也有可用的复选框组件JCheckbox组件,不是很喜欢复选框的样式,就自定义一个组件

在JCheckbox基础上修改,将a-ckeckbox-group替换成a-button实现,选择后的逻辑不变,只替换样式,完整代码如下:

<template><div class="button-group"><a-buttonv-for="option in checkOptions":key="option.value":class="getButtonClass(option.value)":style="getButtonStyle(option.value)"@click="toggleCheckbox(option.value)">{{ option.label }}</a-button></div>
</template><script lang="ts">import { defineComponent, ref, watchEffect, onMounted } from 'vue';import { propTypes } from '/@/utils/propTypes';import { useAttrs } from '/@/hooks/core/useAttrs';import { initDictOptions } from '/@/utils/dict/index';import { useRootSetting } from '@/hooks/setting/useRootSetting';export default defineComponent({name: 'JCheckBtnGroup',props: {value: propTypes.oneOfType([propTypes.string, propTypes.number]),dictCode: propTypes.string,useDicColor: propTypes.bool.def(false),options: {type: Array,default: () => [],},},emits: ['change', 'update:value'],setup(props, { emit }) {const attrs = useAttrs();const checkOptions = ref<any[]>([]);const checkboxArray = ref<any[]>([]);const bgColor = ref('');const userDictColor = ref(false);onMounted(() => {const { getThemeColor } = useRootSetting();userDictColor.value = props.useDicColor;bgColor.value = getThemeColor.value;document.documentElement.style.setProperty('--bg-color', getThemeColor.value);});// Watch for value changeswatchEffect(() => {let temp = props.value;if (!temp && temp !== 0) {checkboxArray.value = [];} else {temp = temp + '';checkboxArray.value = temp.split(',');}if (props.value === '' || props.value === undefined) {checkboxArray.value = [];}});// Watch for dictCode changeswatchEffect(() => {initOptions();});// Initialize optionsasync function initOptions() {if (props.options && props.options.length > 0) {checkOptions.value = props.options;return;}if (props.dictCode) {const dictData = await initDictOptions(props.dictCode);checkOptions.value = dictData.reduce((prev, next) => {if (next) {const value = next['value'];prev.push({label: next['text'],value: value,color: next['color'],});}return prev;}, []);}}// Handle change eventfunction handleChange() {emit('update:value', checkboxArray.value.join(','));emit('change', checkboxArray.value.join(','));}// Toggle checkbox selectionfunction toggleCheckbox(value) {if (checkboxArray.value.includes(value)) {checkboxArray.value = checkboxArray.value.filter(v => v !== value);} else {checkboxArray.value.push(value);}handleChange();}// Get dictionary colorconst getDicColor = (value) => {if (props.useDicColor) {const findItem = checkOptions.value.find((item) => item.value == value);if (findItem) {return findItem.color;}}return null;};// Get button class based on conditionsconst getButtonClass = (value) => {if (checkboxArray.value.includes(value)) {return userDictColor.value ? 'button-checked2' : 'button-checked';}return '';};// Get dynamic button styleconst getButtonStyle = (value) => {if (checkboxArray.value.includes(value)) {return {color: '#fff',backgroundColor: userDictColor.value ? getDicColor(value) : bgColor.value,borderColor: bgColor};}return {color: '#000',backgroundColor: '#fff',};};return { checkboxArray, checkOptions, attrs, handleChange, getDicColor, toggleCheckbox, getButtonStyle, userDictColor, getButtonClass, bgColor };},});
</script><style lang="less" scoped>.button-group {display: flex;flex-wrap: wrap;gap: 8px;}.a-button {margin: 4px;border-radius: 8px;font-size: 14px;border: 1px solid transparent;}/*.button-checked {border-color: var(--bg-color);}.button-checked2 {border-color: var(--bg-color);}*/
</style>

字典中配置颜色,并在componrntProps中设置useDicColor: true,选中后会显示对应的颜色

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Redis 的标准使用规范之数据类型使用规范
  • 【学员提问】对于typescript的assert和casting,即类型断言和类型转换,我还不太理解,请结合例子梳理下知识点,并且出几道题考考我
  • 普发Pfeiffer TCP600TCP5000手侧
  • CleanMyMac X2024破解版mac电脑清理工具
  • Redis 集群会有写操作丢失吗?为什么?
  • 期权组合策略有什么风险?期权组合策略是什么?
  • 110个oracle常用函数总结
  • 2024年我的利基出版转型——新战略与重点解析
  • 【4.2 深度学习中的损失函数】
  • Linux系统【RockyLinux9.4】下K8S集群【1.31.0】安装部署指南
  • 【C语言】选择题错题集
  • 干货分享 | 激光测风雷达中准确监测温度、湿度和气压的重要性
  • HTML + js 生成一个线路走向图,可以标记总共有多少站,用户到达第几站了
  • 计算机毕业设计python校园物资招标投标竞标系统 w235g
  • Vue3.0项目实战(三)——大事件管理系统首页 layout 架子与文章分类的实现
  • [PHP内核探索]PHP中的哈希表
  • @jsonView过滤属性
  • canvas绘制圆角头像
  • Invalidate和postInvalidate的区别
  • leetcode378. Kth Smallest Element in a Sorted Matrix
  • scrapy学习之路4(itemloder的使用)
  • 如何正确配置 Ubuntu 14.04 服务器?
  • 用jquery写贪吃蛇
  • ![CDATA[ ]] 是什么东东
  • ###51单片机学习(2)-----如何通过C语言运用延时函数设计LED流水灯
  • $.each()与$(selector).each()
  • (4)Elastix图像配准:3D图像
  • (day6) 319. 灯泡开关
  • (板子)A* astar算法,AcWing第k短路+八数码 带注释
  • (附源码)springboot 基于HTML5的个人网页的网站设计与实现 毕业设计 031623
  • (六)什么是Vite——热更新时vite、webpack做了什么
  • (十六)视图变换 正交投影 透视投影
  • (一)appium-desktop定位元素原理
  • (转)http协议
  • (转)JVM内存分配 -Xms128m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=512m
  • (转)程序员技术练级攻略
  • (轉貼) 資訊相關科系畢業的學生,未來會是什麼樣子?(Misc)
  • .net CHARTING图表控件下载地址
  • .NET Core WebAPI中使用swagger版本控制,添加注释
  • .NET Framework 3.5安装教程
  • .net6 core Worker Service项目,使用Exchange Web Services (EWS) 分页获取电子邮件收件箱列表,邮件信息字段
  • .net6 webapi log4net完整配置使用流程
  • .NET中使用Redis (二)
  • .考试倒计时43天!来提分啦!
  • /3GB和/USERVA开关
  • @31省区市高考时间表来了,祝考试成功
  • @hook扩展分析
  • @property python知乎_Python3基础之:property
  • [ vulhub漏洞复现篇 ] Hadoop-yarn-RPC 未授权访问漏洞复现
  • [.net]官方水晶报表的使用以演示下载
  • [Algorithm][动态规划][路径问题][不同路径][不同路径Ⅱ][珠宝的最高价值]详细讲解
  • [android]-如何在向服务器发送request时附加已保存的cookie数据
  • [AutoSar]BSW_Com02 PDU详解
  • [C++进阶篇]STL中vector的使用
  • [HDU5685]Problem A