kos-form 快速上手

依赖安装

npm install kos-core --save;

npm install kos-form --save;

kos-from依赖kos,所以需要实现安装kos-core

代码示例

kos-form-antd.js

import * as KosForm from 'kos-form';
import { Form as AntDForm } from 'antd';


const formItemLayout = {
  labelCol: {
    xs: { span: 24 },
    sm: { span: 8 },
  },
  wrapperCol: {
    xs: { span: 24 },
    sm: { span: 16 },
  },
};

const tailFormItemLayout = {
  wrapperCol: {
    xs: {
      span: 24,
      offset: 0,
    },
    sm: {
      span: 16,
      offset: 8,
    },
  },
};

export const Field = KosForm.FieldHOC({
  FieldWrapper: AntDForm.Item,
  FieldProps: formItemLayout
});

export const ToolbarField = KosForm.FieldHOC({
  FieldWrapper: AntDForm.Item,
  FieldProps: tailFormItemLayout
});

export const Form = KosForm.Form;

form.js

import React from 'react';
import KOS from 'kos-core';
import model from './model'

import { Input, Tooltip, Icon, Cascader, Select, Row, Col, Radio, Button, AutoComplete } from 'antd';
import { Form, Field, ToolbarField } from './kos-form-antd';


const RadioButton = Radio.Button;
const RadioGroup = Radio.Group;


@KOS.Wrapper({ model })
class PageForm extends React.PureComponent {
  /**
   * 用于直接的事件绑定提交逻辑
   *
   * */
  handleSubmit() {
    const { dispatch } = this.props;
    const { getNamespace } = this.props;


    const result = Form.validate(getNamespace(), 'addForm', (result) => {
      result && dispatch({
        type: 'save'
      });
    });
  }
  submitForm(formData) {
    const { dispatch } = this.props;
    dispatch({
      type: 'save'
    });
  }
  render() {
    const { title, dispatch } = this.props;

    return <Form name="addForm" onSubmit={() => this.submitForm()}>
      <Field label="页面名称:" field="page_name">
        <Input onChange={() => { console.log('onChange') }} />
      </Field>
      <Field label="页面类型:" field="page_type">
        <RadioGroup>
          <RadioButton value="pc">PC</RadioButton>
          <RadioButton value="h5">H5</RadioButton>
        </RadioGroup>
      </Field>
      <Field label="说明:" field="page_desc">
        <Input.TextArea rows={4} />
      </Field>
      <ToolbarField>
        <Button type="primary" htmlType="submit">新增</Button>
      </ToolbarField>
    </Form>
  }
}

export default PageForm

model.js

import fetch from 'lib/fetch';
import { notification } from 'antd';


const model = {
  namespace: 'page-form-1',
  initial: {
    addForm: {
      page_name: '1234'
    }
  },
  asyncs: {
    async save(dispatch, getState, { payload }) {
      const state = getState();
      const { addForm } = state;
      const { param } = state;

      const data = await fetch({
        url: '/page/add',
        data: {
          ...addForm,
          page_init_data: '',
          app_id: param.appId
        }
      });

      if (data.ok) {
        notification.success({
          message: '恭喜您!',
          description: '添加成功!'
        });
        history.push(`/page/list/${param.appId}`);
      }
    }
  },
  validators: [{
    formName: 'addForm',
    validators: [{
      field: 'page_name',
      rules: 'required'
    }, {
      field: 'page_desc',
      rules: ['required', (getState, { field, value }, data) => {
        return value && value.length <= 3;
      }],
      help: '请正确填写'
    }, {
      field: 'page_name',
      rules: ['required@好好填', {
        name: 'maxLength',
        data: 4,
        help: 'maxLength:{0}'
      }]
    }, {
      field: 'page_name',
      help: '异步校验失败',
      rules: {
        data: { a: 1 },
        fn: async (getState, { field, value }, data) => {
          const xdata = await fetch({
            url: '/app/list',
            data: {
            }
          });

          return true
        }
      }
    }]
  }],
  formFieldDisplay: {
    'addForm': {
      'page_type': (getState, { field, value }) => {
        console.log(value);

        return {
          'page_desc': value === 'pc'
        }
      }
    }
  }
}

export default model;

results matching ""

    No results matching ""