Estoy desarrollando una nueva aplicación usando la nueva API de React Context en lugar de Redux, y antes, Reduxcuando necesitaba obtener una lista de usuarios, por ejemplo, simplemente llamo a componentDidMountmi acción, pero ahora con React Context, mis acciones viven dentro my Consumer que está dentro de mi función de renderizado, lo que significa que cada vez que se llame a mi función de renderizado, llamará a mi acción para obtener mi lista de usuarios y eso no es bueno porque haré muchas solicitudes innecesarias.
Entonces, ¿cómo puedo llamar solo una vez a mi acción, como en en componentDidMountlugar de llamar a render?
Solo para ejemplificar, mire este código:
Supongamos que estoy envolviendo todo mi Providersen un componente, así:
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>
)
}
}
Luego puse este componente de proveedor envolviendo toda mi aplicación, así:
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>
)
}
}
Ahora, en la vista de mis usuarios, por ejemplo, será algo como esto:
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>
)
}
}
Lo que quiero es esto:
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>
)
}
}
Pero, por supuesto, el ejemplo anterior no funciona porque getUsersno viven en los accesorios de vista de mis usuarios. ¿Cuál es la forma correcta de hacerlo si es posible?