验证 React com Context API 和 Hooks
什么是 Context API?
创建新项目
上下文创建
附加功能
什么是 Context API?
一个 Context API,用于管理所有组件的操作,以及所有操作中的操作手册。 Algo como o que o Redux faz criando e gerenciando um estado global, Included o prio Redux utiliza Context API por debaixo dos panos.
可以使用该功能和使用简单的操作底座的项目,来验证在嵌套柱上的使用情况。
创建新项目
首先开始编写 ReactJS com Typescript 文档(在教程中使用 Typescript 并忽略其提示),然后在终端上执行命令:
$ npx create-react-app authapp --template typescript
com o projeto criado e aberto no seu editor prereferido vamos começar apagando todos os arquivos que o React criaautomaticamente, ficando com a seguinte estrutura:
Lembre-se de apagar 作为 linhas de código que dependentiam dos arquivos deletados!
Agora vamos 安装了 uma lib 和激光雷达 com 作为旋转应用程序,并提供了使用React Router 的教程。后续命令的安装步骤:
$ yarn add react-router-dom
使用 Typescript 和 mim,可以精确安装该库中的类型定义,这些定义取决于命令的开发步骤:
$ yarn add @types/react-router-dom -D
应用程序页面
您可以继续安装 Podemos,然后在 2个意大利面以外的地方使用意大利面,并src
在其中添加一个应用程序页面。 Por enquanto estamos assim:pages
Login
Home
index.tsx
您可以快速阅读教程,然后将其作为页面进行操作,很快就能完成! Em nossa página Home vamos criar um componente contro somente um h1
com o nome da página:
import React from 'react';
const Home: React.FC = () => {
return (
<div>
<h1>Home</h1>
</div>
);
};
export default Home;
在登录页面,您可以通过以下方式获得响应:
import React from 'react';
const Login: React.FC = () => {
function handleLogin() {}
return (
<div>
<button onClick={handleLogin}>Login</button>
</div>
);
};
export default Login;
应用列表
com 作为页面,vamos agora criar 作为 rotas da nossa aplicação。最初的 vamos crariar,dentro de src
,uma 意大利面routes
onde vamos crariar os que serão nossa rotas。
请参阅本教程,以了解如何使用您的身份验证功能,例如登录、注册等,以及如何使用您的身份验证功能。 Ficando com a seguinte estrutura:
无需在登录页面上SignRoutes.tsx
查看 React Router 的文档。
import React from 'react';
import { BrowserRouter, Route } from 'react-router-dom';
import Login from '../pages/Login';
const SignRoutes: React.FC = () => {
return (
<BrowserRouter>
<Route path="/" component={Login} />
</BrowserRouter>
);
};
export default SignRoutes;
Vamos fazer o mesmo para nosso OtherRoutes.tsx
mas dessa vez utilizando nossa página 主页:
import React from 'react';
import { BrowserRouter, Route } from 'react-router-dom';
import Home from '../pages/Home';
const OtherRoutes: React.FC = () => {
return (
<BrowserRouter>
<Route path="/" component={Home} />
</BrowserRouter>
);
};
export default OtherRoutes;
Agora em nosso index.tsx
, ainda na pasta, routes
vamos importar nossas rotas e por enquanto retornar somente nossa rota de Login:
import React from 'react';
import SignRoutes from './SignRoutes';
import OtherRoutes from './OtherRoutes';
const Routes: React.FC = () => {
return <SignRoutes />;
};
export default Routes;
Agora em nosso App.tsx
na raiz do nosso projeto importaremos nossas Rotas, assim:
import React from 'react';
import Routes from './routes';
function App() {
return <Routes />;
}
export default App;
如果您不想yarn start
使用终端机,请登录登录页面:
上下文创建
作为即将到来的应用程序的基础,我们可以使用 React 上下文来了解“全局”和真实性。 Para isso dentro do nosso src
vamos criar uma Pasta contexts
com um arquivo auth.tsx
:
auth.tsx
React 的重要内容createContext
和各种变量的导出内容,以及相关的上下文AuthContext
:
import React, { createContext } from 'react';
const AuthContext = createContext({});
export default AuthContext;
Em nosso App.tsx
vamos importar esse AuthContext
e circundar nossas rotas com o Provider do nosso Contexto passando uma propriedade value
com um object contro signed: true
, da seguinte forma:
import AuthContext from './contexts/auth';
function App() {
return (
<AuthContext.Provider value={{signed: true}}>
<Routes />
</AuthContext.Provider>
);
}
Agora se em nossa página de Login Buscarmos esse Contexto e dermos um console.log Teremos a seguinte resposta:
import React, { useContext } from 'react';
import AuthContext from '../../contexts/auth';
const Login: React.FC = () => {
const context = useContext(AuthContext);
console.log(context);
...
控制台日志:
您已签署了envado nosso App.tsx pode ser recuperado dentro do nosso componente!
Criando 提供商
重要的是,它是激光雷达的上下文和实现工具,也是激光雷达的验证工具,也是我们的auth.tsx
出口设备的提供者。
const AuthContext = createContext({});
...
export const AuthProvider: React.FC = ({ children }) => {
return (
<AuthContext.Provider value={{ signed: true }}>
{children}
</AuthContext.Provider>
);
};
...
export default AuthContext;
Agora Podemos 重要的供应商、主要功能或App.tsx
功能的改变:
...
import { AuthProvider } from './contexts/auth';
function App() {
return (
<AuthProvider>
<Routes />
</AuthProvider>
);
}
...
Fazendo 作为 API
使用Axios来实现 API 的要求。请安装 axios 包:
yarn add axios
Vamos criar uma 面食services
和 arquivo api.ts
para configurar o axios:
import axios from 'axios';
const api = axios.create({
baseURL: 'https://localhost:3333',
});
export default api;
com o axios configurado vamos criar uma função para fazer a chamada a api dentro do nosso arquivo auth.tsx
:
...
import api from '../services/api';
...
export const AuthProvider: React.FC = ({ children }) => {
...
async function Login() {
const response = await api.post('/login', {
email: 'example@email.com',
password: '123456',
});
console.log(response);
}
...
提供程序的其他组件的功能和附加值:
return (
<AuthContext.Provider value={{ signed: true, Login }}>
...
Criaremos também uma 界面可提供任何价值和帮助或提示或上下文:
interface AuthContextData {
signed: boolean;
Login(): Promise<void>;
}
const AuthContext = createContext<AuthContextData>({} as AuthContextData);
任何登录方式都不需要登录和实现登录:
...
function handleLogin() {
context.Login();
}
...
Agora 没有登录功能,可响应登录请求,并确认控制台.log 中显示的内容:
Precisamos Guardar os bados retornados pela API 和 algum lugar,para isso vamos criar um estado para nossouser
和 vamos adicionar nosso token
no header das nossas chamadas pelo axios:
...
const [user, setUser] = useState<object | null>(null);
...
async function Login() {
...
setUser(response.data.user);
api.defaults.headers.Authorization = `Bearer ${response.data.token}`
...
用户可以通过提供者和用户签署相关信息:
...
return (
<AuthContext.Provider value={{ signed: Boolean(user), user, Login }}>
{children}
</AuthContext.Provider>
);
...
使用打字稿的用户界面的使用说明AuthContextData
:
interface AuthContextData {
signed: boolean;
user: object | null;
Login(): Promise<void>;
}
修改为 Rotas
最后,我们将讨论如何轮换index.tsx
或使用哪些轮换:
import React, { useContext } from 'react';
import AuthContext from '../contexts/auth';
import SignRoutes from './SignRoutes';
import OtherRoutes from './OtherRoutes';
const Routes: React.FC = () => {
const { signed } = useContext(AuthContext);
return signed ? <OtherRoutes /> : <SignRoutes />;
};
export default Routes;
很快,您就可以登录并查看功能并登录主页!
创建钩子 useAuth
Podemos criar um hook individualizado para facilitar or uso do nosso contexto, para isso vamos exportar uma função chamada useAuth do nosso arquivo auth.tsx
, que cria nosso contexto com useContext
, e remover nosso export default de AuthContext:
export function useAuth(){
const context = useContext(AuthContext);
return context;
}
Agora Podemos mudar nas rotas 和 nossa página de Login onde utilizamos useContext(AuthContext)
para:
import { useAuth } from '../../contexts/auth';
...
const context = useAuth();
...
最后,我们将确保您的真实性!
附加功能
无需存储
正常使用时请注意以下事项user
。token
可以使用 SessionStorage 或 LocalStorage、Web、AsyncStorage或 React Native。
登录的功能如下auth.tsx
:
async function Login(){
...
localStorage.setItem('@App:user', JSON.stringify(response.data.user));
localStorage.setItem('@App:token', response.data.token);
}
...
恢复效果如下AuthProvider
:
...
export const AuthProvider: React.FC = ({ children }) => {
...
useEffect(() => {
const storagedUser = localStorage.getItem('@App:user');
const storagedToken = localStorage.getItem('@App:token');
if (storagedToken && storagedUser) {
setUser(JSON.parse(storagedUser));
api.defaults.headers.Authorization = `Bearer ${storagedToken}`;
}
}, []);
...
注销功能
如果没有 localStorage,则无法注销应用程序,因此无法使用 Provider 来auth.tsx
删除本地存储中的项目:
...
interface AuthContextData {
signed: boolean;
user: object | null;
Login(user: object): Promise<void>;
Logout(): void;
}
...
export const AuthProvider: React.FC = ({ children }) => {
...
function Logout() {
setUser(null);
sessionStorage.removeItem('@App:user');
sessionStorage.removeItem('App:token');
}
return (
<AuthContext.Provider
value={{ signed: Boolean(user), user, Login, Logout }}
>
{children}
</AuthContext.Provider>
);
...
在主页上可以看到主页和应用程序的注销功能:
const Home: React.FC = () => {
const { Logout } = useAuth();
async function handleLogout() {
Logout();
}
return (
<div>
<h1>Home</h1>
<button onClick={handleLogout}>Logout</button>
</div>
);
};
启动复杂的程序后,我们就可以轻松完成 Redux 和功能! O que achou?
与 Github 相关的所有操作:https://github.com/rafacdomin/Auth-React-ContextAPI
字体:https://www.youtube.com/watch?v= KISMYYXSIX8
文章来源:https://dev.to/rafacdomin/autenticacao-no-react-com-context-api-e-hooks-4bia