1
resposta

Alguém sabe me dizer como usar um provider com ContextAPI para duas rotas diferentes no react-router-dom versão >=6?

Alguém sabe me dizer como usar um provider com ContextAPI para duas rotas diferentes no react-dom-routes versão >=6?

No curso React: gerenciamento de estados globais com ContextAPI é usado a versão ~5 do react-router-dom mas gostaria de saber como fazer na versão 6.

Já consultei a documentação e ficaria assim:

<Route path="/" element={<UserProvider />}>
    <Route index element={<Login />} />
    <Route path="feira" element={<Feira />} />
</Route>

Porém não deu certo. O provider precisa receber as páginas como children mas se não me engano na forma da documentação o element é passado como um componente.

Para fazer para apenas uma rota está assim:

<Route
    path="/" 
    element={
        <UserProvider>
            <Login />
        </UserProvider>
    }
/>

Na versão 5 é só subir o UserProvider de nivel deixando assim:

<UserProvider>
    <Route path="/" element={<Login />} />
    <Route path="/feira" element={<Feira />} />
</UserProvider>

Já na versão 6 é diferente.

Alguém sabe me dizer como funciona na versão 6?

1 resposta

E aí, Paulo!

A partir da versão 6 do React Router Dom, você pode fornecer o contexto para sua aplicação aplicando um Wrapper Provider em suas rotas, ou seja envelopando seu app com o provider, veja os exemplos:

// Envelopando através do main.js
ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render(
  <React.StrictMode>
    <DataContextProvider> // Provider
      <BrowserRouter>
        <App />
      </BrowserRouter>
    </DataContextProvider>
  </React.StrictMode>
)

// Envelopando no app.js
return (
    <DataContextProvider> // Provider
      <Header props={(key, setKey)} />
      <Router>
      <Routes>
        <Route path="/" element={<Dashboard />} />
        <Route path="/dashboard" element={<Dashboard />} />
        <Route path="/configuration" element={<Configuration />} />
      </Routes>
      </Router>
    </DataContextProvider>
  );

Concluindo, suas rotas devem estar dentro do contexto UserProvider, assim será necessário envelopar o componente de mais alto nível na hierarquia do React Router Dom, que no caso seria o componente Routes ou BrowserRouter com seu UserProvider.

Ps.: Os dados ficarão disponíveis para toda aplicação, mas apenas o componente que acessar os dados do provedor é que vai de fato ter estes dados para si, então se não me engano não afeta a performance. Estou levantando este adendo pois pode parecer que todas as rotas possuiriam os dados, mas todas possuem o acesso aos dados.

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