- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在学习 React。在我看来,HOC 就像下面这个来自 React 官方的例子 docs :
function withSubscription(WrappedComponent, selectData) {
// ...and returns another component...
return class extends React.Component {
constructor(props) {
super(props);
this.handleChange = this.handleChange.bind(this);
this.state = {
data: selectData(DataSource, props)
};
}
componentDidMount() {
// ... that takes care of the subscription...
DataSource.addChangeListener(this.handleChange);
}
componentWillUnmount() {
DataSource.removeChangeListener(this.handleChange);
}
handleChange() {
this.setState({
data: selectData(DataSource, this.props)
});
}
render() {
// ... and renders the wrapped component with the fresh data!
// Notice that we pass through any additional props
return <WrappedComponent data={this.state.data} {...this.props} />;
}
};
}
可以这样改写:
class WithSubscription extends React.Component {
constructor({ component, selectData, ...props }) {
super(props);
this.handleChange = this.handleChange.bind(this);
this.state = {
data: selectData(DataSource, props)
};
}
componentDidMount() {
DataSource.addChangeListener(this.handleChange);
}
componentWillUnmount() {
DataSource.removeChangeListener(this.handleChange);
}
handleChange() {
this.setState({
data: selectData(DataSource, this.props)
});
}
render() {
return <component data={this.state.data} {...this.props} />;
}
}
然后像这样使用它:
<WithSubscription component={BlogPost} selectData={(DataSource) => DataSource.getComments()} />
它们都是 HOC 吗?什么时候一种风格比另一种更受欢迎?
最佳答案
一开始我也在为 HOC 苦苦挣扎。另一种看待这个问题的方法是查看组件的包装器,您可以使用它来将功能与一个组件隔离开来。
比如我有多个HOC。我有许多仅由 props 定义的组件,它们一旦创建就不可更改。
然后我有一个 Loader HOC 组件,它处理所有网络连接,然后将 props 传递给任何正在包装的组件(这将是您传递给 HOC 的组件)。
加载器并不真正关心它正在渲染哪个组件,它只需要获取数据,并将其传递给包装的组件。
在您的示例中,您实际上可以完成相同的操作,但是一旦您需要链接多个 HOC,它就会变得更加复杂。
例如我有这个 HOC 链:
PermissionsHOC -> LoaderHOC -> BorderLayoutHOC -> 组件
第一个可以检查您的权限,第二个可以加载数据,第三个可以提供通用布局,第四个是实际组件。
如果您意识到某些组件会受益于在父级上具有通用逻辑,那么检测 HOC 会容易得多。您可以在示例中执行相同的操作,但是每次添加子组件时都需要修改 HOC,以添加该子组件的逻辑。不是很有效。这样,您可以轻松添加新组件。我确实有一个每个组件都扩展的 Base 组件,但我用它来处理辅助功能,例如分析、记录器、处理错误等。
关于javascript - React - 高阶组件应该写成一个函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48351868/
在 Erlang 中,使用 =>要比较两个变量会导致语法错误,您必须使用 >=反而: 1> 10 => 5. * 1: syntax error before: '>' 2> 10 >= 5. tru
在少数情况下,日期写为“created ca.”。 1858-60',人类读者会将其理解为“约 1858-1860 年创建”。 因此,想象两个代表年的整数。 a = 1858 b = 60 我希望能够
是否可以用经典的 asp 写出我得到的带有字母的输出整数? 例如,如果我的结果是 5,我想输出“五” 或者如果是二十,我需要它显示“二十” 结果可能是无限的,因此编写一个用于查找目的的数组是行不通的。
这就是我正在做的,我读取了一个 .mp3 文件,以这种方式将其转换为 Base64String: using (fileStream) {
是否有任何算法可以找出有多少种方法可以写出一个数字,例如 n ,其总和为 2 ? 例如:对于 4 有四种方法: 4 = 4 4 = 2 + 2 4 = 1 + 1 + 1 + 1 4 = 2 + 1
我正在尝试 transform()一个Dataset在 Java 中如下所示: Function1,Dataset> withDoubled = (Dataset numbers) -> number
这个问题在这里已经有了答案: Convert integer to hexadecimal and back again (11 个答案) 关闭 7 年前。 在 c# 中,我将错误代码定义为 pub
如何使用 Flink 将 DataSet 作为 Parquet 文件写入 s3 bucket。是否有像 spark 这样的直接函数:DF.write.parquet("write in parquet
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 关闭 3 年前。 Improve
在CLRS中,作者通过以下伪代码介绍了红黑树中的旋转操作: LEFT-ROTATE(T, x) y = x.right # Line 1 x.right = y.left
我是一名优秀的程序员,十分优秀!