uniapp基于uview表单二次封装

这是我的第二个uniapp项目,前一个主要使用thor-ui组件,目前这个是uview,听说这个框架更好用一些,我也是第一次使用,不足之处,慢慢改进。
页面样式:
大体页面样式
代码 :
common-form.vue

<template>
	<view>
		<u--form :model="form" ref="uForm" :rules="rules" :labelWidth="labelWidth"  labelPosition="top">
			<u-form-item :label="item.label" :prop="item.prop" v-for="(item) in formData" :key="item.prop" 
			 :required="item.isRule === '1'"
			 customStyle="padding:16upx 32upx;background:#fff;margin-top:32upx;" class="form-item"
			 @click="handleFormItem(item)">
				<!-- 输入框 -->
				<u-input v-model="form[item.prop]" :placeholder="placeholder" border="none" clearable v-if="item.type=='input'"/>
				<number  v-if="item.type=='number'" :itemData="item" @ok="setFormProp"/>
				<!-- 文本域 -->
				<u--textarea v-model="form[item.prop]" placeholder="请输入内容" v-if="item.type=='textarea'" border="none" customStyle="padding:0" :height="20 * item.rows"></u--textarea>
				<textarea v-model="form[item.prop]" placeholder="请输入内容" v-if="item.type=='TextContent'" disabled="true" border="none" customStyle="padding:10upx" :height="20 * item.rows"></textarea>
				<!-- 单选框 -->
				<u-radio-group  v-model="form[item.prop]" v-if="item.type == 'radio'"  placement="column">
					<u-radio :label="radio.label" :name="radio.value" :class="[radioIndex!==0?'u-mt-40': 'u-mt-16','radio']" v-for="(radio,radioIndex) in item.options" :key="radio.value"></u-radio>
				</u-radio-group>
				<!-- 复选框 -->
				<u-checkbox-group
					v-model="form[item.prop]"
					placement="column"
					v-if="item.type == 'checkbox'"
					activeColor="#0054A3"
					class="checkbox-group">
					<u-checkbox
						:customStyle="{marginBottom: '8px'}"
						v-for="(item, index) in item.options"
						:key="index"
						:label="item.label"
						:name="item.value"
						class="u-mb-32"
					>
					</u-checkbox>
				</u-checkbox-group>
				
				<!-- 时间 -->
				<template v-if="isShowDate(item)">
					<!-- <u-input v-model="form[item.prop]" placeholder="请选择" border="none" clearable readonly/> -->
					<view class="u-content-color">
						{
   {
    translateTime(form[item.prop]) }}
					</view>
					<u-icon
						slot="labelTop-Right"
						name="arrow-right" color="#a9a9a9" size="18" v-if="!form[item.prop]">
					</u-icon>
					<u-icon
						slot="labelTop-Right"
						name="close-circle-fill" color="#a6a6a6" size="18" @click.native.stop="form[item.prop]=''" v-else>
					</u-icon>
				</template>
				
				<!-- 图片 -->
				<template v-if="item.type == 'file'">
					<view class="" slot="labelTop-Right" @click="uploadImage">
						<u-icon name="photo" size="25" color="#363636"></u-icon>
					</view>
					<view class="u-rela u-mr-32" v-for="(image,index) in form[item.prop]" :key="index">
						<u--image :src="image" radius="2" width="90upx" height="90upx" @click.native.stop="previewImage(image)"></u--image>
						<view class="image-close u-flex-xy-center" @click="handleDeleteImage(item.prop,index)">
							<u-icon name="close" color="#fff" size="12"></u-icon>
						</view>
					</view>
				</template>
				
				<!-- 选择器 -->
				<template v-if="item.type == 'select'">
					<!-- <u-input v-model="form[item.prop]" placeholder="请选择" border="none" clearable readonly v-if=
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个使用 uview-ui 多列选择器组件进行二次封装的示例: ``` <template> <view> <u-popup v-model="showPicker" position="bottom" :overlay="true"> <view> <u-picker-view :value="selectedValues" @change="onPickerChange"> <u-picker-view-column v-for="(column, index) in columns" :key="index"> <view v-for="(item, i) in column" :key="i"> <u-checkbox v-model="item.checked"> {{ item.label }} </u-checkbox> </view> </u-picker-view-column> </u-picker-view> <u-button type="primary" @click="confirm">确定</u-button> </view> </u-popup> <u-input :value="selectedLabels.join(',')" @click="showPicker = true" disabled></u-input> </view> </template> <script> export default { props: { columns: { type: Array, default: () => [] } }, data() { return { showPicker: false, selectedValues: [], selectedLabels: [] } }, mounted() { this.initSelectedValues() }, methods: { initSelectedValues() { this.selectedValues = this.columns.map(column => { return column.findIndex(item => item.checked) }) this.updateSelectedLabels() }, onPickerChange(e) { this.selectedValues = e.detail.value this.updateSelectedLabels() }, updateSelectedLabels() { this.selectedLabels = this.selectedValues.map((value, index) => { return this.columns[index][value].label }) }, confirm() { this.showPicker = false this.$emit('change', this.selectedLabels) } } } </script> ``` 在这个示例中,我们使用了 u-popup、u-picker-view、u-picker-view-column 和 u-checkbox 组件来构建一个多列联动多选选择器。它接收一个 columns 数组作为参数,每个元素代表一列数据,每个元素包含 label 和 checked 两个属性,分别表示选项的文本和是否被选中。通过 u-checkbox 组件来实现多选功能。 组件内部使用了 selectedValues 数组来存储每列选中的值的索引,使用 selectedLabels 数组来存储每列选中的值的文本。在初始化和选择变化时,通过 updateSelectedLabels 方法来更新 selectedLabels 数组。在点击确定按钮时,通过 emit 方法将选中的值传递给父组件。 这是一个简单的示例,你可以根据自己的业务需求进行修改和扩展。希望对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值