使用React hook實(shí)現(xiàn)remember me功能
引言
相信大家在使用 React 寫頁面的時(shí)候都遇到過完成 Remember me 的需求吧!本文就將這個(gè)需求封裝在一個(gè) React hook 中以供后續(xù)的使用,覺得有用的同學(xué)可以收藏起來以備不時(shí)之需。
1. useRememberMe 鉤子函數(shù)
在 React 中實(shí)現(xiàn)這個(gè)功能,其本質(zhì)無非就是持久化存儲。一般遇到這種問題,我都是用 hook 來解決的,因?yàn)?hook 可以將很多可以復(fù)用的邏輯封裝起來,所以使用 hook 處理復(fù)雜邏輯非常合適。
下面是完整的 hook 代碼。
// 定義一個(gè)自定義Hook,用于處理"remember me"的功能 const useRememberMe = (initialUsername = '', initialRemember = false) => { // 使用React的useState Hook來定義三個(gè)狀態(tài)變量: // username: 用于存儲用戶名 // remember: 用于標(biāo)記用戶是否選擇了"remember me"選項(xiàng) // isRemembered: 用于標(biāo)記用戶名是否被記?。◤膌ocalStorage中恢復(fù)) const [username, setUsername] = useState(initialUsername); const [remember, setRemember] = useState(initialRemember); const [isRemembered, setIsRemembered] = useState(false); // 使用React的useEffect Hook,在組件掛載時(shí)執(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ù)組表示這個(gè)effect只會在組件掛載時(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會重新運(yùn)行 // 返回一個(gè)對象,包含所有的狀態(tài)變量和更新狀態(tài)的方法,供組件使用 return { username, setUsername, remember, setRemember, isRemembered, }; };
2. 小試牛刀
下面通過一個(gè)簡單的例子來說明這個(gè) hook 的用法:
// 定義一個(gè)React函數(shù)組件,用于顯示登錄表單 const LoginForm = () => { // 使用上面定義的useRememberMe Hook,并解構(gòu)返回的對象,獲取狀態(tài)和更新狀態(tài)的方法 const { username, setUsername, remember, setRemember, isRemembered, } = useRememberMe(); // 定義一個(gè)處理表單提交的函數(shù),目前僅阻止默認(rèn)行為(即頁面刷新),具體的登錄邏輯需要在這里實(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)用中,你通常會在一個(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)來存儲或刪除localStorage
中的用戶名和 "remember me" 的狀態(tài)。 - 返回一個(gè)對象,包含狀態(tài)和操作這些狀態(tài)的方法,供組件使用。
React函數(shù)組件
LoginForm
:- 使用
useRememberMe
Hook,并解構(gòu)其返回的對象,獲取狀態(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
。
- 用戶名輸入框的值與
- 使用
組件的渲染:
- 最后,通過
<LoginForm />
來渲染這個(gè)登錄表單組件。在實(shí)際應(yīng)用中,這一步通常會在一個(gè)父組件或路由中完成。
- 最后,通過
4. 最終效果
將 <LoginForm />
組件渲染到頁面上之后的效果如下所示:
點(diǎn)擊登錄按鈕之前的效果:
登錄之后刷新頁面后的效果:
到此這篇關(guān)于使用React hook實(shí)現(xiàn)remember me功能的文章就介紹到這了,更多相關(guān)React remember me功能內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
react-native中ListView組件點(diǎn)擊跳轉(zhuǎn)的方法示例
ListView作為React Native的核心組件,用于高效地顯示一個(gè)可以垂直滾動的變化的數(shù)據(jù)列表。下面這篇文章主要給大家介紹了關(guān)于react-native中ListView組件點(diǎn)擊跳轉(zhuǎn)的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起看看吧。2017-09-09React腳手架config-overrides.js文件的配置方式
這篇文章主要介紹了React腳手架config-overrides.js文件的配置方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-10-10React?Hooks中?useRef和useImperativeHandle的使用方式
這篇文章主要介紹了React?Hooks中?useRef和useImperativeHandle的使用方式,文中說明了useRef和useCallback一起使用,?可以解決閉包陷阱的問題,本文結(jié)合實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-10-10React利用lazy+Suspense實(shí)現(xiàn)路由懶加載
這篇文章主要為大家詳細(xì)介紹了React如何利用lazy+Suspense實(shí)現(xiàn)路由懶加載,文中的示例代碼簡潔易懂,感興趣的小伙伴可以跟隨小編一起了解一下2023-06-06