Usando React API Context
import React from "react";
import ReactDOM from "react-dom";
import "./styles.css";
// Primero, crear un nuevo contexto.
// createContext devuelve un objeto con 2 propiedades:
// { Provider, Consumer }
const UserContext = React.createContext();
// Los componentes que necesitan los datos pueden aprovechar el contexto
// renderizando al Consumer. Se utiliza el patrón "render props"
// -- renderizando de una función como hijo
const UserAvatar = ({ size }) => (
<UserContext.Consumer>
{user => (
<img
className={`user-avatar ${size || ""}`}
alt="user avatar"
src={user.avatar}
/>
)}
</UserContext.Consumer>
);
// Ya no se necesita la prop 'user'
// El Consumer recupera user del contexto
const UserStats = () => (
<UserContext.Consumer>
{user => (
<div className="user-stats" >
<div>
<UserAvatar user={user} />
{user.name}
</div>
<div className="stats" >
<div> {user.followers} Followers </div>
<div> Following {user.following} </div>
</div>
</div>
)}
</UserContext.Consumer>
);
// Los componentes que una vez tuvieron que lanzar la prop `user`
// ahora son más agradables y simples.
const Nav = () => (
<div className="nav" >
<UserAvatar size="small" />
</div>
);
const Content = () => (
<div className="content" >
main content here
</div>
);
const Sidebar = () => (
<div className="sidebar" >
<UserStats />
</div>
);
const Body = () => (
<div className="body" >
<Sidebar />
<Content />
</div>
);
// Dentro de App, se pone a disposición el contexto
// usando el Provider
class App extends React.Component {
state = {
user: {
avatar: "https://www.gravatar.com/avatar/763dcd4dad38689d57aa9d83a60bfaa5",
name: "Zero",
followers: 1234,
following: 123
}
};
render() {
return (
<div className="app" >
<UserContext.Provider value={this.state.user} >
<Nav />
<Body />
</UserContext.Provider>
</div>
);
}
}
ReactDOM.render(
<App />,
document.querySelector('#root')
);Provider y Consumer son pareja
Context no mantiene estado
Valor predeterminado
Última actualización