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?
fuente
this.context
con múltiples contextos dentro del mismo componente? Supongamos que tengo un componente que necesita acceder a UserContext y PostContext, ¿cómo manejar eso? Lo que puedo ver es crear un contexto mezclando ambos, pero ¿esa es la única o mejor solución para esto?Ok, encontré una manera de hacer esto con una limitación. Con la
with-context
biblioteca logré insertar todos los datos de mi consumidor en los accesorios de mis componentes.Pero, para insertar más de un consumidor en el mismo componente es complicado de hacer, hay que crear consumidores mixtos con esta biblioteca, lo que hace que el código no sea elegante ni productivo.
El enlace a esta biblioteca: https://github.com/SunHuawei/with-context
EDITAR: En realidad, no necesita usar la API de contexto múltiple que
with-context
proporciona, de hecho, puede usar la API simple y hacer un decorador para cada uno de sus contextos y si desea usar más de un consumidor en su componente, solo ¡declara por encima de tu clase tantos decoradores como quieras!fuente
Por mi parte fue suficiente agregar
.bind(this)
al evento. Así es como se ve mi componente.// Stores File class RootStore { //...States, etc } const myRootContext = React.createContext(new RootStore()) export default myRootContext; // In Component class MyComp extends Component { static contextType = myRootContext; doSomething() { console.log() } render() { return <button onClick={this.doSomething.bind(this)}></button> } }
fuente
Debe pasar el contexto en el componente principal superior para obtener acceso como accesorios en el niño.
fuente