From fdeb869c386da95150a087bc22bcebc4e57d0f76 Mon Sep 17 00:00:00 2001 From: Tevin <tingquanren@163.com> Date: Tue, 18 Mar 2025 18:16:32 +0800 Subject: [PATCH] 更新所有表单组件文档和头注释 --- forms/checkbox/CCheckBox.vue | 120 ++++++++++++++++++++++++++++++++++++++++++++++++++++++------ 1 files changed, 108 insertions(+), 12 deletions(-) diff --git a/forms/checkbox/CCheckBox.vue b/forms/checkbox/CCheckBox.vue index 68b2ac2..aa9c01a 100644 --- a/forms/checkbox/CCheckBox.vue +++ b/forms/checkbox/CCheckBox.vue @@ -1,10 +1,16 @@ /** * CCheckBox + * 复选框组件,用于在表单中提供多选或单选功能 + * 支持两种显示模式:直接显示模式和弹窗选择模式 + * 支持两种选择类型:多选和单选 * @author Tevin */ <template> - <view class="c-check-box"> + <view + class="c-check-box" + :class="displayType==='dialog'?'c-check-box-dialog':''" + > <AtInput ref="input" :name="itemRes.name" @@ -12,21 +18,66 @@ :required="itemRes.required" :disabled="itemRes.disabled" :error="itemRes.error" - /> + :editable="displayType!=='dialog'" + :placeholder="placeholder" + :value="selectedStr" + :onClick="evt => handleOpen()" + > + <view + v-if="displayType==='dialog'" + class="at-icon at-icon-chevron-right" + /> + </AtInput> <AtCheckbox ref="check" + v-if="displayType==='plane'" :class="'c-check-box-' + boxType" :options="options" :selectedList="selectedList" :onChange="evt => handleChange(evt)" /> + <AtModal + :isOpened="isDialogOpened" + v-if="displayType==='dialog'" + :onClose="evt => handleClose()" + > + <AtModalHeader>请选择{{itemRes.label}}</AtModalHeader> + <AtModalContent> + <scroll-view + class="scrollor" + :scrollY="true" + > + <AtCheckbox + ref="check" + :class="'c-check-box-' + boxType" + :options="options" + :selectedList="selectedList" + :onChange="evt => handleChange(evt)" + /> + <view + class="m-text-ignore" + v-show="options.length===0" + >(选项加载异常)</view> + </scroll-view> + </AtModalContent> + <AtModalAction> + <button @tap="evt => handleClose(evt)">确定</button> + </AtModalAction> + </AtModal> </view> </template> <script> import Taro from '@tarojs/taro'; import { $ } from '@tarojs/extend'; -import { AtInput, AtCheckbox } from 'taro-ui-vue'; +import { + AtInput, + AtCheckbox, + AtModal, + AtModalHeader, + AtModalContent, + AtModalAction, +} from 'taro-ui-vue'; import { Tools } from '@components/common/Tools'; import './cCheckBox.scss'; @@ -35,11 +86,15 @@ components: { AtInput, AtCheckbox, + AtModal, + AtModalHeader, + AtModalContent, + AtModalAction, }, props: { // 表单数据资源(表单组件内部机制专用) itemRes: Object, - // 选项列表 + // 选项列表,单项为 {label,value} options: { type: Array, default: () => [], @@ -49,9 +104,18 @@ type: String, default: 'checkbox', // checkbox 多选、radio 单选 }, + // 显示模式 + displayType: { + type: String, + default: 'plane', // plane 直接显示、dialog 弹窗 + }, + // 占位提示 + placeholder: String, }, data() { - return {}; + return { + isDialogOpened: false, + }; }, computed: { selectedList() { @@ -61,6 +125,14 @@ } else { return [value]; } + }, + selectedStr() { + return (this.selectedList || []) + .map(selected => { + const option = this.options.find(opt => opt.value === selected); + return option ? option.label || '' : ''; + }) + .join(','); }, }, methods: { @@ -72,6 +144,12 @@ if (typeof item === 'undefined') { return; } + const selectedIndex = this.options.findIndex( + opt => opt.value === item, + ); + if (selectedIndex < 0) { + return; + } next.push(item); }); this.itemRes.onChange(next); @@ -79,17 +157,35 @@ // 单选 else if (this.boxType === 'radio') { const next = evt[evt.length - 1]; - this.itemRes.onChange(next); + const selectedIndex = this.options.findIndex(opt => opt.value === next); + if (selectedIndex < 0) { + this.itemRes.onChange(''); + } else { + this.itemRes.onChange(next); + } } + }, + handleOpen() { + if (this.displayType === 'plane') { + return; + } + this.isDialogOpened = true; + }, + handleClose() { + this.isDialogOpened = false; }, }, mounted() { - if (process.env.TARO_ENV === 'h5') { - $(this.$refs.input.$el) - .find('.at-input__container') - .prepend(this.$refs.check.$el); - } else if (process.env.TARO_ENV === 'weapp') { - $(this.$refs.input.$el).find('.at-input__container').append(this.$refs.check); + if (this.displayType === 'plane') { + if (process.env.TARO_ENV === 'h5') { + $(this.$refs.input.$el) + .find('.at-input__container') + .prepend(this.$refs.check.$el); + } else if (process.env.TARO_ENV === 'weapp') { + $(this.$refs.input.$el) + .find('.at-input__container') + .append(this.$refs.check.$el); + } } }, }; -- Gitblit v1.9.1