uni-app checkbox 全选的实现 与checkbox默认样式的更改

本文介绍如何在uni-app中实现checkbox全选功能,包括H5部分的代码展示和JS逻辑处理,以及如何在APP.vue全局修改checkbox的默认样式。通过监听change事件,实现了全选和单个选中状态的同步更新,并提供了全选按钮的切换效果。

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

uni-app checkbox 全选的实现

H5部分代码

<view class="list-title row between">
					<checkbox-group name="allCheck" @change="allChange">
						<label class="row uni-list-cell uni-list-cell-pd">
							<checkbox value="" :checked="allCheck.checked" />
							<view>全选</view>
						</label>
					</checkbox-group>
				</view>
				<view class="list">
					<checkbox-group @change="checkboxChange">
						<view class="row between food-list" v-for="(item,index) in showList" :key="index">
							<label class="row">
								<checkbox :value="JSON.stringify(item)" :checked="item.checked" />
								<view>{{item.name}}</view>
							</label>
						</view>
					</checkbox-group>
				</view>

js部分的代码

export default {
		data() {
			return {
				allCheck: {
					name: '全选',
					value: 'all',
					checked: false
				}
			}
		},
		created() {
			this.init();
		},
		methods: {
		//默认全部选中
			init() {
					this.showList.map(item => this.$set(item, 'checked', true));
					this.$set(this.allCheck, 'checked', true);
			},
			//点击全部选中的事件
			allChange(e) {
				if (e.detail.value.length == 0) {
					this.showList.map(item => this.$set(item, 'checked', false));
					this.$set(this.allCheck, 'checked', false);
				} else {
					this.showList.map(item => this.$set(item, 'checked', true));
					this.$set(this.allCheck, 'checked', true);
				}
			},
			//点击列表中复选框的事件
			checkboxChange(e) {
				let values = e.detail.value;
				this.outList = [];
				for (let i = 0, lenI = values.length; i < lenI; ++i) {
					const item = JSON.parse(values[i])

					this.outList.push(item)
					if (values.includes(item.value)) {
						this.$set(item, 'checked', true)
					} else {
						this.$set(item, 'checked', false)
					}
				}
				// 判断全选 选择框的状态
				if (this.outList.length == this.showList.length) {
					this.$set(this.allCheck, 'checked', true)
				} else {
					this.$set(this.allCheck, 'checked', false)
				}
			}
		}
	}

uni-app checkbox默认样式的更改

uni-checkbox .uni-checkbox-input {
		border-radius: 50% !important;
		transform:scale(0.8)
	}
	
	uni-checkbox .uni-checkbox-input.uni-checkbox-input-checked {
		background-image: url(./static/icon/checked.png);
		background-size: 100%;
	}
	
	uni-checkbox .uni-checkbox-input.uni-checkbox-input-checked::before {
		width: 20rpx;
		height: 20rpx;
		line-height: 20rpx;
		text-align: center;
		font-size: 0px;
		background-repeat: no-repeat;
		border-color: #38CAED;
		transform: translate(-80%, -50%) scale(1);
		-webkit-transform: translate(-70%, -50%) scale(1);
	}

注意!! 要在APP.vue 里更改checkbox默认样式,在组件中更改不生效。

<think>我们参考用户的需求:在uni-app中使用uView框架,通过picker和checkbox组件实现表单的下拉多选功能。但是注意,uView的Picker组件本身不支持多选(它的mode属性没有多选模式),所以我们需要结合其他组件来实现。用户提供的引用[1]中使用了u-picker,但它是单列或多列选择,并不支持多选。因此,我们需要自定义一个类似下拉的多选组件。思路:1.使用u-dropdown(下拉菜单)作为容器,内部放置checkbox-group和checkbox。2.当用户点击下拉菜单时,显示复选框列表,用户选择后,将选中的值绑定到表单数据中。具体步骤:步骤1:在表单中使用u-dropdown,并设置一个触发元素(如输入框)来打开下拉菜单。步骤2:在下拉菜单的内容区域放置u-checkbox-group和多个u-checkbox。步骤3:通过v-model绑定选中的值(数组)。步骤4:选择完成后,可以自动关闭下拉菜单(或者通过按钮确认关闭)。代码示例:注意:确保已经正确安装和引入uView组件。模板部分:</think>在 uni-app 中使用 uView 框架实现下拉多选功能,可以通过组合 `u-picker` 和 `u-checkbox` 组件来实现。以下是完整的实现方案: ### 完整实现代码 ```html <template> <u-form :model="form" ref="uForm"> <!-- 下拉多选触发区域 --> <u-form-item label="诉求类型" prop="appealTypes" borderBottom @click="showPicker = true" > <u-icon slot="right" name="arrow-right"></u-icon> <u-input v-model="selectedLabels" placeholder="请选择诉求类型" border="none" disabled disabledColor="#ffffff" ></u-input> </u-form-item> <!-- 多选选择器 --> <u-picker :show="showPicker" :columns="[appealTypes]" keyName="label" @confirm="handleConfirm" @cancel="showPicker = false" > <view class="picker-content"> <u-checkbox-group v-model="form.appealTypes" @change="checkboxChange" > <u-checkbox v-for="(item, index) in appealTypes" :key="index" :name="item.value" :label="item.label" ></u-checkbox> </u-checkbox-group> </view> </u-picker> </u-form> </template> <script> export default { data() { return { showPicker: false, // 控制选择器显示 selectedLabels: '', // 显示已选文本 form: { appealTypes: [] // 存储选中的值 }, // 诉求类型选项 appealTypes: [ { value: 1, label: '质量问题' }, { value: 2, label: '发货问题' }, { value: 3, label: '售后服务' }, { value: 4, label: '价格问题' } ] } }, methods: { // 复选框变化处理 checkboxChange(values) { this.form.appealTypes = values; }, // 确认选择 handleConfirm() { this.showPicker = false; // 更新显示文本 const selectedItems = this.appealTypes.filter(item => this.form.appealTypes.includes(item.value) ); this.selectedLabels = selectedItems.map(item => item.label).join(', '); } }, mounted() { // 表单验证规则 this.$refs.uForm.setRules({ 'appealTypes': { type: 'array', required: true, message: '请至少选择一项诉求类型', trigger: 'change' } }) } } </script> <style scoped> .picker-content { padding: 20rpx; max-height: 60vh; overflow-y: auto; } </style> ``` ### 关键实现点说明 1. **组件组合原理**: - 使用 `u-picker` 作为下拉容器 - 在 `u-picker` 内部嵌入 `u-checkbox-group` 实现多选功能 - 通过 `v-model` 双向绑定选中的值 2. **数据流控制**: ```javascript form: { appealTypes: [] // 存储选中项的value值 }, appealTypes: [ { value: 1, label: '质量问题' }, // ...其他选项 ] ``` 3. **显示文本更新**: ```javascript handleConfirm() { const selectedItems = this.appealTypes.filter(item => this.form.appealTypes.includes(item.value) ); this.selectedLabels = selectedItems.map(item => item.label).join(', '); } ``` 4. **表单验证配置**: ```javascript this.$refs.uForm.setRules({ 'appealTypes': { type: 'array', // 验证类型必须是数组 required: true, message: '请至少选择一项诉求类型', trigger: 'change' } }) ``` ### 优化建议 1. **大数据量优化**: ```html <u-checkbox-group> <!-- 添加scroll-view支持滚动 --> <scroll-view scroll-y :style="{maxHeight: '400rpx'}"> <u-checkbox v-for="..."></u-checkbox> </scroll-view> </u-checkbox-group> ``` 2. **添加搜索过滤**: ```html <u-input placeholder="搜索诉求类型" v-model="searchText" @input="filterOptions" ></u-input> ``` 3. **添加全选功能**: ```html <u-checkbox :name="selectAll" label="全选" @change="handleSelectAll" ></u-checkbox> ``` ### 使用注意事项 1. **uView版本要求**: - 确保 uView 版本 ≥ 1.8.4(支持自定义picker内容) - 安装命令:`npm install uview-ui` 2. **跨平台兼容**: - 在 H5 和微信小程序测试通过 - 安卓端需添加 `safe-area-inset-bottom` 属性适配全面屏 3. **常见问题解决**: - **选项不显示**:检查 `appealTypes` 数据格式是否正确 - **无法多选**:确认 `u-checkbox-group` 的 `v-model` 绑定的是数组 - **验证失效**:检查 `setRules` 是否在 `mounted` 后调用 > 此方案参考了 uView 的 Picker 组件[^1] 和 uni-ui 的灵活组合思路[^2],适用于需要表单验证的多选场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值