【发布时间】:2017-09-01 05:23:36
【问题描述】:
我一直在阅读 Eric Elliott 的一些关于 React 以及他如何将组件包装在工厂函数中的文章:
- https://medium.com/javascript-scene/jsx-looks-like-an-abomination-1c1ec351a918
- https://medium.com/javascript-scene/baby-s-first-reaction-2103348eccdd
- https://medium.com/@_ericelliott/what-do-you-mean-by-does-not-work-could-you-reproduce-the-problem-on-codepen-io-as-i-understand-d24903a14a0
如果您阅读过其中一篇文章,您可能会看到与此类似的示例代码:
const productFactory = ( { React, PropTypes } ) => {
const Product = ( props ) => {
return {
props,
render() {
const { name, description, price, quantity, _id } = this.props.product
return (
<div className="col-md-4 col-sm-6 col-xs-12 product">
<div className="product-content">
<div className="product-head">
<div className="product-title">
{ name }
</div>
<div className="product-description">
{ description }
</div>
</div>
<div className="product-price">
$ { price }
</div>
<button className="btn-std btn-qty" onClick={ () => { this.props.removeProduct( _id ) } }>-</button>
<span className="qty">{ quantity }</span>
<button className="btn-std btn-qty" onClick={ () => { this.props.addProduct( _id ) } }>+</button>
</div>
</div>
)
}
}
}
Product.propTypes = {
product: PropTypes.object.isRequired,
addProduct: PropTypes.func.isRequired,
removeProduct: PropTypes.func.isRequired,
}
return Product
}
export default productFactory
这些文章的作者谈到了这种模式:
我为所有组件导出工厂,而不是直接导出组件本身。这提供了两个优点:
1) 我总是将 React 传递给 options 对象,因此组件不需要导入可能存在冲突的 React 或假设 React 作为全局可用。 https://medium.com/@dan_abramov/two-weird-tricks-that-fix-react-7cf9bbdef375#95b7
2) 您可以通过 options 哈希中的所有组件传递您想要的任何内容,并且所有组件都可以访问它。
我不明白的部分是当他说“你可能还注意到该组件对事件侦听器在做什么没有任何概念。我在这里使用了一个技巧,使组件真的很容易在任何应用程序中测试和重用 — 我将它包装在工厂函数中。“
为什么让模块导出实际组件而不是工厂函数更容易测试和重用?
非常感谢!
【问题讨论】:
标签: javascript reactjs