使用React hook實(shí)現(xiàn)remember me功能
引言
相信大家在使用 React 寫頁(yè)面的時(shí)候都遇到過(guò)完成 Remember me 的需求吧!本文就將這個(gè)需求封裝在一個(gè) React hook 中以供后續(xù)的使用,覺得有用的同學(xué)可以收藏起來(lái)以備不時(shí)之需。
1. useRememberMe 鉤子函數(shù)
在 React 中實(shí)現(xiàn)這個(gè)功能,其本質(zhì)無(wú)非就是持久化存儲(chǔ)。一般遇到這種問(wèn)題,我都是用 hook 來(lái)解決的,因?yàn)?hook 可以將很多可以復(fù)用的邏輯封裝起來(lái),所以使用 hook 處理復(fù)雜邏輯非常合適。
下面是完整的 hook 代碼。
// 定義一個(gè)自定義Hook,用于處理"remember me"的功能
const useRememberMe = (initialUsername = '', initialRemember = false) => {
// 使用React的useState Hook來(lái)定義三個(gè)狀態(tài)變量:
// username: 用于存儲(chǔ)用戶名
// remember: 用于標(biāo)記用戶是否選擇了"remember me"選項(xiàng)
// isRemembered: 用于標(biāo)記用戶名是否被記住(從localStorage中恢復(fù))
const [username, setUsername] = useState(initialUsername);
const [remember, setRemember] = useState(initialRemember);
const [isRemembered, setIsRemembered] = useState(false);
// 使用React的useEffect Hook,在組件掛載時(shí)執(zhí)行(僅執(zhí)行一次)
useEffect(() => {
// 從localStorage中嘗試獲取存儲(chǔ)的用戶名和"remember me"的狀態(tài)
const storedUsername = localStorage.getItem('username');
const storedRemember = localStorage.getItem('remember');
// 如果用戶名存在且"remember me"被選中,則恢復(fù)這些狀態(tài)
if (storedUsername && storedRemember === 'true') {
setUsername(storedUsername);
setRemember(true);
setIsRemembered(true);
}
}, []); // 空的依賴數(shù)組表示這個(gè)effect只會(huì)在組件掛載時(shí)運(yùn)行一次
// 另一個(gè)useEffect Hook,當(dāng)remember或username狀態(tài)變化時(shí)執(zhí)行
useEffect(() => {
// 如果用戶選擇了"remember me",則將用戶名和狀態(tài)保存到localStorage中
if (remember) {
localStorage.setItem('username', username);
localStorage.setItem('remember', 'true');
} else {
// 否則,從localStorage中移除這些信息
localStorage.removeItem('username');
localStorage.removeItem('remember');
}
}, [remember, username]); // 當(dāng)remember或username變化時(shí),這個(gè)effect會(huì)重新運(yùn)行
// 返回一個(gè)對(duì)象,包含所有的狀態(tài)變量和更新狀態(tài)的方法,供組件使用
return {
username,
setUsername,
remember,
setRemember,
isRemembered,
};
};
2. 小試牛刀
下面通過(guò)一個(gè)簡(jiǎn)單的例子來(lái)說(shuō)明這個(gè) hook 的用法:
// 定義一個(gè)React函數(shù)組件,用于顯示登錄表單
const LoginForm = () => {
// 使用上面定義的useRememberMe Hook,并解構(gòu)返回的對(duì)象,獲取狀態(tài)和更新狀態(tài)的方法
const {
username,
setUsername,
remember,
setRemember,
isRemembered,
} = useRememberMe();
// 定義一個(gè)處理表單提交的函數(shù),目前僅阻止默認(rèn)行為(即頁(yè)面刷新),具體的登錄邏輯需要在這里實(shí)現(xiàn)
const handleSubmit = (e) => {
e.preventDefault();
// 處理登錄邏輯...
};
// 返回JSX,描述組件的UI
return (
<form onSubmit={handleSubmit}>
{/* 用戶名輸入框,值與username狀態(tài)綁定,當(dāng)輸入變化時(shí)更新username狀態(tài) */}
<input
type="text"
placeholder="Username"
value={username}
onChange={(e) => setUsername(e.target.value)}
/>
{/* 密碼輸入框,目前沒有綁定任何狀態(tài)或處理邏輯 */}
<input
type="password"
placeholder="Password"
// 你需要添加密碼狀態(tài)和處理邏輯
/>
{/* "Remember me"復(fù)選框,狀態(tài)與remember綁定,當(dāng)選擇變化時(shí)更新remember狀態(tài) */}
<label>
<input
type="checkbox"
checked={remember}
onChange={(e) => setRemember(e.target.checked)}
/>
Remember me
</label>
{/* 提交按鈕 */}
<button type="submit">Login</button>
</form>
);
};
// 在React應(yīng)用中渲染LoginForm組件
// 注意:在實(shí)際應(yīng)用中,你通常會(huì)在一個(gè)父組件或路由中渲染這個(gè)組件,而不是直接這樣寫
<LoginForm />
3. 原理解釋
自定義Hook
useRememberMe:- useRememberMe 是一個(gè)自定義Hook,用于處理"remember me"的功能。
- 它接收兩個(gè)參數(shù):
initialUsername(默認(rèn)用戶名)和initialRemember(是否默認(rèn)記住我),都有默認(rèn)值。 - 使用
useState定義了三個(gè)狀態(tài):username(用戶名)、remember(是否選擇記住我)、isRemembered(用戶名是否被記?。?。 - 第一個(gè)
useEffect在組件掛載時(shí)從localStorage中恢復(fù)用戶名和 "remember me" 的狀態(tài)。 - 第二個(gè)
useEffect根據(jù)remember的狀態(tài)來(lái)存儲(chǔ)或刪除localStorage中的用戶名和 "remember me" 的狀態(tài)。 - 返回一個(gè)對(duì)象,包含狀態(tài)和操作這些狀態(tài)的方法,供組件使用。
React函數(shù)組件
LoginForm:- 使用
useRememberMeHook,并解構(gòu)其返回的對(duì)象,獲取狀態(tài)和更新狀態(tài)的方法。 - 定義了
handleSubmit函數(shù)處理表單提交,目前僅阻止默認(rèn)行為。 - 返回JSX描述的UI,包括用戶名輸入框、密碼輸入框、"Remember me"復(fù)選框和提交按鈕。
- 用戶名輸入框的值與
username狀態(tài)綁定,輸入變化時(shí)更新username。 - "Remember me"復(fù)選框的狀態(tài)與
remember綁定,選擇變化時(shí)更新remember。
- 用戶名輸入框的值與
- 使用
組件的渲染:
- 最后,通過(guò)
<LoginForm />來(lái)渲染這個(gè)登錄表單組件。在實(shí)際應(yīng)用中,這一步通常會(huì)在一個(gè)父組件或路由中完成。
- 最后,通過(guò)
4. 最終效果
將 <LoginForm /> 組件渲染到頁(yè)面上之后的效果如下所示:

點(diǎn)擊登錄按鈕之前的效果:

登錄之后刷新頁(yè)面后的效果:

到此這篇關(guān)于使用React hook實(shí)現(xiàn)remember me功能的文章就介紹到這了,更多相關(guān)React remember me功能內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用react+redux實(shí)現(xiàn)彈出框案例
這篇文章主要為大家詳細(xì)介紹了使用react+redux實(shí)現(xiàn)彈出框案例,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-08-08
ReactJs實(shí)現(xiàn)樹形結(jié)構(gòu)的數(shù)據(jù)顯示的組件的示例
本篇文章主要介紹了ReactJs實(shí)現(xiàn)樹形結(jié)構(gòu)的數(shù)據(jù)顯示的組件的示例,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2017-08-08
解決React報(bào)錯(cuò)Expected?`onClick`?listener?to?be?a?function
這篇文章主要為大家介紹了React報(bào)錯(cuò)Expected?`onClick`?listener?to?be?a?function解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12
react頁(yè)面中存在多個(gè)input時(shí)巧妙設(shè)置value屬性方式
這篇文章主要介紹了react頁(yè)面中存在多個(gè)input時(shí)巧妙設(shè)置value屬性方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-05-05
使用 React hooks 實(shí)現(xiàn)類所有生命周期
react 自 16.8 開始,引入了 Hooks 概念,使得函數(shù)組件中也可以擁有自己的狀態(tài),并且可以模擬對(duì)應(yīng)的生命周期,這篇文章主要介紹了使用 React hooks 怎么實(shí)現(xiàn)類里面的所有生命周期,需要的朋友可以參考下2023-02-02

