Estoy desarrollando una nueva aplicación usando la nueva API de React Context en lugar de Redux, y antes, Redux
cuando necesitaba obtener una lista de usuarios, por ejemplo, simplemente llamo a componentDidMount
mi 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 componentDidMount
lugar de llamar a render?
Solo para ejemplificar, mire este código:
Supongamos que estoy envolviendo todo mi Providers
en 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 getUsers
no viven en los accesorios de vista de mis usuarios. ¿Cuál es la forma correcta de hacerlo si es posible?