React特征學(xué)習(xí)Form數(shù)據(jù)管理示例詳解
Form數(shù)據(jù)管理
有時(shí)會(huì)遇到多個(gè)位置需要用戶輸入的情況,若每個(gè)狀態(tài)都配置state或handler會(huì)很繁瑣,可以嘗試下面的方法
import * as React from 'react';
const LoginForm = () => {
// 將多個(gè)狀態(tài)合并為對(duì)象
const [state, setState] = React.useState({
email: '',
password: '',
});
// 通過(guò)單個(gè)handler統(tǒng)一管理
const handleChange = (e) => {
setState({
...state,
[e.target.id]: e.target.value,
});
};
const handleSubmit = (e) => {
e.preventDefault();
alert(state.email + ' ' + state.password);
};
return (
<form onSubmit={handleSubmit}>
<div>
<label htmlFor="email">Email</label>
<input
id="email"
type="text"
value={state.email}
onChange={handleChange}
/>
</div>
<div>
<label htmlFor="password">Password</label>
<input
id="password"
type="password"
value={state.password}
onChange={handleChange}
/>
</div>
<button type="submit">Submit</button>
</form>
);
};
export { LoginForm };
重置Form狀態(tài)
由于每次用戶輸入后都需要數(shù)據(jù)重置回初始狀態(tài),可以使用以下方法來(lái)預(yù)設(shè)初始值,并重置Form內(nèi)容,方便新用戶的再次輸入
import * as React from 'react';
const LoginForm = () => {
// 初始
const [state, setState] = React.useState({
// 設(shè)置初始值
email: '123@456.com',
password: '12345',
});
const handleChange = (e) => {
setState({
...state,
[e.target.id]: e.target.value,
});
};
const handleSubmit = (e) => {
e.preventDefault();
// 在這里重置狀態(tài)
setState({
email: '',
password: '',
});
alert(state.email + ' ' + state.password);
};
return (
<form onSubmit={handleSubmit}>
<div>
<label htmlFor="email">Email</label>
<input
id="email"
type="text"
value={state.email}
onChange={handleChange}
/>
</div>
<div>
<label htmlFor="password">Password</label>
<input
id="password"
type="password"
value={state.password}
onChange={handleChange}
/>
</div>
<button type="submit">Submit</button>
</form>
);
};
export { LoginForm };
屏幕顯示如下,submit后 Form內(nèi)容會(huì)被重置

也可以考慮設(shè)置一個(gè)變量來(lái)統(tǒng)一管理初始值,方便對(duì)狀態(tài)的查找和維護(hù)
import * as React from 'react';
const LoginForm = () => {
// 定義初始值
const INITIAL_STATE = {
email: '',
password: '',
};
const [state, setState] = React.useState(INITIAL_STATE);
const handleChange = (e) => {
setState({
...state,
[e.target.id]: e.target.value,
});
};
const handleSubmit = (e) => {
e.preventDefault();
// 重置初始值
setState(INITIAL_STATE);
};
return (
<form onSubmit={handleSubmit}>
<div>
<label htmlFor="email">Email</label>
<input
id="email"
type="text"
value={state.email}
onChange={handleChange}
/>
</div>
<div>
<label htmlFor="password">Password</label>
<input
id="password"
type="password"
value={state.password}
onChange={handleChange}
/>
</div>
<button type="submit">Submit</button>
</form>
);
};
export { LoginForm };
form驗(yàn)證
驗(yàn)證Form的輸入是不可或缺的流程,可參考以下方案
import * as React from 'react';
const LoginForm = () => {
const INITIAL_STATE = {
email: '',
password: '',
};
// 設(shè)置Validation要求
const VALIDATION = {
email: [
{
isValid: (value) => !!value,
message: 'Is required.',
},
{
isValid: (value) => /\S+@\S+\.\S+/.test(value),
message: 'Needs to be an email.',
},
],
password: [
{
isValid: (value) => !!value,
message: 'Is required.',
},
],
};
// 獲取ErrorsFields
const getErrorState = (state) =>
Object.keys(state).reduce((acc, key) => {
if (!VALIDATION[key]) return acc;
const errorsPerField = VALIDATION[key].map((validation) => ({
isValid: validation.isValid(state[key]),
message: validation.message,
})).filter((errorPerField) => !errorPerField.isValid);
return { ...acc, [key]: errorsPerField };
}, {});
const [state, setState] = React.useState(INITIAL_STATE);
// 設(shè)置錯(cuò)誤信息變量
const errorState = getErrorState(state);
console.log(errorState);
const handleChange = (e) => {
setState({
...state,
[e.target.id]: e.target.value,
});
};
const handleSubmit = (e) => {
e.preventDefault();
// 獲取錯(cuò)誤反饋
const hasErrors = Object.values(errorFields).flat().length > 0;
if (hasErrors) return;
setState(INITIAL_STATE);
};
return (
<form onSubmit={handleSubmit}>
<div>
<label htmlFor="email">Email</label>
<input
id="email"
type="text"
value={state.email}
onChange={handleChange}
/>
{/* 顯示email錯(cuò)誤 */}
{errorState.email?.length ? (
<span style={{ color: 'red' }}>
{errorState.email[0].message}
</span>
) : null}
</div>
<div>
<label htmlFor="password">Password</label>
<input
id="password"
type="password"
value={state.password}
onChange={handleChange}
/>
{/* 顯示password錯(cuò)誤 */}
{errorState.password?.length ? (
<span style={{ color: 'red' }}>
{errorState.password[0].message}
</span>
) : null}
</div>
<button type="submit">Submit</button>
</form>
);
};
export { LoginForm };
效果顯示如下

小結(jié)
到這里完成一個(gè)簡(jiǎn)易的React Login Form, 然而現(xiàn)實(shí)中React Form的問(wèn)題還有很多, 隨著學(xué)習(xí)的深入,會(huì)繼續(xù)探索Form實(shí)用的復(fù)雜性,更多關(guān)于React特征Form數(shù)據(jù)管理的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
React實(shí)現(xiàn)響應(yīng)式布局的最佳實(shí)踐
在當(dāng)今的前端開(kāi)發(fā)中,響應(yīng)式設(shè)計(jì)已經(jīng)成為必不可少的部分,隨著各種設(shè)備的出現(xiàn),確保我們的網(wǎng)頁(yè)在不同屏幕尺寸上展示良好,已經(jīng)成為開(kāi)發(fā)者的首要任務(wù)之一,本文將介紹如何在React中實(shí)現(xiàn)響應(yīng)式布局,提供一些最佳實(shí)踐和示例代碼,幫助大家更好地理解這一概念2025-02-02
React實(shí)現(xiàn)雙滑塊交叉滑動(dòng)
這篇文章主要為大家詳細(xì)介紹了React實(shí)現(xiàn)雙滑塊交叉滑動(dòng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09
React Zustand狀態(tài)管理庫(kù)的使用詳解
Zustand是一個(gè)為React和瀏覽器環(huán)境設(shè)計(jì)的輕量級(jí)狀態(tài)管理庫(kù),由Vercel開(kāi)發(fā),它特點(diǎn)包括輕量級(jí)、易用性、靈活性、可組合性和性能優(yōu)化,支持多種狀態(tài)管理模式和中間件,適合中小型項(xiàng)目,Zustand還支持TypeScript,提供類型安全的支持2024-09-09
react使用CSS實(shí)現(xiàn)react動(dòng)畫(huà)功能示例
這篇文章主要介紹了react使用CSS實(shí)現(xiàn)react動(dòng)畫(huà)功能,結(jié)合實(shí)例形式分析了react使用CSS實(shí)現(xiàn)react動(dòng)畫(huà)功能具體步驟與實(shí)現(xiàn)方法,需要的朋友可以參考下2020-05-05
阿里低代碼框架lowcode-engine設(shè)置默認(rèn)容器詳解
這篇文章主要為大家介紹了阿里低代碼框架lowcode-engine設(shè)置默認(rèn)容器詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02
解決配置setupProxy.js代理,頁(yè)面報(bào)錯(cuò)404問(wèn)題
這篇文章主要介紹了解決配置setupProxy.js代理,頁(yè)面報(bào)錯(cuò)404問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07
react中實(shí)現(xiàn)將一個(gè)視頻流為m3u8格式的轉(zhuǎn)換
這篇文章主要介紹了react中實(shí)現(xiàn)將一個(gè)視頻流為m3u8格式的轉(zhuǎn)換方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07
react-router?v6實(shí)現(xiàn)權(quán)限管理+自動(dòng)替換頁(yè)面標(biāo)題的案例
這篇文章主要介紹了react-router?v6實(shí)現(xiàn)權(quán)限管理+自動(dòng)替換頁(yè)面標(biāo)題,這次項(xiàng)目是有三種權(quán)限,分別是用戶,商家以及管理員,這次寫(xiě)的權(quán)限管理是高級(jí)權(quán)限能訪問(wèn)低級(jí)權(quán)限的所有頁(yè)面,但是低級(jí)權(quán)限不能訪問(wèn)高級(jí)權(quán)限的頁(yè)面,需要的朋友可以參考下2023-05-05

