1. 程式人生 > >[原創]react-vio-form 快速構建React表單應用

[原創]react-vio-form 快速構建React表單應用

react-vio-form 是一個react的快速輕量表單庫,能快速實現表單構建。提供自定義表單格式、表單校驗、表單資訊反饋、表單資訊隔離等功能。可採用元件宣告或者API的形式來實現表單的功能

NPM

demo

react-vio-form 基於React.createContext實現,要求開發者使用React16+的版本

github:地址

安裝

npm install --save react-vio-form

快速教程

首先我們先自定義自己的輸入框元件

InputGroup.js

import React, { Component } from 'react';
class InputGroup extends Component {
  render() {
      let {
        onChange,//必須使用的屬性,表單欄位的值改變方法
        value,//必須使用的屬性,表單欄位的值
        message,//必須使用的屬性,表單欄位的報錯資訊
        title,//自定義屬性
        type="text"//自定義屬性
      }=this.props;
      return (
          <div>
              <label>{title}:</label>
              <input type={type} onChange={e=>onChange(e.target.value)}/>
              {message&&<span>{message}</span>}
          </div>
      );
  }
}
export default InputGroup;

接著我們配置我們的表格

  • 最外層是Form元件,向它傳遞一個onSubmit的回撥方法,在回撥方法內我們輸出表單的值。
  • 裡面是Field元件,它接收我們剛才寫的InputGroup為component屬性、fieldName為該欄位的名稱、regexp為該欄位的校驗正則表示式、message為當表單校驗不通過的時候顯示的報錯資訊,該資訊通過props傳遞給InputGroup
  • 一個簡單列表demo就完成了,當在username或者password輸入值或者點選Submit按鈕就會觸發表單的校驗邏輯
    App.js
import React, { Component } from 'react';
import InputGroup from './InputGroup';
let requiredExp=/\w{1,}/;
class App extends Component {
    handleSubmit=({model})=>{
        console.log('form data is :'+JSON.stringify(model));
    }
    render() {
        return (
            <Form onSubmit={this.handleSubmit}>
                <Field component={InputGroup} fieldName="username" title="Username" 
                regexp={requiredExp} message="Not be empty"></Field>
                <Field component={InputGroup} fieldName="address" title="Address"></Field>
                <Field component={InputGroup} fieldName="password" title="Password" 
                type="password" regexp={requiredExp} message="Not be empty"></Field>
                <button type="submit">Submit</button>
            </Form>
        );
    }
}
export default App;

回撥函式

  • <Form onSubmit={//}>
    只有表單驗證通過了才會觸發
  • <Field onChange={//}>
    欄位每次修改都會觸發
class App extends Component {
    handleSubmit=({model})=>{
        //form submit callback
        console.log('form data is :'+JSON.stringify(model));
    }
    passwordChange=(value,{model,form})=>{
        //change callback
        //value:該欄位的值
        //model:為整個表單的資料模型
        //form:表單的api中心
        console.log(`password:${value}`);
    }
    render() {
        return (
            <div>
                <Form onSubmit={this.handleSubmit} id="form">
                    <Field component={InputGroup} fieldName="username" title="Username"></Field>
                    <Field component={InputGroup} fieldName="password" title="Password" 
                    type="password" onChange={this.passwordChange}></Field>
                    <button type="submit">Submit</button>
                </Form>
            </div>
        );
    }
}

API

表單例項form可以獲取設定表單的資訊,獲取表單例項的方法有兩種:

  • formManager.get(id)
  • 回撥函式的引數

表單例項方法:

  • setError(fieldName,message)
  • clearError(fieldName)
  • getModel()
  • submit()
import React, { Component } from 'react'
import {Form,Field,formManager} from 'react-vio-form'
let requiredExp=/\w{1,}/;
class App extends Component {
    handleSubmit=({model})=>{
        //form submit callback
        console.log('form data is :'+JSON.stringify(model));
    }
    handleOutsideSubmit=()=>{
        // submit outside Form Component
        // param is Form id
        formManager.get('form').submit();
    }
    passwordChange=(value,{model,form})=>{
        if(model.password!==model.password2){
            //set Error Message
            form.setError('password2','password2 must be equaled to password');
        }else{
            //clear Error Message
            form.clearError('password2');
        }
    }
    render() {
        return (
            <div>
                <Form onSubmit={this.handleSubmit} id="form">
                    <Field component={InputGroup} fieldName="username" title="Username"></Field>
                    <Field component={InputGroup} fieldName="password" title="Password" 
                    type="password" regexp={requiredExp} 
                    message="Not be empty" onChange={this.passwordChange}></Field>
                    <Field component={InputGroup} fieldName="password2" title="Password2" 
                    type="password" onChange={this.passwordChange}></Field>
                </Form>
                <button onClick={this.handleOutsideSubmit}>outside submit</button>
            </div>
        );
    }
}

持續更新中...

反饋與建議

  • 直接在github上提issue

Thanks

License

MIT © violinux666