更新记录
1.0.2(2025-11-04)
下载此版本
fix: 修改依赖
1.0.1(2024-10-08)
下载此版本
更新组件依赖
1.0.0(2024-10-08)
下载此版本
first
查看更多
平台兼容性
uni-app(4.34)
| Vue2 |
Vue3 |
Chrome |
Safari |
app-vue |
app-nvue |
Android |
iOS |
鸿蒙 |
| × |
√ |
√ |
√ |
√ |
√ |
√ |
√ |
√ |
| 微信小程序 |
支付宝小程序 |
抖音小程序 |
百度小程序 |
快手小程序 |
京东小程序 |
鸿蒙元服务 |
QQ小程序 |
飞书小程序 |
快应用-华为 |
快应用-联盟 |
| √ |
√ |
√ |
√ |
√ |
√ |
√ |
√ |
√ |
√ |
√ |
其他
r-form-edit
r-form-edit 配置化表单,通过配置即可自动生成表单。全部组件 完整文档请前往
示例
<template>
<r-config-provider :themeName="themeName">
<page-header title="配置项表单"></page-header>
<r-form-edit
v-model:form="form"
v-model:value="value"
:rules="rules"
@clickButton="onClickButton"
:btns="btns"
@change="onChange"
ref="formRef"
>
</r-form-edit>
</r-config-provider>
</template>
<script setup>
import { ref, computed } from "vue";
import { region } from "@/uni_modules/r-region/js_sdk/region.js";
import useTheme from "@/hooks/useTheme";
const { themeName } = useTheme();
const value = ref({
area: "河北省/唐山市/开平区",
areaCode: "130000,130200,130205",
date: "2024-09-20~2024-09-28",
dateValue: "1726814066702,1727505267588",
time: "00时/01分/01秒",
timeValue: "0,1,1",
});
const form = ref([
[
{
field: "name",
label: "姓名",
},
{
field: "age",
label: "年龄",
config: {
type: "number",
maxLength: 3,
},
},
],
[
{
field: "area",
selectField: "areaCode",
label: "所在地区",
type: "picker",
config: {
readonly: true,
get rigthIcon() {
return !!value.value.area ? "close" : "arrow";
},
onClickRightIcon: (m) => {
value.value.area = "";
value.value.areaCode = "";
},
},
picker: {
columns: region,
title: "请选择地区",
columnsFieldNames: {
text: "label",
value: "value",
loading: false,
children: "children",
},
},
},
{
field: "detailAddress",
label: "详细地址",
showSearch: true,
config: {
rigthIcon: !!value.value.detailAddress ? "close" : "",
onClickRightIcon: (m) => {
value.value.detailAddress = "";
},
},
},
],
[
{
field: "code",
label: "验证码",
button: {
name: "发送验证码",
type: "primary",
disabled: false,
},
},
],
[
{
field: "date",
selectField: "dateValue",
label: "起止日期",
type: "calendar",
config: {
readonly: true,
get rigthIcon() {
return !!value.value.date ? "close" : "arrow";
},
onClickRightIcon: (m) => {
value.value.date = "";
value.value.dateValue = "";
},
},
calendar: {
type: "range",
},
},
{
field: "time",
selectField: "timeValue",
label: "时间",
type: "datePicker",
config: {
readonly: true,
get rigthIcon() {
return !!value.value.date ? "close" : "arrow";
},
onClickRightIcon: (m) => {
value.value.time = "";
value.value.timeValue = "";
},
},
datePicker: {
title: "请选择时间",
loading: false,
columnsType: "second",
hideFields: ["year", "month", "day"],
formatter: [
{
type: "hour",
fn: (e) => {
e.item[e.fields.text] =
(e.item[e.fields.text] < 10
? "0" + e.item[e.fields.text]
: e.item[e.fields.text]) + "时";
return e.item;
},
},
{
type: "minute",
fn: (e) => {
e.item[e.fields.text] =
(e.item[e.fields.text] < 10
? "0" + e.item[e.fields.text]
: e.item[e.fields.text]) + "分";
return e.item;
},
},
{
type: "second",
fn: (e) => {
e.item[e.fields.text] =
(e.item[e.fields.text] < 10
? "0" + e.item[e.fields.text]
: e.item[e.fields.text]) + "秒";
return e.item;
},
},
],
},
},
],
[
{
field: "rate",
label: "评分",
type: "rate",
rate: {},
},
{
field: "checkbox",
label: "多选框",
type: "checkbox",
checkbox: {
list: [
{
label: "苹果",
value: "apple",
},
{
label: "梨子",
value: "pear",
},
{
label: "橘子",
value: "orange",
},
],
},
},
{
field: "radio",
label: "单选框",
type: "radio",
radio: {
list: [
{
label: "苹果",
value: "apple",
},
{
label: "梨子",
value: "pear",
},
{
label: "橘子",
value: "orange",
},
],
},
},
{
field: "switch",
label: "开关",
type: "switch",
},
],
]);
const rules = ref({
name: [
{
required: true,
message: "请输入用户名",
},
{
min: 2,
max: 10,
message: "长度在 2 到 10 个字符",
},
],
age: [
{
required: true,
message: "请输入年龄",
},
],
});
const formRef = ref(null);
const btns = ref([
{
text: "提交",
type: "primary",
round: true,
block: true,
onClick: async (m) => {
console.log("v", value.value);
formRef.value
.validate()
.then((req) => {
console.log("req", req);
})
.catch((e) => {
console.log("e", e);
});
},
},
{
text: "清空",
round: true,
block: true,
onClick: (m) => {
console.log("m", m);
formRef.value.clearValidate();
},
},
]);
const onClickButton = (e) => {
let num = 10;
const timer = setInterval(() => {
num -= 1;
if (num) {
form.value[2][0].button.name = `${num}s后重新获取`;
form.value[2][0].button.disabled = true;
} else {
form.value[2][0].button.name = `重新获取`;
form.value[2][0].button.disabled = false;
clearInterval(timer);
}
}, 1000);
console.log("e", e);
};
const onChange = (data) => {
const { value, item } = data;
if (item.showSearch) {
if (item.field == "detailAddress" && value) {
form.value[1][1].cell = {
list: [
{
title: "成都动物园",
label: "四川省成都市成华区昭觉寺南路234号",
icon: "location-o",
iconPrefix: "van-icon",
},
{
title: "成都IFS国际金融中心",
label: "四川省成都市锦江区红星路三段1号",
icon: "location-o",
iconPrefix: "van-icon",
},
{
title: "成都大熊猫繁育基地",
label: "四川省成都市成华区熊猫大道1375号",
icon: "location-o",
iconPrefix: "van-icon",
},
],
};
} else {
form.value[1][1].cell = {
list: [],
};
}
}
};
</script>
<style></style>
API
Props
| 名称 |
说明 |
类型 |
默认值 |
可选值 |
| form |
表单显示对象(一维数组显示一个卡片,二位数组显示多个卡片) |
Array |
[] |
|
| rules |
表单校验对象 |
Object |
{} |
|
| value |
表单的数据 |
Object |
{} |
|
| gap |
当 form 属性为二维数组时,卡片 |
String |
24rpx |
|
| btns |
底部按钮数组 |
Array |
[] |
|
| themeName |
主题样式 |
String |
default |
|
Props.form
[!CAUTION]
form 对象的数据结构,一维数组时为[{}],二位数组时为[[{}],[{}]],下表为对象具体的属性
| 名称 |
说明 |
| field |
在表单右侧显示的数据的存放字段 |
| label |
表单标题 |
| placeholder |
输入框占位提示文字 |
| type |
类型(支持 日历-calendar 选择器-picker 时间选择器-datePicker 评分-rate 多选-checkbox 单选-radio 开关-switch 自定义插槽-slot)【默认不传为输入框】 |
| config |
输入框的配置字段->包含 r-field组件的配置字段(maxlength,type,isLink,readonly,clearable,leftIcon,rigthIcon) |
| config.onClickRightIcon |
点击右侧图标时候的回调函数,通常为点击清除按钮时候触发 |
| button |
右侧按钮的配置字段-> 包含r-button组件的配置字段(size,disabled,type) |
| button.name |
右侧按钮的名称【有这个字段右侧会显示这个按钮】 |
| showSearch |
是否支持搜索功能 |
| cell.list |
展示搜索结果的数组 |
| picker |
选择器的配置字段->包含r-picker组件的配置字段(title columns loading columnsFieldNames) |
| datePicker |
时间选择器的配置字段->包含r-date-picker组件的配置字段(title loading formatter columnsType filter hideFields) |
| rate |
评分器的配置字段->包含r-rate的全部配置 props 属性 |
| checkbox |
多选框的配置字段->包含r-checkbox组件的 CheckboxGroup 全部-props 属性 |
| checkbox.list |
多选框的列表 以 label、value 俩个字段存放 |
| radio |
单选框的配置字段->包含r-radio组件的 RadioGroup 全部-props 属性 |
| radio.list |
单选框的列表 以 label、value 俩个字段存放 |
| switch |
开关的配置字段->包含r-switch的全部 props 属性 |
Events
| 名称 |
说明 |
参数 |
| clickButton |
点击右侧按钮的事件(当上表 button.name 不为空时) |
item 这一行的相关数据信息 |
| change |
输入框数据改变的事件 |
{value,item} //value 为改变值,item 为这一行的数据信息 |
| update:value |
表单数据改变时触发 |
value |
| focus |
聚焦事件 |
item //这一行的相关数据信息 |
| blur |
失焦事件 |
item //这一行的相关数据信息 |
Slots
| 名称 |
说明 |
参数 |
| default |
当 type==slot 时,可以使用插槽 |
{item,value} |
Methods
| 名称 |
说明 |
| validate |
对整个表单进行校验的方法,参数为一个回调函数。该回调函数会在校验结束后被调用,并传入两个参数:是否校验成功和未通过校验的字段。若不传入回调函数,则会返回一个 promise |
| validateField |
对部分表单字段进行校验的方法 |
| clearValidate |
移除表单项的校验结果。 |
| clearValidateField |
移除指定表单项的校验结果。 |
| resetFields |
对表单特定字段进行重置,重置为初始值并移除校验结果 |
| resetForm |
对整个表单进行重置,将所有字段值重置为初始值并移除校验结果 |