是否可以验证 React 的 Context API 和 Hooks 是否有 Context API? Criando novo projeto Criando Contexto Extras

2025-06-07

验证 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


Enter fullscreen mode Exit fullscreen mode

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


Enter fullscreen mode Exit fullscreen mode

使用 Typescript 和 mim,可以精确安装该库中的类型定义,这些定义取决于命令的开发步骤:



$ yarn add @types/react-router-dom -D


Enter fullscreen mode Exit fullscreen mode

应用程序页面

您可以继续安装 Podemos,然后在 2个意大利面以外的地方使用意大利面,src在其中添加一个应用程序页面。 Por enquanto estamos assim:pagesLoginHomeindex.tsx

替代文本

您可以快速阅读教程,然后将其作为页面进行操作,很快就能完成! Em nossa página Home vamos criar um componente contro somente um h1com o nome da página:



import React from 'react';

const Home: React.FC = () => {
 return (
   <div>
     <h1>Home</h1>
   </div>
 );
};

export default Home;



Enter fullscreen mode Exit fullscreen mode

在登录页面,您可以通过以下方式获得响应:



import React from 'react';

const Login: React.FC = () => {
 function handleLogin() {}

 return (
   <div>
     <button onClick={handleLogin}>Login</button>
   </div>
 );
};

export default Login;


Enter fullscreen mode Exit fullscreen mode

应用列表

com 作为页面,vamos agora criar 作为 rotas da nossa aplicação。最初的 vamos crariar,dentro de src,uma 意大利面routesonde 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;


Enter fullscreen mode Exit fullscreen mode

Vamos fazer o mesmo para nosso OtherRoutes.tsxmas 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;


Enter fullscreen mode Exit fullscreen mode

Agora em nosso index.tsx, ainda na pasta, routesvamos 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;


Enter fullscreen mode Exit fullscreen mode

Agora em nosso App.tsxna raiz do nosso projeto importaremos nossas Rotas, assim:



import React from 'react';
import Routes from './routes';

function App() {
 return <Routes />;
}

export default App;


Enter fullscreen mode Exit fullscreen mode

如果您不想yarn start使用终端机,请登录登录页面:

替代文本

上下文创建

作为即将到来的应用程序的基础,我们可以使用 React 上下文来了解“全局”和真实性。 Para isso dentro do nosso srcvamos criar uma Pasta contextscom um arquivo auth.tsx:

替代文本

auth.tsxReact 的重要内容createContext和各种变量的导出内容,以及相关的上下文AuthContext



import React, { createContext } from 'react';

const AuthContext = createContext({});

export default AuthContext;


Enter fullscreen mode Exit fullscreen mode

Em nosso App.tsxvamos importar esse AuthContexte circundar nossas rotas com o Provider do nosso Contexto passando uma propriedade valuecom um object contro signed: true, da seguinte forma:



import AuthContext from './contexts/auth';

function App() {
 return (
   <AuthContext.Provider value={{signed: true}}>
     <Routes />
   </AuthContext.Provider>
 );
}


Enter fullscreen mode Exit fullscreen mode

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);
...


Enter fullscreen mode Exit fullscreen mode

控制台日志:

替代文本

您已签署了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;


Enter fullscreen mode Exit fullscreen mode

Agora Podemos 重要的供应商、主要功能或App.tsx功能的改变:



...
import { AuthProvider } from './contexts/auth';

function App() {
 return (
   <AuthProvider>
     <Routes />
   </AuthProvider>
 );
}
...


Enter fullscreen mode Exit fullscreen mode

Fazendo 作为 API

使用Axios来实现 API 的要求。请安装 axios 包:



yarn add axios


Enter fullscreen mode Exit fullscreen mode

Vamos criar uma 面食services和 arquivo api.tspara configurar o axios:



import axios from 'axios';

const api = axios.create({
 baseURL: 'https://localhost:3333',
});

export default api;


Enter fullscreen mode Exit fullscreen mode

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);
 }
...


Enter fullscreen mode Exit fullscreen mode

提供程序的其他组件的功能和附加值:



return (
   <AuthContext.Provider value={{ signed: true, Login }}>
...


Enter fullscreen mode Exit fullscreen mode

Criaremos também uma 界面可提供任何价值和帮助或提示或上下文:



interface AuthContextData {
 signed: boolean;
 Login(): Promise<void>;
}

const AuthContext = createContext<AuthContextData>({} as AuthContextData);


Enter fullscreen mode Exit fullscreen mode

任何登录方式都不需要登录和实现登录:



...
function handleLogin() {
   context.Login();
}
...


Enter fullscreen mode Exit fullscreen mode

Agora 没有登录功能,可响应登录请求,并确认控制台.log 中显示的内容:

替代文本

Precisamos Guardar os bados retornados pela API 和 algum lugar,para isso vamos criar um estado para nossouser和 vamos adicionar nosso tokenno 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}`
...


Enter fullscreen mode Exit fullscreen mode

用户可以通过提供者和用户签署相关信息:



...
return (
   <AuthContext.Provider value={{ signed: Boolean(user), user, Login }}>
     {children}
   </AuthContext.Provider>
 );
...


Enter fullscreen mode Exit fullscreen mode

使用打字稿的用户界面的使用说明AuthContextData



interface AuthContextData {
  signed: boolean;
  user: object | null;
  Login(): Promise<void>;
}


Enter fullscreen mode Exit fullscreen mode

修改为 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;


Enter fullscreen mode Exit fullscreen mode

很快,您就可以登录并查看功能并登录主页!

创建钩子 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;
}


Enter fullscreen mode Exit fullscreen mode

Agora Podemos mudar nas rotas 和 nossa página de Login onde utilizamos useContext(AuthContext)para:



import { useAuth } from '../../contexts/auth';
...
 const context = useAuth();
...


Enter fullscreen mode Exit fullscreen mode

最后,我们将确保您的真实性!


附加功能

无需存储

正常使用时请注意以下事项usertoken可以使用 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);
}
...


Enter fullscreen mode Exit fullscreen mode

恢复效果如下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}`;
    }
  }, []);
...


Enter fullscreen mode Exit fullscreen mode

注销功能

如果没有 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>
  );
...


Enter fullscreen mode Exit fullscreen mode

在主页上可以看到主页和应用程序的注销功能:



const Home: React.FC = () => {
  const { Logout } = useAuth();

  async function handleLogout() {
    Logout();
  }

  return (
    <div>
      <h1>Home</h1>
      <button onClick={handleLogout}>Logout</button>
    </div>
  );
};


Enter fullscreen mode Exit fullscreen mode

启动复杂的程序后,我们就可以轻松完成 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
PREV
使用 Jest 测试 JavaScript - 单元测试
NEXT
您接下来想学习哪些非编码技能?