Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

[Dúvida] React Router v6 e criação de contextos

Antes, eu tinha criado 2 contextos como ensina nas aulas. Mas, na versão 6 do React Router eu não consegui fazer funcionar 2 Providers em meio aos Routes. Por exemplo, tentei fazer mais ou menos assim:

<BrowserRouter>
    <UsuarioProvider>
        <Routes>
            <Route path="/" element={<Login/>}/>
            <Route path="/feira" element={<Feira/>}/>
        </Routes>
    </UsuarioProvider>
</BrowserRouter>

Nesse caso, como tínhamos apenas 1 provider estava funcionando. Mas, a partir do momento que tivemos que criar o contexto do carrinho, eu não consegui englobar um outro Provider aí em cima, sempre dava algum erro ou não renderizava. Pesquisei na internet e não encontrei nenhuma alternativa para o meu problema, então resolvi criar apenas 1 contexto (renomeei para Context.js) e passar ele para as rotas da aplicação. Creio que só usufruirá dele, quem de fato instanciar com o useContext.

Context.js:

export const AppContext = createContext();

export const AppProvider = ({children}) => {
    const [nome, setNome] = useState('')
    const [saldo, setSaldo] = useState(0)
    const [carrinho, setCarrinho] = useState([]);
    return (
        <AppContext.Provider value={{carrinho, setCarrinho,nome,setNome,saldo,setSaldo}}>
            {children}
        </AppContext.Provider>
    )

}

routes.js:

const Router = () => {
  const router = createBrowserRouter([
    {
      path: "/",
      element: <Login />,
    },
    {
      path: "/feira",
      element: <Feira />,
    },
    {
      path: "/carrinho",
      element: <Carrinho />,
    },
  ]);
  return (
    <AppProvider>
      <RouterProvider router={router}/>
    </AppProvider>
  );
};

Não sei se essa abordagem está correta, e nem sei quais os futuros problemas que ela pode gerar, mas gostaria que alguém me explicasse como fazer com 2 contextos (2 providers)

2 respostas
solução!

Olá, Mauricio.

Tudo bem?

A abordagem que você adotou, criando um único contexto que engloba todas as informações necessárias, é uma solução válida. Ao utilizar o useContext nos componentes que precisam acessar essas informações, você consegue utilizar o contexto de forma eficiente.

No entanto, se você deseja utilizar dois providers de contexto separadamente, é possível fazer isso utilizando o componente RouterProvider do React Router v6. Você pode envolver cada provider de contexto com um RouterProvider, como no exemplo abaixo:

const Router = () => {
  const router = createBrowserRouter([
    {
      path: "/",
      element: <Login />,
    },
    {
      path: "/feira",
      element: <Feira />,
    },
    {
      path: "/carrinho",
      element: <Carrinho />,
    },
  ]);
  return (
    <UsuarioProvider>
      <CarrinhoProvider>
        <RouterProvider router={router} />
      </CarrinhoProvider>
    </UsuarioProvider>
  );
};

Dessa forma, você pode utilizar dois providers de contexto separadamente e cada um será aplicado apenas nas rotas específicas em que são necessários.

Espero ter ajudado! Bons estudos!

Oi, Renan! Tudo ótimo. Muito obrigado pela resposta. Nesse caso, como o RouterProvider é filho dos 2 providers de contexto, todas as rotas da aplicação poderão utilizar os values passados, caso eu os importasse e instaciasse o useContext, né? Existiria alguma diferença de utilização para além da divisão de responsabilidades. Entre o que eu havia feito e desse outro jeito? Algum impacto em performance ou algo do tipo?

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software