Estou desenvolvendo um novo aplicativo usando a nova API React Context em vez de Redux, e antes, com Redux
, quando preciso obter uma lista de usuários, por exemplo, simplesmente chamo componentDidMount
minha ação, mas agora com React Context, minhas ações ficam dentro my Consumer que está dentro da minha função de renderização, o que significa que toda vez que minha função de renderização for chamada, ela chamará minha ação para obter minha lista de usuários e isso não é bom porque estarei fazendo muitas solicitações desnecessárias.
Então, como posso chamar apenas uma vez minha ação, como em em componentDidMount
vez de chamar em render?
Só para exemplificar, veja este código:
Vamos supor que estou envolvendo tudo Providers
em um único componente, assim:
import React from 'react';
import UserProvider from './UserProvider';
import PostProvider from './PostProvider';
export default class Provider extends React.Component {
render(){
return(
<UserProvider>
<PostProvider>
{this.props.children}
</PostProvider>
</UserProvider>
)
}
}
Então eu coloco esse componente Provider envolvendo todo o meu aplicativo, assim:
import React from 'react';
import Provider from './providers/Provider';
import { Router } from './Router';
export default class App extends React.Component {
render() {
const Component = Router();
return(
<Provider>
<Component />
</Provider>
)
}
}
Agora, na minha visualização de usuários, por exemplo, será algo assim:
import React from 'react';
import UserContext from '../contexts/UserContext';
export default class Users extends React.Component {
render(){
return(
<UserContext.Consumer>
{({getUsers, users}) => {
getUsers();
return(
<h1>Users</h1>
<ul>
{users.map(user) => (
<li>{user.name}</li>
)}
</ul>
)
}}
</UserContext.Consumer>
)
}
}
O que eu quero é isso:
import React from 'react';
import UserContext from '../contexts/UserContext';
export default class Users extends React.Component {
componentDidMount(){
this.props.getUsers();
}
render(){
return(
<UserContext.Consumer>
{({users}) => {
getUsers();
return(
<h1>Users</h1>
<ul>
{users.map(user) => (
<li>{user.name}</li>
)}
</ul>
)
}}
</UserContext.Consumer>
)
}
}
Mas é claro que o exemplo acima não funciona porque os getUsers
adereços não residem em meus usuários. Qual é a maneira certa de fazer isso, se isso for possível?