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 componentDidMountminha 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 componentDidMountvez de chamar em render?
Só para exemplificar, veja este código:
Vamos supor que estou envolvendo tudo Providersem 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 getUsersadereços não residem em meus usuários. Qual é a maneira certa de fazer isso, se isso for possível?