【发布时间】:2018-07-01 08:48:25
【问题描述】:
我可能想多了,但我很好奇直接导入子组件是否在耦合和测试方面是不好的做法。
下面是一个简单的例子:
import Header from './header.jsx';
class Widget extends React.Component {
render() {
return (
<div>
<Header></Header>
<div>{this.props.importantContent}</div>
</div>
)
}
}
在我看来,Widget 和 Header 之间现在存在耦合。关于测试,在测试Widget 组件时,我看不到模拟Header 组件的简单方法。
其他较大的 React 应用程序如何处理这样的情况?我应该将Header 作为道具传递吗?如果使用react-redux,我可以使用下面的Connect 方法注入标头以减少样板。有声音吗?
import { connect } from 'react-redux';
import Header from './header.jsx';
class Widget extends React.Component {
render() {
return (
<div>
{this.props.header}
<div>{this.props.importantContent}</div>
</div>
)
}
}
const mapStateToProps = state => {
return {
header: Header
}
}
export default connect(mapStateToProps)(Widget)
我感兴趣的是做社区通常在做的事情。我看到一种解决方案是使用 Enzyme 之类的东西对组件的主要部分而不是子组件进行浅层渲染。
想法或其他想法?
【问题讨论】:
-
我不认为“这很糟糕”。这肯定不是最佳实践,因为它降低了代码的可读性,从而使其更难维护。在这两种情况下,您都可以保持小部件的依赖项具有标题组件。我不知道其他大型应用程序,但我从未见过有人以这种方式使用它。
-
好主意,但我认为可能有点离题。在这两种情况下,您仍然拥有
Header依赖关系。第二个例子也是更多样板,而不是更少。除非您的组件需要能够显示不同的标题,否则将其作为我能想到的 prop 传递没有任何好处。 -
您的第二个代码块示例很奇怪。如果您想通过道具传递组件,那么就这样做。然后,无论您在代码中实际使用小部件的任何位置,都可以在其中传递 Header
<Widget header={Header} />如果未提供默认 Header,您始终可以使用默认 Header
标签: reactjs testing react-redux enzyme