【发布时间】:2019-02-10 17:34:52
【问题描述】:
我试图理解一个使用上下文 api 的高阶组件的示例,使用 here。
由于我对反应和函数式编程还很陌生,所以我不明白这里的实际情况如何。我们正在向函数withUser 发送一个函数,该函数返回另一个接收props 的函数。
function withUser(Component) {
return function ConnectedComponent(props) {
return (
<UserContext.Consumer>
{user => <Component {...props} user={user} />}
</UserContext.Consumer>
);
};
}
所以,当我们创建UserAvatar 时,我们传递接收props 并返回img 的函数。
const UserAvatar = withUser(({ user, size }) => (
<img
className={`user-avatar ${size || ""}`}
alt="user avatar"
src={user.avatar}
/>
));
所以,基本上在这之后我们可以想象UserAvatar 是:
const UserAvatar = props => {
return (
<UserContext.Consumer>
{user => <Component {...props} user={user} />}
</UserContext.Consumer>
);
};
Component 在哪里:
({ user, size }) => (
<img
className={`user-avatar ${size || ""}`}
alt="user avatar"
src={user.avatar}
/>
)
我希望到目前为止这是正确的,但是我不明白的是这一行:
{user => <Component {...props} user={user} />}
当我们已经拥有props 并且正在将user 从UserStats 组件向下传递给UserAvatar 组件时,为什么我们需要将其作为函数而不只是返回组件?
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>
);
【问题讨论】:
-
UserAvatar 是父组件。 UserStats 不知道 UserAvatar 存在。 UserAvatar 需要知道传递了哪些组件,以便渲染子道具。 props 被传递给 UserAvatar,因为它是控制模块。
标签: reactjs functional-programming higher-order-components react-context