首页/ 文章/前端/正文

我遇到一个场景,该场景需要在React 应用中实现“使用Github登录”功能。虽然这听起来很简单,但在尝试做这件事时,你可能会遇到一些麻烦。因此,本文的目的是提供一个指南,帮助你在你的应用程序中实现这样的功能。让我们现在就开始吧!

步骤1:在Github上创建OAuth应用

按照此处提供的步骤登录到你的Github帐户并创建OAuth应用。注意:对于本例,在创建OAuth应用时,如果你在本地运行应用,可以将主页URL设置为http://localhost:3000/,将授权回调URL设置为http://localhost:3000/login。在根目录下创建一个 .env 文件,并设置这些变量:

REACT_APP_CLIENT_ID=你的Client ID REACT_APP_CLIENT_SECRET=你的Client Secret REACT_APP_REDIRECT_URI=http://localhost:3000/login 复制代码

步骤2:创建React应用

继续使用你的首选来创建你的react应用程序,在这个例子中,我们将使用Create-React-App。如果你使用这种模式,你必须删除index.css、App.css、App.test.js和serviceWorker.js等文件。编辑index.js,确保它看起来像这样:

import React from 'react'; import ReactDOM from 'react-dom'; import App from './App'; ReactDOM.render(<App />, document.getElementById('root')); 复制代码

另外,编辑App.js,确保它看起来像这样:

import React, { createContext, useReducer } from 'react'; import { BrowserRouter as Router, Route, Switch } from "react-router-dom"; import Home from "./components/Home"; import Login from "./components/Login"; import { initialState, reducer } from "./store/reducer"; export const AuthContext = createContext(); function App() {   const [state, dispatch] = useReducer(reducer, initialState);   return (     <AuthContext.Provider       value={{         state,         dispatch       }}     >     <Router>       <Switch>         <Route path="/login" component={Login}/>         <Route path="/" component={Home}/>       </Switch>     </Router>     </AuthContext.Provider>   ); } export default App; 复制代码

在App.js文件中,导入2个组件(Home.jsLogin.js )。要创建这2个组件,进入src文件夹,创建一个名为component的文件夹,里面有2个文件(Home.js和Login.js)。在根文件夹中,你可以在下面运行此命令来创建它们。

mkdir -p src/components && cd src/components && touch Home.js Login.js 复制代码

接下来,你会观察到,我们从store导入了状态和reducer,继续并设置一个简单的store,它将保持应用程序状态。要做到这一点,导航到src文件夹中,并创建一个名为store的文件夹,在它里面创建一个名为reducer的子文件夹,并在reducer文件夹里面创建一个index.js文件。在根目录下,你可以运行下面这个命令来创建它们。

mkdir -p src/store/reducer && cd src/store/reducer && touch index.js 复制代码

Store中index.js文件的内容应如下所示。

export const initialState = {   isLoggedIn: JSON.parse(localStorage.getItem("isLoggedIn")) || false,   user: JSON.parse(localStorage.getItem("user")) || null,   client_id: process.env.REACT_APP_CLIENT_ID,   redirect_uri: process.env.REACT_APP_REDIRECT_URI,   client_secret: process.env.REACT_APP_CLIENT_SECRET,   proxy_url: process.env.REACT_APP_PROXY_URL }; export const reducer = (state, action) => {   switch (action.type) {     case "LOGIN": {       localStorage.setItem("isLoggedIn", JSON.stringify(action.payload.isLoggedIn))       localStorage.setItem("user", JSON.stringify(action.payload.user))       console.log(action.payload.isLoggedIn)       return {         ...state,         isLoggedIn: action.payload.isLoggedIn,         user: action.payload.user       };     }     case "LOGOUT": {       localStorage.clear()       return {         ...state,         isLoggedIn: false,         user: null       };     }     default:       return state;   } }; 复制代码

它包含InitialState对象和一个reducer函数,该函数包含派发的动作以突变状态。

这时,我们就可以在我们的组件上下功夫了。让我们在Login.js上工作,这将是一个简单的组件,它有一个按钮,可以触发Github API的登录请求。


作者:杭州程序员张张
链接:https://juejin.cn/post/6909387010185232398
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


打赏

好文章,更需要你的鼓励

免责声明:本文转载至互联网,不代表本站的观点和立场。

浏览次数:7 次浏览

发布时间:2020-12-25 12:30:15

本文链接:http://pay.21stf.org/show-80.html