useContext() :用React context管理登录状态

声明:不是我自己原创的code,是Udemy课程里的代码,我结合实际运用情况改写了一下。原课程:https://www.udemy.com/course/react-the-complete-guide-incl-redux/

本文代码块只写了context相关的部分,完整代码(请切到react-login-demo分支查看):https://github.com/CrystalCAI11/udemy-react-course/tree/react-login-demo

使用前提:context api建议仅用于没有使用redux的小型项目, context api并不能完全替代redux,以及useContext()只能用在function component中。

第一步:create你的context

// context file
const AuthContext = React.createContext({
  token: "",
  isLoggedIn: false,
  onLogin: (token, expTime) => {},
  onLogout: () => {},
})

React.createContext()里的内容只是为了在组件引用context的时候有下图这样的输入自动联想,不是实际的函数。不需要的话也可以空着。
在这里插入图片描述

接着创建一个context provider 把实际的登录登出的方法都写在里面,return AuthContext.Provider

export const AuthContextProvider = (props) => {
  const loginHandler = () => {
  	 // 这里写真正的登录方法
  }

   const loginHandler = () => {
  	 // 这里写真正的登出方法
  }
  
  const contextValue = {
    token: token,
    isLoggedIn: isLoggedIn,
    onLogin: loginHandler,
    onLogout: logoutHandler,
  }

  return (
    <AuthContext.Provider value={contextValue}>
      {props.children}
    </AuthContext.Provider>
  )
}

export default AuthContext

第二步:index.js里引入你创建的context provider把App包起来,这里和redux provider其实是一样的

// index.js
import { AuthContextProvider } from "./store/auth-context"

ReactDOM.render(
  <AuthContextProvider>
    <App />
  </AuthContextProvider>,
  document.getElementById("root")
)

第三步:在组件中使用引入useContext这个react自带的hook和你创建的context。useContext()解构你的context,解构出来的 authCtx.就可以调用所有context里的方法和变量,非常方便。比如在登录按钮上绑定authCtx.onLogin()
所有需要使用context的组件都得引用一次,这个也和redux一样。

// your component.jsx
import  { useContext } from "react"
import AuthContext from "../../store/auth-context"

const Login = (props) => {
	 const authCtx = useContext(AuthContext)
	 const submitHandler = (event) => {
	  authCtx.onLogin()
	}
	return(<button onClick={submitHandler}>登录</button>)
}

第四步:因为登录状态一般是全局通用的,所以App.js里也要引用。根据context里的isLoggedIn来render不同的组件

// App.js
import React, { useContext } from "react"
import Login from "./components/Login/Login"
import Home from "./components/Home/Home"
import MainHeader from "./components/MainHeader/MainHeader"
import AuthContext from "./store/auth-context"

function App() {
  const authCtx = useContext(AuthContext)
  return (
    <React.Fragment>
      <MainHeader />
      <main>
        {!authCtx.isLoggedIn && <Login />}
        {authCtx.isLoggedIn && <Home />}
      </main>
    </React.Fragment>
  )
}

export default App

以上,欢迎补充。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值