1. 程式人生 > >React共享單車後臺管理系統開發(記錄筆記5)——5.1 From元件登入頁面

React共享單車後臺管理系統開發(記錄筆記5)——5.1 From元件登入頁面

5.1 From元件登入頁面

具有資料收集、校驗和提交功能的表單,包含複選框、單選框、輸入框、下拉選擇框等元素。

文章目錄

import { Form, Icon, Input, Button } from 'antd';

const FormItem = Form.Item;

function hasErrors(fieldsError) {
  return Object.keys(fieldsError).some(field => fieldsError[field]);
}

class HorizontalLoginForm extends React.Component {
  componentDidMount() {
    // To disabled submit button at the beginning.
this.props.form.validateFields(); } handleSubmit = (e) => { e.preventDefault(); this.props.form.validateFields((err, values) => { if (!err) { console.log('Received values of form: ', values); } }); } render() { const { getFieldDecorator, getFieldsError,
getFieldError, isFieldTouched } = this.props.form; // Only show error after a field is touched. const userNameError = isFieldTouched('userName') && getFieldError('userName'); const passwordError = isFieldTouched('password') && getFieldError('password'); return ( <Form layout="inline" onSubmit={this.handleSubmit}> <FormItem validateStatus={userNameError ? 'error' : ''} help={userNameError || ''} > {getFieldDecorator('userName', { rules: [{ required: true, message: 'Please input your username!' }], })( <Input prefix={<Icon type="user" style={{ color: 'rgba(0,0,0,.25)' }} />} placeholder="Username" /> )} </FormItem> <FormItem validateStatus={passwordError ? 'error' : ''} help={passwordError || ''} > {getFieldDecorator('password', { rules: [{ required: true, message: 'Please input your Password!' }], })( <Input prefix={<Icon type="lock" style={{ color: 'rgba(0,0,0,.25)' }} />} type="password" placeholder="Password" /> )} </FormItem> <FormItem> <Button type="primary" htmlType="submit" disabled={hasErrors(getFieldsError())} > Log in </Button> </FormItem> </Form> ); } } const WrappedHorizontalLoginForm = Form.create()(HorizontalLoginForm); ReactDOM.render(<WrappedHorizontalLoginForm />, mountNode);

一.內聯表單(基礎表單)

1.Form元件

  • 引入Form:import {Form} from “antd”;

  • <Form layout="inline"/>行內方式
//src/pages/form/login.js
import React from "react";

import {Button, Card, Form, Input} from "antd";

const FormItem = Form.Item;
export default class FormLogin extends React.Component {
  render() {
    return (
      <div>
        <Card title="登入行內表單">
          <Form layout="inline">
            <FormItem>
              <Input placeholder="請輸入使用者名稱"/>
            </FormItem>
            <FormItem>
              <Input placeholder="請輸入密碼"/>
            </FormItem>
            <FormItem>
              <Button type="primary">登入</Button>
            </FormItem>
          </Form>
        </Card>
      </div>
    )
  }
}

二.水平表單

如何獲取值?

通過antD輔助獲取一些值 , 而不使用e.target.value 的方式,進行設定.

  • <div><img src="/carousel-img/carousel-1.jpg" alt=""/></div>
  • `<Form layout="horizontal"/>`水平方式
    
  • <Form layout="horizontal" style={{width:300}}/> :

    • style={{width:300}}指定表單的寬度

    • getFieldDecorator:幫助進行初始化值,獲取資料

    • getFieldDecorator(‘表單裡的一些物件’,定義的規則和值)(元件)

    {
        getFieldDecorator('userName',{
        initialValue:'Jack',
        rules:[]
        })(
        <Input placeholder="請輸入使用者名稱"/>
        )
    }
    

    在最下方新增

    export default Form.create()(FormLogin);
    

//src/pages/form/login.js
import React from "react";

import {Button, Card, Form, Input} from "antd";

const FormItem = Form.Item;

class FormLogin extends React.Component {
  render() {
    const {getFieldDecorator} = this.props.form;
    return (
      <div>
        <Card title="登入行內表單">
          <Form layout="inline">
            <FormItem>
              <Input placeholder="請輸入使用者名稱"/>
            </FormItem>
            <FormItem>
              <Input placeholder="請輸入密碼"/>
            </FormItem>
            <FormItem>
              <Button type="primary">登入</Button>
            </FormItem>
          </Form>
        </Card>
        <Card title="登入水平表單" style={{marginTop: 10}}>
          <Form layout="horizontal" style={{width: 300}}>
            <FormItem>
              {
                getFieldDecorator('userName', {
                  initialValue: 'Jack',
                  rules: []
                })(
                  <Input placeholder="請輸入使用者名稱"/>
                )
              }

            </FormItem>
            <FormItem>
              {
                getFieldDecorator('userPwd', {
                  initialValue: '123456',
                  rules: []
                })(
                  <Input placeholder="請輸入密碼"/>
                )
              }
            </FormItem>
            <FormItem>
              <Button type="primary">登入</Button>
            </FormItem>
          </Form>
        </Card>
      </div>
    )
  }
}

export default Form.create()(FormLogin);
  • rules:規則設定

options.rules校驗規則,參考下方文件 object[]

指定規則 rulue ,required(請求):true message:‘使用者名稱不能為空’

校驗規則

引數 說明 型別
options.rules 校驗規則,參考下方文件(支援正則表示式) object[] 陣列(可以制定很多規則)
required 是否必選 boolean
max 最大長度 number
min 最小長度 number
pattern 正則表示式校驗 RegExp
{
    getFieldDecorator('userName', {
        initialValue: 'Jack',
        rules: [{
            required:true,
            message:'使用者名稱不能為空'
        }]
    })(
        <Input placeholder="請輸入使用者名稱"/>
    )
}
  • 加入小圖示:
    • prefix:加字首 ,裡面放上圖示
    • <Input prefix={<Icon type="user"/>} placeholder="請輸入使用者名稱"/>
    • 設定記住密碼框預設選中
    • valuePropName:‘checked’,
    • initialValue: true,
    • 通過浮動來控制,a連結向右
    • <a href="#" style={{float:‘right’}}>忘記密碼
<FormItem>
        {
        getFieldDecorator('remember', {
                           valuePropName:'checked',
                           initialValue: true,
                           rules: [{
                           required: true,
                           message: '密碼不能為空'
                           }]
        })(
            <Checkbox>記住密碼</Checkbox>
        )
    }
    <a href="#" style={{float:'right'}}>忘記密碼</a>
</FormItem>
  • //src/pages/form/login.js
    import React from "react";
    
    import {Button, Card, Checkbox, Form, Icon, Input, message} from "antd";
    
    const FormItem = Form.Item;
    
    class FormLogin extends React.Component {
      handleSubmit = () => {//繫結提交事件進行校驗
        let userInfo = this.props.form.getFieldsValue();//object物件
        this.props.form.validateFields((err, values) => {
          if (!err) {//全部通過 ${}  是變數
            message.success(`${userInfo.userName} 恭喜你,您通過本次表單元件學習,當前密碼為:${userInfo.userPwd}`)
          }
        });
      }
    
      render() {
        const {getFieldDecorator} = this.props.form;
        return (
          <div>
            <Card title="登入行內表單">
              <Form layout="inline">
                <FormItem>
                  <Input placeholder="請輸入使用者名稱"/>
                </FormItem>
                <FormItem>
                  <Input placeholder="請輸入密碼"/>
                </FormItem>
                <FormItem>
                  <Button type="primary">登入</Button>
                </FormItem>
              </Form>
            </Card>
            <Card title="登入水平表單" style={{marginTop: 10}}>
              <Form layout="horizontal" style={{width: 300}}>
                <FormItem>
                  {
                    getFieldDecorator('userName', {
                      initialValue: '',
                      rules: [
                        {
                          required: true,
                          message: '使用者名稱不能為空'
                        },
                        {
                          min: 5, max: 10,
                          message: '長度不在範圍內'
                        },
                        {
                          // pattern: /^\w+$/g,
                          pattern: new RegExp('^\\w+$', 'g'),
                          message: '使用者名稱必須為字母或數字'
                        }
                      ]
                    })(
                      <Input prefix={<Icon type="user"/>} placeholder="請輸入使用者名稱"/>
                    )
                  }
    
                </FormItem>
                <FormItem>
                  {
                    getFieldDecorator('userPwd', {
                      initialValue: '',
                      rules: [{
                        required: true,
                        message: '密碼不能為空'
                      }]
                    })(
                      <Input prefix={<Icon type="lock"/>} type="password" placeholder="請輸入密碼"/>
                    )
                  }
    
                </FormItem>
                <FormItem>
                  {
                    getFieldDecorator('remember', {
                      valuePropName:'checked',
                      initialValue: true,
                      rules: [{
                        required: true,
                        message: '密碼不能為空'
                      }]
                    })(
                      <Checkbox>記住密碼</Checkbox>
                    )
                  }
                  <a href="#" style={{float:'right'}}>忘記密碼</a>
                </FormItem>
                <FormItem>
                  <Button type="primary" onClick={this.handleSubmit}>登入</Button>
                </FormItem>
              </Form>
            </Card>
          </div>
        )
      }
    }
    
    export default Form.create()(FormLogin);
    

API

Form#

引數 說明 型別 預設值
layout 表單佈局 ‘horizontal’|‘vertical’|‘inline’ ‘horizontal’

經過 Form.create 包裝的元件將會自帶 this.props.form 屬性,this.props.form 提供的 API 如下:

注意:使用 getFieldsValue getFieldValue setFieldsValue 等時,應確保對應的 field 已經用 getFieldDecorator 註冊過了。

方法 說明 型別
getFieldDecorator 用於和表單進行雙向繫結,詳見下方描述
getFieldError 獲取某個輸入控制元件的 Error Function(name)
getFieldsError 獲取一組輸入控制元件的 Error ,如不傳入引數,則獲取全部元件的 Error Function([names: string[]])
getFieldsValue 獲取一組輸入控制元件的值,如不傳入引數,則獲取全部元件的值 Function([fieldNames: string[]])
getFieldValue 獲取一個輸入控制元件的值 Function(fieldName: string)

校驗規則#

引數 說明 型別
options.rules 校驗規則,參考下方文件(支援正則表示式) object[] 陣列(可以制定很多規則)
max 最大長度 number
min 最小長度 number
pattern 正則表示式校驗 RegExp
len 欄位長度 number
required 是否必選 boolean
type 內建校驗型別,可選項 string