Skip to content

r-form-edit

r-form-edit 配置化表单,通过配置即可自动生成表单。全部组件 完整文档请前往

示例

vue
<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 属性为二维数组时,卡片String24rpx
btns底部按钮数组Array[]
themeName主题样式Stringdefault

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 时,可以使用插槽{value,item} //value 为数据值,item 为这一行的数据配置信息

Methods

名称说明
validate对整个表单进行校验的方法,参数为一个回调函数。该回调函数会在校验结束后被调用,并传入两个参数:是否校验成功和未通过校验的字段。若不传入回调函数,则会返回一个 promise
validateField对部分表单字段进行校验的方法
clearValidate移除表单项的校验结果。
clearValidateField移除指定表单项的校验结果。
resetFields对表单特定字段进行重置,重置为初始值并移除校验结果
resetForm对整个表单进行重置,将所有字段值重置为初始值并移除校验结果