HOC 的正确方法?
HOC the right way?
我错误地编写了两个版本的 HOC 实现,但它没有给我任何错误并且按预期工作,所以我希望有人能够向我解释差异。 requireAuth
是高阶分量
首先我有一个组件如下
import requireAuth from 'somepath';
class App extends Component {
...
}
export default connect(null, actions)(requireAuth(App));
下面是我的requireAuth
import React, { Component } from 'react';
import { connect } from 'react-redux';
export default (ChildComponent) => {
class ComposedComponent extends Component {
...
render() {
return <ChildComponent {...this.props}/>;
}
}
function mapStatetoProps(state) {
return { someProp: state.someState };
}
return connect(mapStateToProps)(ComposedComponent);
};
下面是我错误的另一个版本,但没有错误,如果有任何不同,我正在寻找一些解释:
import requireAuth from 'somepath';
class App extends Component {
...
}
export default requireAuth(connect(null, actions)(App));//<<=== use requireAuth to surround the whole connect statement instead
下面是 requireAuth
:
import React, { Component } from 'react';
import { connect } from 'react-redux';
export default (ChildComponent) => {
class ComposedComponent extends Component {
...
render() {
return <ChildComponent />; //<<<======without {...this.props}
}
}
function mapStatetoProps(state) {
return { someProp: state.someState };
}
return connect(mapStateToProps)(ComposedComponent);
};
使用 HOC 需要牢记的第一件事是,任何包装在 HOC 中的反应组件仍然会产生反应组件。
第一种情况:
connect(null, actions)(requireAuth(App));
将为 requireAuth
提供 redux 道具。它将其道具传递给 App
组件。所以 App 组件仍然从 redux 获取所有的 props。据我所知,它是有效的。
对于第二种情况:
requireAuth(connect(null, actions)(App))
您正在将 connect(null,actions)(App)
作为子组件传递给 requireAuth
组件。并且只渲染子组件 return <ChildComponent />
。因为 App
组件仍然被 connect
包裹着。 App
组件仍将具有执行所需的所有 redux 道具。所以渲染 ChildComponent
没有道具仍然有效。
并且从 return { someProp: state.someState };
获得的道具仍然可用于 requireAuth
,因为 requireAuth
被包裹在另一个连接中,它将提供 requireAuth
来自反应状态的所需道具。
所以这两种情况在理论上看起来都不错。 HOC 的存在是为了让我们的生活更美好,而不是让我们感到困惑。您提出的第一个案例实际上是使用 HOC imo 做事的正确方法;
我错误地编写了两个版本的 HOC 实现,但它没有给我任何错误并且按预期工作,所以我希望有人能够向我解释差异。 requireAuth
是高阶分量
首先我有一个组件如下
import requireAuth from 'somepath';
class App extends Component {
...
}
export default connect(null, actions)(requireAuth(App));
下面是我的requireAuth
import React, { Component } from 'react';
import { connect } from 'react-redux';
export default (ChildComponent) => {
class ComposedComponent extends Component {
...
render() {
return <ChildComponent {...this.props}/>;
}
}
function mapStatetoProps(state) {
return { someProp: state.someState };
}
return connect(mapStateToProps)(ComposedComponent);
};
下面是我错误的另一个版本,但没有错误,如果有任何不同,我正在寻找一些解释:
import requireAuth from 'somepath';
class App extends Component {
...
}
export default requireAuth(connect(null, actions)(App));//<<=== use requireAuth to surround the whole connect statement instead
下面是 requireAuth
:
import React, { Component } from 'react';
import { connect } from 'react-redux';
export default (ChildComponent) => {
class ComposedComponent extends Component {
...
render() {
return <ChildComponent />; //<<<======without {...this.props}
}
}
function mapStatetoProps(state) {
return { someProp: state.someState };
}
return connect(mapStateToProps)(ComposedComponent);
};
使用 HOC 需要牢记的第一件事是,任何包装在 HOC 中的反应组件仍然会产生反应组件。
第一种情况:
connect(null, actions)(requireAuth(App));
将为 requireAuth
提供 redux 道具。它将其道具传递给 App
组件。所以 App 组件仍然从 redux 获取所有的 props。据我所知,它是有效的。
对于第二种情况:
requireAuth(connect(null, actions)(App))
您正在将 connect(null,actions)(App)
作为子组件传递给 requireAuth
组件。并且只渲染子组件 return <ChildComponent />
。因为 App
组件仍然被 connect
包裹着。 App
组件仍将具有执行所需的所有 redux 道具。所以渲染 ChildComponent
没有道具仍然有效。
并且从 return { someProp: state.someState };
获得的道具仍然可用于 requireAuth
,因为 requireAuth
被包裹在另一个连接中,它将提供 requireAuth
来自反应状态的所需道具。
所以这两种情况在理论上看起来都不错。 HOC 的存在是为了让我们的生活更美好,而不是让我们感到困惑。您提出的第一个案例实际上是使用 HOC imo 做事的正确方法;