使用React和HTML5表單驗證API處理表單

2020-12-20 智能甄選

在本教程中,我們將看看如何使用React和HTML5的現代組合來處理表單提交和驗證。

當我們在Web應用程式中討論用戶輸入時,我們經常首先想到HTML表單。Web表單從HTML的第一個版本開始就已經可用。顯然,該功能已於1991年推出,並在1995年以RFC 1866標準進行了標準化。我們在任何地方都使用它們,幾乎每個庫和框架。但是React呢?Facebook就如何處理表單提供了有限的意見。主要是為交互事件訂閱表單和控制項,並通過「value」屬性傳遞狀態。因此表單驗證和提交邏輯取決於您。體面的用戶界面意味著你可以覆蓋「on submit」/「on input」欄位驗證,內聯錯誤消息,根據有效性切換元素,「原始」,「提交」狀態等邏輯。我們能不能抽象出這種邏輯並簡單地將它插入我們的表格中?我們當然可以。唯一的問題是採取什麼方法和解決方案。

DevKit中的表單

如果你喜歡去的devkit ReactBootstrap或AntDesign你很可能已經高興的形式。兩者都提供組件來構建滿足不同要求的表單。例如,在AntDesign中,我們使用元素和帶有的表單欄位來定義表單,該 是集合中任何輸入控制項的封裝。您可以在上設置驗證規則,如:

<FormItem>{getFieldDecorator('select', {rules: [{ required: true, message: 'Please select your country!' },],})(<Select placeholder="Please select a country"><Option value="china">China</Option><Option value="use">U.S.A</Option></Select>)}</FormItem>

然後,例如,在表單提交處理程序中,您可以運行this.props.form.validateFields()以應用驗證。它看起來像一切照顧。然而,解決方案是特定於框架的。如果您不使用DevKit,則無法從其功能中受益。

基於模式的建築形式

或者,我們可以使用獨立的組件,根據提供的JSON規範為我們構建表單。例如,我們可以導入 Winterfell組件並構建一個如此簡單的表單:

<Winterfellschema={loginSchema}></Winterfell>

但是,模式可能相當複雜。此外,我們將自己綁定到自定義語法。另一個解決方案 react-jsonschema-form看起來很相似,但依賴於 JSON模式。JSON模式是一個專門用於注釋和驗證JSON文檔的項目無關詞彙表。然而,它將我們與構建器中實現並在架構中定義的唯一功能綁定在一起。

Formsy

我寧願使用我的任意HTML表單的包裝來處理驗證邏輯。在這裡,最受歡迎的解決方案之一是 Formsy。它是什麼樣子的?我們為表單域創建自己的組件,並用HOC包裝它 withFormsy:

import { withFormsy } from "formsy-react";import React from "react";class MyInput extends React.Component {changeValue = ( event ) => {this.props.setValue( event.currentTarget.value );}render() {return (<div><inputonChange={ this.changeValue }type="text"value={ this.props.getValue() || "" }/><span>{ this.props.getErrorMessage() }</span></div>);}}export default withFormsy( MyInput );

正如你所看到的,組件接收getErrorMessage() 道具中的 函數,我們可以使用它來進行內聯錯誤消息。

所以我們做了一個場域組件。讓我們把它放在一個表單中:

import Formsy from "formsy-react";import React from "react";import MyInput from "./MyInput";export default class App extends React.Component {onValid = () => {this.setState({ valid: true });}onInvalid = () => {this.setState({ valid: false });}submit( model ) {//...}render() {return (<Formsy onValidSubmit={this.submit} onValid={this.onValid} onInvalid={this.onInvalid}><MyInputname="email"validations="isEmail"validationError="This is not a valid email"required></MyInput><button type="submit" disabled={ !this.state.valid }>Submit</button></Formsy>);}}

我們用validations 屬性指定所有必需的欄位驗證器 (請參閱 可用驗證器列表)。用 validationError, 我們設置所需的驗證消息,並從形式有效性狀態中接收 onValid 和 onInvalid處理程序。

這看起來簡單,乾淨,靈活。但我想知道為什麼我們不依賴HTML5內置表單驗證,而不是使用無數的自定義實現。

HTML5表單驗證

該技術出現在不久前。第一個實現在2008年與Opera 9.5一起實現。如今,它在所有現代瀏覽器中都可用。表單(數據)驗證引入了額外的HTML屬性和輸入類型,可用於設置表單驗證規則。驗證也可以通過使用專用API從JavaScript進行控制和定製 。

我們來看下面的代碼:

<form><label for="answer">What do you know, Jon Snow?</label><input id="answer" name="answer" required><button>Ask</button></form>

這是一個簡單的形式,除了一件事 - 輸入元素有一個 required 屬性。所以如果我們立即按下提交按鈕,表單將不會被發送到伺服器。相反,我們會在輸入旁邊看到一個工具提示,說明該值不符合給定的約束(即該欄位不應為空)。

現在我們將輸入設置為一個附加約束:

<form><label for="answer">What do you know, Jon Snow?</label><input id="answer" name="answer" required pattern="nothing|nix"><button>Ask</button></form>

所以這個值不僅僅是必需的,而且必須遵從給定的正則表達式pattern。

錯誤信息雖然不是那種信息,是嗎?我們可以對其進行定製(例如,解釋我們對用戶的期望)或者只是翻譯:

<form><label for="answer">What do you know, Jon Snow?</label><input id="answer" name="answer" required pattern="nothing|nix"><button>Ask</button></form>const answer = document.querySelector( "[name=answer]" );answer.addEventListener( "input", ( event ) => {if ( answer.validity.patternMismatch ) {answer.setCustomValidity("Oh, it's not a right answer!");} else {answer.setCustomValidity( "" );}});

所以基本上,在輸入事件中,它檢查patternMismatch 輸入有效性狀態的 屬性狀態。任何時候實際值與模式不匹配,我們定義錯誤消息。如果我們 對控制項有任何其他限制,我們也可以在事件處理程序中覆蓋它們。

對工具提示不滿意?是的,他們在不同的瀏覽器中看起來不一樣。我們添加下面的代碼:

<form novalidate><label for="answer">What do you know, Jon Snow?</label><input id="answer" name="answer" required pattern="nothing|nix"><div data-bind="message"></div><button>Ask</button></form>const answer = document.querySelector( "[name=answer]" ),answerError = document.querySelector( "[name=answer] + [data-bind=message]" );answer.addEventListener( "input", ( event ) => {answerError.innerHTML = answer.validationMessage;});

即使只是這個超級簡短的介紹,你可以看到技術的力量和靈活性。本機表單驗證非常好。那麼,為什麼我們要依靠無數的定製庫?為什麼不使用內置驗證?

React符合表單驗證API

react-html5-form將React(以及可選的Redux)連接到HTML5 Form Validation API。它公開組件Form 和 InputGroup (類似於Formsy的自定義輸入或 FormItem 在AntDesign中)。因此, Form 定義了表單及其範圍,並 定義了可以包含一個或多個輸入的欄位的範圍。我們只是用這些組件包裝任意形式的內容(只是簡單的HTML或React組件)。在用戶事件中,我們可以請求表單驗證,並獲得更新後的狀態 和組件,因此,對底層輸入有效性。 InputGroupFormInputGroup

那麼,讓我們在實踐中看到它。首先,我們定義表單範圍:

import React from "react";import { render } from "react-dom";import { Form, InputGroup } from "Form";const MyForm = props => (<Form>{({ error, valid, pristine, submitting, form }) => (<>Form content<button disabled={ ( pristine || submitting ) } type="submit">Submit</button></>)}</Form>);render( <MyForm ></MyForm>, document.getElementById( "app" ) );

該作用域接收具有屬性的狀態對象:

錯誤 - 表單錯誤消息(通常是伺服器驗證消息)。我們可以設置它 form.setError()。valid - 布爾值,指示所有基礎輸入是否符合指定約束。pristine - 布爾值,指示用戶是否尚未與表單交互。submitting - 表示正在處理表單的布爾值(按下提交按鈕時切換為true,並在用戶定義的異步onSubmit 處理程序解析後立即返回false )。form - 用於訪問API的Form組件的實例。

這裡我們使用just pristine 和submitting properties來將提交按鈕切換到禁用狀態。

為了在提供表單內容時註冊輸入進行驗證,我們將它們包裝在一起 InputGroup

<InputGroup validate={[ "email" ]} }}>{({ error, valid }) => (<div><label htmlFor="emailInput">Email address</label><inputtype="email"requiredname="email"id="emailInput" />{ error && (<div className="invalid-feedback">{error}</div>) }</div>)}</InputGroup>

通過validate 道具,我們指定了團隊的哪些輸入應該被註冊。[ "email" ] 意味著我們有唯一的輸入,名稱為「電子郵件」。

在範圍中,我們收到具有以下屬性的狀態對象:

錯誤 - 所有已註冊輸入的錯誤消息數組。錯誤 - 最後發出的錯誤消息。valid - 布爾值,指示所有基礎輸入是否符合指定約束。inputGroup - 訪問API的組件實例。

渲染之後,我們得到一個帶有電子郵件欄位的表單。如果該值為空或在提交時包含無效的電子郵件地址,則會在輸入旁邊顯示相應的驗證消息。

請記住,我們在使用本機Form Validation API時正在努力處理自定義錯誤消息?在以下情況下更容易 InputGroup:

<InputGroupvalidate={[ "email" ]}translate={{email: {valueMissing: "C'mon! We need some value",typeMismatch: "Hey! We expect an email address here"}}}>...

我們可以為每個輸入指定一個映射,其中鍵是有效性屬性,值是自定義消息。

那麼,消息定製很容易。自定義驗證怎麼樣?我們可以通過validate 道具做到這一點 :

<InputGroup validate={{"email": ( input ) => {if ( !EMAIL_WHITELIST.includes( input.current.value ) ) {input.setCustomValidity( "Only whitelisted email allowed" );return false;}return true;}}}>...

在這種情況下,我們提供了一個映射,而不是一組輸入名稱,其中鍵是輸入名稱,值是驗證處理程序。處理程序檢查輸入值(可以異步完成)並將有效性狀態作為布爾值返回。使用 input.setCustomValidity, 我們分配一個特定於案例的驗證消息。

提交時的驗證並不總是我們想要的。我們來實現一個「即時」驗證。首先,我們為輸入事件定義一個事件處理程序:

const onInput = ( e, inputGroup ) => {inputGroup.checkValidityAndUpdate();};

實際上,我們只是在用戶輸入輸入時重新驗證輸入組。我們認為控制如下:

<input type="email" required name="email" onInput={( e ) => onInput( e, inputGroup, form ) } id="emailInput" />

從現在開始,只要我們改變輸入值就會被驗證,如果它無效,我們會立即收到錯誤信息。

你可以從上面的例子中找到演示的原始碼。

順便說一句,你喜歡將組件派生的表單狀態樹連接到Redux存儲嗎?我們也可以做到這一點。

該軟體包公開了html5form 包含所有註冊表單的狀態樹的reducer 。我們可以像這樣將它連接到商店:

import React from "react";import { render } from "react-dom";import { createStore, combineReducers } from "redux";import { Provider } from "react-redux";import { App } from "./Containers/App.jsx";import { html5form } from "react-html5-form";const appReducer = combineReducers({html5form});// Store creationconst store = createStore( appReducer );render( <Provider store={store}><App ></App></Provider>, document.getElementById( "app" ) );

現在,當我們運行應用程式時,我們可以在商店中找到所有與表單相關的狀態。

這是一個專用演示的原始碼。

概括

React沒有內置的表單驗證邏輯。但我們可以使用第三方解決方案。所以它可以是一個DevKit,它可以是一個表單生成器,它可以是一個HOC或包裝器組件,將表單驗證邏輯混合到任意形式的內容中。我個人的方法是一個包裝組件,它依賴於HTML內置的表單驗證API並在表單和表單域的範圍內公開有效性狀態。

相關焦點

  • PHP 後端表單驗證和請求處理
    創建好前端的聯繫表單視圖後,接下來,我們來編寫提交表單後後端的 PHP 處理邏輯。控制器的 contact 方法中,編寫表單數據獲取、驗證和保存代碼:public function contact(){    if ($this->request->getMethod() == 'GET') {        // 聯繫表單頁面        ...
  • html中form表單標籤的詳細介紹
    本篇將介紹的是html中form表單標籤的用法,有興趣的朋友可以學習一下!在html中,表單是經常用到的,用來與用戶交互並提交數據。今天要介紹的就是表單標籤form標籤,接下來我們就一起來看看它的用法吧!「form」作為英文單詞有「表格」的意思,那它在html中作為標籤又充當什麼樣的角色呢!
  • 學會使用HTML5 和 JavaScript優化表單驗證
    全文共3663字,預計學習時長11分鐘表單驗證是使用HTML5時的一個內置特性,HTML5提供了各種驗證屬性。作為瀏覽器端HTML和JavaScript的一部分。在將數據發送到伺服器之前,我們可以使用它來驗證表單輸入。
  • Django Form表單API詳解
    1) Form.is_boundDjango Form 表單有兩種表現形式:一種是該表單綁定了數據,那麼它就可以實現表單數據的驗證並生成數據渲染的 HTML 表單;而另外一種是未綁定數據的,由於不存在數據所以直接生成空白的 HTML 表單。如果需要綁定數據,需要使用字典的形式傳遞待綁定的數據。
  • 15個最佳的 JavaScript 表單驗證庫
    客戶端驗證在任何項目都是不夠的,因為 Java 可以直接忽略,人們可以提交請求到伺服器。 然而這並不意味著客戶端驗證都沒必要了,很多時候我們需要在用戶提交到伺服器之前給予提示。Java 表單驗證庫允許開發人員自定義樣式、錯誤消息和樣式以及簡化驗證規則的創建。在本文中,您將找到最好的15個 Java 表單驗證庫,可以幫助你讓表單驗證對用戶更友好的和美觀。
  • HTML5新增表單元素
    新增type類型:Type=「email」 限制用戶必須輸入email類型Type=「url」 限制用戶必須輸入url類型,「http://」Type=「range」 產生一個滑動條表單Type=「number」 產生一個數字意義表單Type
  • 使用Html+JavaScript實現表單上用戶名和密碼的非空驗證案例
    ,因此,表單驗證是JavaScript的鼻祖功能。我們可以將在C#後端開發中使用的一些表單驗證技巧用在JavaScript表單驗證中。語言不同,但原理都是一樣的。目標:練習JavaScript給文本框賦值和取值,並進行非空判斷。
  • 10個強大的Javascript表單驗證插件推薦
    本文介紹了10個不錯的JavaScript表單驗證插件,使用它們完全可以節省你的時間!希望你喜歡。1. validate.jsZebra_Form是一個免費的PHP庫,它能夠很好地處理表單驗證。你只需使用少量的PHP代碼即可設計一個安全、別致的表單。Zebra_Form在前端集成了jQuery,用以顯示警告及錯誤提示。
  • 強力推薦10款Javascript表單驗證插件
    【IT168 技術】創建一個JavaScript表單驗證插件,可以說是一個繁瑣的過程,涉及到初期設計、開發與測試等等環節。實際上一個優秀的程式設計師不僅是技術高手,也應該是善假於外物的。本文介紹了10個不錯的JavaScript表單驗證插件,使用它們完全可以節省你的時間!希望你喜歡。
  • 前端HTML5面試官和應試者一問一答
    action特性把表單內容提交到另外一個頁面,而在html5中,為不同的「提交」按鈕分別添加formaction特性後,該特性會覆蓋表單的action特性,將表單提交至不同的頁面。html5增加的表單類型email等,都包含一個原始的類型驗證,如果用戶輸入的內容與表單類型不符合,typeMismatch屬性將返回true,否則反之。c. patternMismatch屬性:輸入值與pattern特性的正則不匹配。
  • 第四節:HTML5給表單帶來的新標籤、新屬性、新類型
    <keygen>標籤:規定用於表單的密鑰對生成器欄位。當提交表單時,私鑰存儲在本地,公鑰發送到伺服器,這種機制是專為使用基於Web的證書管理系統。大意是:雖然有些瀏覽器還支持它,但是這個特性已經被移除出web標準了,以後別使用它了。 講了3個新的表單標籤,下面我們來介紹HTML5給表單帶來的新屬性。autocomplete 屬性:可用在form標籤和input標籤,實現自動完成輸入功能。
  • 實戰jQuery和PHP CodeIgniter表單驗證
    【IT168 專稿】        前言  在Web建站中,表單的合法性驗證是十分重要的一個環節,其中包括客戶端瀏覽器的Javascript的驗證和服務端的驗證。
  • HTML5新增加的一些表單屬性
    HTML5新增加了一些表單屬性,form增加了autocomplete和novalidate,input控制項增加了autocomplete、autofocus、form、formaction、formenctype、formmethod、formnovalidate
  • PHP教程:用PHP程序對網頁表單的處理
    PHP _GET 和 _POST變量是用來獲取表單中的信息的,比如用戶輸入的信息。PHP表單操作在我們處理HTML表單和PHP表單時,我們要記住的重要一點是:HTML頁面中的任何一個表單元素都可以自動的用於PHP腳本:表單舉例:
  • Django Form表單完整使用流程
    表單系統重點知識回顧表單系統的核心是 Form 對象,它將表單中的欄位封裝成了一系列的 Field 和驗證規則,以此來自動生成 HTML 表達標籤。本節中首先使用 Form 對象實現書籍的搜索功能,然後再詳細講解 Form 對象的構成。那麼下面我們首先對前面學過的知識做一下簡單的重點知識回顧。
  • 一個非常強大完整的web表單驗證程序
    表單的驗證一直是網頁設計者頭痛的問題,表單驗證類 Validator就是為解決這個問題而寫的,旨在使設計者從紛繁複雜的表單驗證中解放出來,把精力集中於網頁的設計和功能上的改進上。Validator是基於JavaScript技術的偽靜態類和對象的自定義屬性,可以對網頁中的表單項輸入進行相應的驗證,允許同一頁面中同時驗證多個表單,熟悉接口之後也可以對特定的表單項甚至僅僅是某個字符串進行驗證。因為是偽靜態類,所以在調用時不需要實例化,直接以"類名+.語法+屬性或方法名"來調用。此外,Validator還提供3種不同的錯誤提示模式,以滿足不同的需要。
  • 【匯總】HTML5和CSS3表單示例和詳細教程
    本教程教您如何使用先進的CSS和最新的CSS3技術打造漂亮的HTM5表單。示例是一個購物車表單,需要用戶填充自己的詳細資料,送貨地址和信用卡資料。本教程將演示如何創建自己的簡單時尚的聯繫表單,如何使用HTML5的新功能。
  • 表單設計:掌握表單設計方法(表單體驗篇)
    表單內部布局方式,一定是平鋪的一欄麼,是否可以增加側邊目錄? 這些都是設計師需要進行全盤考慮的問題,所以在設計表單的時候需要先確定這些框架,由外>內,層層深入,再對細節進行處理。所以接下來我會針對如何由外>內設計表單進行詳細的陳述。
  • 表單設計歸納
    這些是文本輸入框的關鍵元素:文本容器——可交互的輸入區域輸入文本——所輸入的文本內容標籤文本——告訴用戶這個表單欄位中要輸入的內容屬性佔位符文本——輸入信息的範例,用戶後續需要用自己的內容替代它幫助和驗證(可選)——提供上下文信息和驗證信息前導圖標(可選)——描述文本欄位所需的輸入類型和特徵
  • 用戶體驗超棒且功能強大使用簡單的javascript表單驗證 - Parsley.js
    用戶體驗超棒且功能強大使用簡單的javascript表單驗證 - Parsley.js 大家還記得我們曾經介紹過的表單驗證jquery插件jquery.validationEngine