日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

react 项目实战(三)表单验证

發布時間:2024/4/17 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 react 项目实战(三)表单验证 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

我們需要記錄每一個字段當前的有效狀態,有效時隱藏錯誤信息,無效時顯示錯誤信息

而這個有效/無效,可以在表單值改變的時候進行判斷。

我們對/src/pages/UserAdd.js進行修改:

首先修改了state的結構,把每個表單的值都放到了一個form字段中,方便統一管理;然后每個表單的值都變為了一個包含valid和value還有error字段的對象,valid表示該值的有效狀態,value表示該表單具體的值,error表示錯誤提示信息:

... constructor () {super();this.state = {form: {name: {valid: false,value: '',error: ''},age: {valid: false,value: 0,error: ''},gender: {valid: false,value: '',error: ''}}}; } ...

handleValueChange方法中,根據參數field獲取state中對應表單的對象,然后根據新的值value判斷新的值是否有效,將新的值和新的有效狀態更新到state里。

... handleValueChange (field, value, type = 'string') {if (type === 'number') {value = +value;}const {form} = this.state;const newFieldObj = {value, valid: true, error: ''};switch (field) {case 'name': {if (value.length >= 5) {newFieldObj.error = '用戶名最多4個字符';newFieldObj.valid = false;} else if (value.length === 0) {newFieldObj.error = '請輸入用戶名';newFieldObj.valid = false;}break;}case 'age': {if (value > 100 || value <= 0 || !value) {newFieldObj.error = '請輸入1~100之間的數字';newFieldObj.valid = false;}break;}case 'gender': {if (!value) {newFieldObj.error = '請選擇性別';newFieldObj.valid = false;}break;}default: {//}}this.setState({form: {...form,[field]: newFieldObj}}); } ...

handleSubmit方法中對每個字段的valid進行檢測,如果有一個valid為false則直接return以中斷提交操作。

... handleSubmit (e) {e.preventDefault();const {form: {name, age, gender}} = this.state;if (!name.valid || !age.valid || !gender.valid) {alert('請填寫正確的信息后重試');return;}fetch('http://localhost:3000/user', {method: 'post',body: JSON.stringify({name: name.value,age: age.value,gender: gender.value}),headers: {'Content-Type': 'application/json'}}).then((res) => res.json()).then((res) => {if (res.id) {alert('添加用戶成功');} else {alert('添加失敗');}}).catch((err) => console.error(err)); } ...

最后,也要對render方法進行更新:

render () {const {form: {name, age, gender}} = this.state;return (<div><header><h1>添加用戶</h1></header><main><form onSubmit={(e) => this.handleSubmit(e)}><label>用戶名:</label><inputtype="text"value={name.value}onChange={(e) => this.handleValueChange('name', e.target.value)}/>{!name.valid && <span>{name.error}</span>}<br/><label>年齡:</label><inputtype="number"value={age.value || ''}onChange={(e) => this.handleValueChange('age', e.target.value, 'number')}/>{!age.valid && <span>{age.error}</span>}<br/><label>性別:</label><selectvalue={gender.value}onChange={(e) => this.handleValueChange('gender', e.target.value)}><option value="">請選擇</option><option value="male">男</option><option value="female">女</option></select>{!gender.valid && <span>{gender.error}</span>}<br/><br/><input type="submit" value="提交"/></form></main></div>); }

來看一下最終效果:?

注:完整代碼 src / pages / UserAdd.js

import React from 'react';// 添加用戶組件 class UserAdd extends React.Component {// 構造器constructor(props) {super(props);// 定義初始化狀態this.state = {form: {name: {valid: false, // 有效狀態value: '', // 表單具體的值error: '' // 錯誤提示信息},age: {valid: false,value: '',error: ''},gender: {valid: false,value: '',error: ''}}};}// 輸入框改變事件handleValueChange(field, value, type='string') {// 由于表單的值都是字符串,我們可以根據傳入type為number來手動轉換value的類型為number類型if(type === 'number'){value = + value;}// 定義常量const { form } = this.state;const newFieldObj = {value, valid: true, error: ''};// 判斷switch(field){case 'name': {if(value.length >= 5){newFieldObj.error = '用戶名最多4個字符';newFieldObj.valid = false;}else if(value.length === 0){newFieldObj.error = '請輸入用戶名';newFieldObj.valid = false;}break;}case 'age': {if(value > 100 || value <= 0 || !value){newFieldObj.error = '請輸入1~100之間的數字';newFieldObj.valid = false;}break;}case 'gender': {if(!value){newFieldObj.error = '請選擇性別';newFieldObj.valid = false;}break;}default: {//}}// 設置狀態this.setState({form: {...form,[field]: newFieldObj}});}// 按鈕提交事件handleSubmit(e){// 阻止表單submit事件自動跳轉頁面的動作e.preventDefault();// 定義常量const { form: { name, age, gender }} = this.state;// 驗證if(!name.valid || !age.valid || !gender.valid){alert('請填寫正確的信息后重試');return;}// 發送請求fetch('http://localhost:8000/user', {method: 'post',// 使用fetch提交的json數據需要使用JSON.stringify轉換為字符串body: JSON.stringify({name: name.value,age: age.value,gender: gender.value}),headers: {'Content-Type': 'application/json'}})// 強制回調的數據格式為json.then((res) => res.json())// 成功的回調.then((res) => {// 當添加成功時,返回的json對象中應包含一個有效的id字段// 所以可以使用res.id來判斷添加是否成功if(res.id){alert('添加用戶成功!');}else{alert('添加用戶失敗!');}})// 失敗的回調.catch((err) => console.error(err));}render() {// 定義常量const {form: {name, age, gender}} = this.state;return (<div><header><div>添加用戶</div></header><main><form onSubmit={(e) => this.handleSubmit(e)}><label>用戶名:</label><inputtype="text"value={name.value}onChange={(e) => this.handleValueChange('name', e.target.value)} />{!name.valid && <span>{name.error}</span>}<br /><label>年齡:</label><inputtype="number"value={age.value || ''}onChange={(e) => this.handleValueChange('age', e.target.value, 'number')} />{!age.valid && <span>{age.error}</span>}<br /><label>性別:</label><selectvalue={gender.value}onChange={(e) => this.handleValueChange('gender', e.target.value)}><option value="">請選擇</option><option value="male">男</option><option value="female">女</option></select>{!gender.valid && <span>{gender.error}</span>}<br /><br /><input type="submit" value="提交" /></form></main></div>);} }export default UserAdd;

.

總結

以上是生活随笔為你收集整理的react 项目实战(三)表单验证的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。