使用React hook实现remember me功能

 更新时间:2024年04月24日 08:48:42   作者:慕仲卿  
相信大家在使用 React 写页面的时候都遇到过完成 Remember me 的需求吧!本文就将这个需求封装在一个 React hook 中以供后续的使用,觉得有用的同学可以收藏起来以备不时之需,感兴趣的小伙伴跟着小编一起来看看吧

引言

相信大家在使用 React 写页面的时候都遇到过完成 Remember me 的需求吧!本文就将这个需求封装在一个 React hook 中以供后续的使用,觉得有用的同学可以收藏起来以备不时之需。

1. useRememberMe 钩子函数

在 React 中实现这个功能,其本质无非就是持久化存储。一般遇到这种问题,我都是用 hook 来解决的,因为 hook 可以将很多可以复用的逻辑封装起来,所以使用 hook 处理复杂逻辑非常合适。

下面是完整的 hook 代码。

// 定义一个自定义Hook,用于处理"remember me"的功能  
const useRememberMe = (initialUsername = '', initialRemember = false) => {    
  
  // 使用React的useState Hook来定义三个状态变量:  
  // username: 用于存储用户名  
  // remember: 用于标记用户是否选择了"remember me"选项  
  // isRemembered: 用于标记用户名是否被记住(从localStorage中恢复)  
  const [username, setUsername] = useState(initialUsername);    
  const [remember, setRemember] = useState(initialRemember);    
  const [isRemembered, setIsRemembered] = useState(false);    
  
  // 使用React的useEffect Hook,在组件挂载时执行(仅执行一次)  
  useEffect(() => {    
    // 从localStorage中尝试获取存储的用户名和"remember me"的状态  
    const storedUsername = localStorage.getItem('username');    
    const storedRemember = localStorage.getItem('remember');    
  
    // 如果用户名存在且"remember me"被选中,则恢复这些状态  
    if (storedUsername && storedRemember === 'true') {    
      setUsername(storedUsername);    
      setRemember(true);    
      setIsRemembered(true);    
    }    
  }, []);  // 空的依赖数组表示这个effect只会在组件挂载时运行一次  
  
  // 另一个useEffect Hook,当remember或username状态变化时执行  
  useEffect(() => {    
    // 如果用户选择了"remember me",则将用户名和状态保存到localStorage中  
    if (remember) {    
      localStorage.setItem('username', username);    
      localStorage.setItem('remember', 'true');    
    } else {    
      // 否则,从localStorage中移除这些信息  
      localStorage.removeItem('username');    
      localStorage.removeItem('remember');    
    }    
  }, [remember, username]);  // 当remember或username变化时,这个effect会重新运行  
  
  // 返回一个对象,包含所有的状态变量和更新状态的方法,供组件使用  
  return {    
    username,    
    setUsername,    
    remember,    
    setRemember,    
    isRemembered,    
  };    
};   

2. 小试牛刀

下面通过一个简单的例子来说明这个 hook 的用法:

// 定义一个React函数组件,用于显示登录表单  
const LoginForm = () => {    
  // 使用上面定义的useRememberMe Hook,并解构返回的对象,获取状态和更新状态的方法  
  const {    
    username,    
    setUsername,    
    remember,    
    setRemember,    
    isRemembered,    
  } = useRememberMe();    
  
  // 定义一个处理表单提交的函数,目前仅阻止默认行为(即页面刷新),具体的登录逻辑需要在这里实现  
  const handleSubmit = (e) => {    
    e.preventDefault();    
    // 处理登录逻辑...    
  };    
  
  // 返回JSX,描述组件的UI  
  return (    
    <form onSubmit={handleSubmit}>    
      {/* 用户名输入框,值与username状态绑定,当输入变化时更新username状态 */}  
      <input    
        type="text"    
        placeholder="Username"    
        value={username}    
        onChange={(e) => setUsername(e.target.value)}    
      />    
      {/* 密码输入框,目前没有绑定任何状态或处理逻辑 */}  
      <input    
        type="password"    
        placeholder="Password"    
        // 你需要添加密码状态和处理逻辑    
      />    
      {/* "Remember me"复选框,状态与remember绑定,当选择变化时更新remember状态 */}  
      <label>    
        <input    
          type="checkbox"    
          checked={remember}    
          onChange={(e) => setRemember(e.target.checked)}    
        />    
        Remember me    
      </label>    
      {/* 提交按钮 */}  
      <button type="submit">Login</button>    
    </form>    
  );    
};    
  
// 在React应用中渲染LoginForm组件  
// 注意:在实际应用中,你通常会在一个父组件或路由中渲染这个组件,而不是直接这样写  
<LoginForm />

3. 原理解释

  • 自定义Hook useRememberMe:

    • useRememberMe 是一个自定义Hook,用于处理"remember me"的功能。
    • 它接收两个参数:initialUsername(默认用户名)和initialRemember(是否默认记住我),都有默认值。
    • 使用useState定义了三个状态:username(用户名)、remember(是否选择记住我)、isRemembered(用户名是否被记住)。
    • 第一个 useEffect 在组件挂载时从 localStorage 中恢复用户名和 "remember me" 的状态。
    • 第二个 useEffect 根据 remember 的状态来存储或删除 localStorage 中的用户名和 "remember me" 的状态。
    • 返回一个对象,包含状态和操作这些状态的方法,供组件使用。
  • React函数组件 LoginForm:

    • 使用useRememberMe Hook,并解构其返回的对象,获取状态和更新状态的方法。
    • 定义了handleSubmit函数处理表单提交,目前仅阻止默认行为。
    • 返回JSX描述的UI,包括用户名输入框、密码输入框、"Remember me"复选框和提交按钮。
      • 用户名输入框的值与username状态绑定,输入变化时更新username
      • "Remember me"复选框的状态与remember绑定,选择变化时更新remember
  • 组件的渲染:

    • 最后,通过<LoginForm />来渲染这个登录表单组件。在实际应用中,这一步通常会在一个父组件或路由中完成。

4. 最终效果

<LoginForm /> 组件渲染到页面上之后的效果如下所示:

点击登录按钮之前的效果:

登录之后刷新页面后的效果:

到此这篇关于使用React hook实现remember me功能的文章就介绍到这了,更多相关React remember me功能内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • React的Props、生命周期详解

    React的Props、生命周期详解

    “Props” 是 React 中用于传递数据给组件的一种机制,通常作为组件的参数进行传递,在 React 中,props 是只读的,意味着一旦将数据传递给组件的 props,组件就不能直接修改这些 props 的值,这篇文章主要介绍了React的Props、生命周期,需要的朋友可以参考下
    2024-06-06
  • react-native中ListView组件点击跳转的方法示例

    react-native中ListView组件点击跳转的方法示例

    ListView作为React Native的核心组件,用于高效地显示一个可以垂直滚动的变化的数据列表。下面这篇文章主要给大家介绍了关于react-native中ListView组件点击跳转的相关资料,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-09-09
  • React脚手架config-overrides.js文件的配置方式

    React脚手架config-overrides.js文件的配置方式

    这篇文章主要介绍了React脚手架config-overrides.js文件的配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-10-10
  • react vue背景挂载机器问题

    react vue背景挂载机器问题

    这篇文章主要介绍了react vue背景挂载机器问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-03-03
  • 聊聊React onClick 传递参数的问题

    聊聊React onClick 传递参数的问题

    很多朋友向小编反映一个问题关于React onClick 传递参数的问题,当点击删除按钮需要执行删除操作,针对这个问题该如何处理呢?下面小编给大家带来了React onClick 传递参数的问题,感兴趣的朋友一起看看吧
    2021-10-10
  • React Hooks中 useRef和useImperativeHandle的使用方式

    React Hooks中 useRef和useImperativeHandle的使用方式

    这篇文章主要介绍了React Hooks中 useRef和useImperativeHandle的使用方式,文中说明了useRef和useCallback一起使用, 可以解决闭包陷阱的问题,本文结合实例代码介绍的非常详细,需要的朋友可以参考下
    2023-10-10
  • React中的JSX  { }的使用详解

    React中的JSX  { }的使用详解

    这篇文章主要介绍了React中的JSX{ }的使用,React使用JSX来替代常规的JavaScript,JSX可以理解为的JavaScript语法扩展,它里面的标签申明要符合XML规范要求,对React JSX使用感兴趣的朋友一起看看吧
    2022-08-08
  • 详解如何在React中监听鼠标事件

    详解如何在React中监听鼠标事件

    React可以通过使用React事件系统来监听鼠标事件,您可以在React组件中通过使用特定的事件处理函数来注册和处理鼠标事件,本文小编讲给大家详细介绍一下如何在React中监听鼠标事件,需要的朋友可以参考下
    2023-09-09
  • 详解React Native与IOS端之间的交互

    详解React Native与IOS端之间的交互

    React Native (简称RN)是Facebook于2015年4月开源的跨平台移动应用开发框架,是Facebook早先开源的JS框架 React 在原生移动应用平台的衍生产物,支持iOS和安卓两大平台。本文将介绍React Native与IOS端之间的交互。
    2021-06-06
  • React利用lazy+Suspense实现路由懒加载

    React利用lazy+Suspense实现路由懒加载

    这篇文章主要为大家详细介绍了React如何利用lazy+Suspense实现路由懒加载,文中的示例代码简洁易懂,感兴趣的小伙伴可以跟随小编一起了解一下
    2023-06-06

最新评论