console
const DEFAULTTHEMESTYLE = {
display: "inline-block",
color: "green",
backgroundColor: "#d7d7d7",
padding: "20px"
};
const UserSelectedStyle = React.createContext(null);
function useGetUserData(visible) {
const [userData, setUserData] = React.useState({});
const [loading, setLoading] = React.useState(false);
React.useEffect(() => {
if (!visible) return;
setLoading(true);
fetch("https://randomuser.me/api/")
.then(res => res.json())
.then(response => {
setUserData(response.results[0]);
setLoading(false);
})
.catch(err => setLoading(false));
}, [visible])
return { userData, loading };
}
function RenderUserInfo(props) {
const { userData, loading } = useGetUserData(props.visible);
if (!props.visible) return null;
return (
<div className="modal">
{
loading ? (<span>loading .....</span>) : (
<ul>
<li>Name: {`${(userData.name || {}).first} ${(userData.name || {}).last}`}</li>
<li>Gender: {userData.gender}</li>
<li>Phone: {userData.phone}</li>
</ul>
)
}
</div>
)
}
function Example() {
const [visible, setVisible] = React.useState(false);
function handleToggleModal() {
setVisible(!visible);
};
return (
<UserSelectedStyle.Consumer>
{value => (
<div className="wrap">
<h3>Home</h3>
<span style={value}>visible: {visible ? 'true' : 'false'}</span><br />
<button type="button" onClick={handleToggleModal}>toggle modal</button>
<RenderUserInfo visible={visible} />
</div>
)}
</UserSelectedStyle.Consumer>
)
}
ReactDOM.render(
<UserSelectedStyle.Provider value={DEFAULTTHEMESTYLE}>
<Example />
</UserSelectedStyle.Provider >,
document.querySelector("#root")
)
<!doctype html>
<html>
<head>
<title>React Hooks Demo</title>
</head>
<body>
<div id="root"></div>
</body>
</html>