1.0.24 • Published 12 months ago

@slacking/form v1.0.24

Weekly downloads
-
License
MIT
Repository
github
Last release
12 months ago

@slacking/form

配置式表单,支持自定义注册表单组件,单个组件支持自定义 disabled, readonly,和正常状态下的展示组件,目前支持 vue2
支持 typescript,暂时只做代码提示用,具体参数含义可进类型定义文件看
注意:设置 inline 等造成的样式问题,需要自己覆盖样式;首次渲染就触发了表单验证,请查看表单默认值类型是否准确,如 element-ui, select 组件在多选的时候如过没有传入数组,会导致一次值更新而触发表单验证

使用方式

一、安装

npm i @slacking/form
yarn add @slacking/form

二、注册组件

一般在入口文件中做全局注册,注册时必须提供 Form、FormItem、Row、Col 为了兼容不同的组件库
默认配置的属性都会被传入表单项中, 自定义的表单项需要抛出 input 事件以更新表单 model 值

import {
  Input,
  InputNumber,
  Radio,
  Form,
  FormItem,
  Row,
  Col,
  Table,
  TableColumn,
} from "element-ui";
import ReadonlySelect from "@/components/ReadonlySelect.vue";
import DisabledSelect from "@/components/DisabledSelect.vue";
import { useFormRegister } from "@slacking/form";
const { registerComponents } = useFormRegister();

registerComponents([
  { name: "Input", component: Input },
  { name: "InputNumber", component: InputNumber },
  { name: "Radio", component: Radio },
  {
    name: "Select",
    component: Select,
    disabledComponent: DisabledSelect,
    readonlyComponent: ReadonlySelect,
  },
  // 以下name不可以修改, 且必须提供
  { name: "Form", component: Form },
  { name: "FormItem", component: FormItem },
  { name: "Row", component: Row },
  { name: "Col", component: Col },
]);

三、使用 Form 组件

import { defineComponent, reactive, ref, watch } from "vue";
import { Button } from "element-ui";
import { defineFormSchema, useForm } from "@slacking/form";
const schema = reactive(
  defineFormSchema({
    name: "表单名称",
    readonly: false,
    disabled: false,
    coreVersion: "1.0",
    labelPosition: "top",
    labelWidth: "120px",
    autoOptionProps: true,
    size: "small", //medium / small / mini
    inline: false,
    gutter: 16,
    symbol: ":",
    list: [
      {
        type: "Input",
        prop: "name",
        label: "姓名",
        minLen: 3,
        maxLen: 3,
        defaultValue: "xxx",
        // regexp: /[\s\S]*/,
        required: true,
        // trigger: ["change", "blur"],
        message: "请输入姓名",
        // validator(rule, value, callback, item, model) {
        //   callback(new Error("请输入姓名"));
        // },
      },
      { type: "Input", prop: "sex", label: "性别" },
      {
        type: "Select",
        prop: "lover",
        label: "爱好",
        dependOn: {
          name: {
            handler(val, model, item, oldVal) {
              item.options = [
                { value: "1", label: val },
                { value: "2", label: "喝" },
                { value: "3", label: "玩" },
                { value: "4", label: "乐" },
              ];
              model.value.lover = "1";
            },
            immediate: false,
          },
        },
      },
      {
        type: "InputNumber",
        prop: "age",
        label: "年龄",
        dependOn: {
          age(val, model, item, oldVal) {},
          name: {
            handler(val, model, item, oldVal) {
              const random = Math.random();
              model.value.sex = val;
              item.label = random.toString();
              item.type = random > 0.5 ? "InputNumber" : "Input";
            },
            immediate: false,
          },
        },
      },
      {
        type: "Input",
        prop: "remark",
        label: "备注",
        dependOn: {
          name: {
            handler(val, model, item, oldVal) {
              console.log(val, model, item, oldVal);
              model.value.sex = val;
              item.show = Math.random() > 0.5;
            },
            immediate: false,
          },
        },
      },
      {
        type: "Mix",
        gutter: 16,
        justify: "start",
        label: "别名",
        required: true,
        prop: "otherName",
        list: [
          {
            type: "Select",
            prop: "name1",
            span: 3,
            defaultValue: [],
            filterable: true,
            clearable: false,
            multiple: true,
            async asyncOptions() {
              return [
                { value: "1", label: "吃" },
                { value: "2", label: "喝" },
                { value: "3", label: "玩" },
                { value: "4", label: "乐" },
              ];
            },
          },
          {
            type: "AnyInput",
            prop: "sex1",
            required: false,
          },
        ],
      },
      {
        type: "Mix",
        align: "bottom",
        gutter: 30,
        justify: "end",
        list: [
          {
            type: "AnyInput",
            prop: "column1",
            label: "同一行-1",
            required: true,
          },
          {
            type: "AnyInput",
            prop: "column2",
            label: "同一行-2",
            required: true,
          },
        ],
      },
    ],
  })
);

export default defineComponent({
  setup() {
    // formData为表单值,在开启independent模式下不会修改model和schema,提交请使用formData和schema
    const [EffectForm, formData, formRef, schema] = useForm();
    const model = ref({
      age: 0,
    });
    const modSchema = () => {
      schema.list[0].label = "111111";
    };
    const validate = () => {
      formRef.value.validate();
    };
    return () => (
      <div>
        <Button onClick={modSchema}>修改schema</Button>
        <Button onClick={validate}>表单验证</Button>
        <EffectForm props={{ schema, model }}></EffectForm>
      </div>
    );
  },
});

兼容性

支持到 es6(es2015),需要支持更旧的浏览器,请 include 到项目环境中编译
如 vue-cli

{
  transpileDependencies: ["@slacking/form"];
}

快速使用内置的 element-ui 注册组件

import { elementUiRegister } from "@slacking/adapter";
elementUiRegister();

// 相当于注册了以下类型组件
registerComponents([
  { name: "Input", component: Input },
  { name: "InputNumber", component: InputNumber },
  { name: "Radio", component: Radio },
  { name: "Select", component: Select },
  { name: "Cascader", component: Cascader },
  { name: "SelectTree", component: SelectTree },
  { name: "TimeSelect", component: TimeSelect },
  { name: "DatePicker", component: DatePicker },
  { name: "Switch", component: Switch },
  { name: "Slider", component: Slider },
  { name: "Rate", component: Rate },
  { name: "ColorPicker", component: ColorPicker },
  { name: "Form", component: Form },
  { name: "FormItem", component: FormItem },
  { name: "Row", component: Row },
  { name: "Col", component: Col },
]);
1.0.19

12 months ago

1.0.18

12 months ago

1.0.17

12 months ago

1.0.16

12 months ago

1.0.9

1 year ago

1.0.8

1 year ago

1.0.7

1 year ago

1.0.22

12 months ago

1.0.21

12 months ago

1.0.20

12 months ago

1.0.24

12 months ago

1.0.23

12 months ago

1.0.11

12 months ago

1.0.10

12 months ago

1.0.15

12 months ago

1.0.14

12 months ago

1.0.13

12 months ago

1.0.12

12 months ago

1.0.6

1 year ago

1.0.5

1 year ago

1.0.4

1 year ago

1.0.3

1 year ago

1.0.2

1 year ago

1.0.1

1 year ago

1.0.0

1 year ago

0.0.11

1 year ago

0.0.10

1 year ago

0.0.9

1 year ago

0.0.8

1 year ago

0.0.7

1 year ago

0.0.6

1 year ago

0.0.5

1 year ago

0.0.4

1 year ago

0.0.3

1 year ago

0.0.2

1 year ago

0.0.1

1 year ago