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

點擊登錄按鈕之前的效果:

登錄之后刷新頁面后的效果:

到此這篇關(guān)于使用React hook實現(xiàn)remember me功能的文章就介紹到這了,更多相關(guān)React remember me功能內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
react-native中ListView組件點擊跳轉(zhuǎn)的方法示例
ListView作為React Native的核心組件,用于高效地顯示一個可以垂直滾動的變化的數(shù)據(jù)列表。下面這篇文章主要給大家介紹了關(guān)于react-native中ListView組件點擊跳轉(zhuǎn)的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起看看吧。2017-09-09
React腳手架config-overrides.js文件的配置方式
這篇文章主要介紹了React腳手架config-overrides.js文件的配置方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-10-10
React?Hooks中?useRef和useImperativeHandle的使用方式
這篇文章主要介紹了React?Hooks中?useRef和useImperativeHandle的使用方式,文中說明了useRef和useCallback一起使用,?可以解決閉包陷阱的問題,本文結(jié)合實例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-10-10
React利用lazy+Suspense實現(xiàn)路由懶加載
這篇文章主要為大家詳細(xì)介紹了React如何利用lazy+Suspense實現(xiàn)路由懶加載,文中的示例代碼簡潔易懂,感興趣的小伙伴可以跟隨小編一起了解一下2023-06-06

