Javascript 最佳实践会导致容器膨胀和非模块化代码
有人告诉我,最好只对容器使用类,对组件使用函数。因此,容器具有状态,组件是哑函数,它们只在容器之间接收和发送道具 我发现的问题是它会导致容器膨胀。不仅如此,如果一个容器包含许多不同的组件,那么这些容器中的方法是许多不同的不相关功能的混合体 这与将所有内容保持模块化的想法背道而驰。例如,如果我的容器中有一个“submit comment”组件,我希望submitCommentHandler方法也在相关组件中,而不是在Post容器中与大量其他处理程序混合,以实现不相关的功能,例如位于ratePostHandler和userLoginHandler的旁边Javascript 最佳实践会导致容器膨胀和非模块化代码,javascript,reactjs,design-patterns,Javascript,Reactjs,Design Patterns,有人告诉我,最好只对容器使用类,对组件使用函数。因此,容器具有状态,组件是哑函数,它们只在容器之间接收和发送道具 我发现的问题是它会导致容器膨胀。不仅如此,如果一个容器包含许多不同的组件,那么这些容器中的方法是许多不同的不相关功能的混合体 这与将所有内容保持模块化的想法背道而驰。例如,如果我的容器中有一个“submit comment”组件,我希望submitCommentHandler方法也在相关组件中,而不是在Post容器中与大量其他处理程序混合,以实现不相关的功能,例如位于ratePost
我是个新手,所以可能我遗漏了一些东西,但如何将这一“最佳实践”与它提出的所有其他问题协调起来?在你的帖子中有一些误解,可能源于你正在阅读的任何最佳实践文章中的误解 当容器+组件的核心思想开始浮出水面时,许多示例都没有正确实现
// DO NOT DO THIS
let FormComponent = ({ data, handleSubmit }) =>
<form onSubmit={handleSubmit}>
{...something with data...}
</form>
class FormContainer extends React.Component {
state = { data: [] }
submitForm = formData => {
api.post(formData).then(data => this.setState({ data }))
}
render() {
return (
<div>
<FormComponent
data={this.state.data}
handleSubmit={this.submitForm}
/>
</div>
)
}
}
现在,你有了一个容器,它可以做一件事,可以在你的应用程序中的任何地方重复使用,并具有如下任何表示组件:
let SomewhereInYourApp = () => (
<FormContainer>
{({ data, submitForm }) => (
<div>
{/* put whatever you want here.. it's modular! */}
<FormComponent data={data} handleSubmit={submitForm} />
</div>
)}
</FormContainer>
)
让SomewhereInYourApp=()=>(
{({data,submitForm})=>(
{/*把你想要的东西放在这里..它是模块化的!*/}
)}
)
然后,您可以根据需要制作尽可能多的容器,这些容器只执行对it重要的特定业务逻辑,并嵌套它们,但这样做是有意义的。我不认为任何最佳实践会将所有内容组合到一个容器中。嵌套容器是完全可以接受的
如果你有很多容器,嵌套也有点太金字塔,考虑使用HOC或类似于使用渲染渲染器的容器的工具。 react adopt中合成容器的屏幕截图:
首先,容器组件不必包含业务逻辑。即使它有submitCommentHandler方法,它也可以像
submitCommentHandler(comment)=>this.commentService.add(comment)
一样简洁。此外,这是一个问题,国家管理图书馆,如Redux地址。谢谢!我需要进一步探究这条道路,但我想我理解了你的例子。
let SomewhereInYourApp = () => (
<FormContainer>
{({ data, submitForm }) => (
<div>
{/* put whatever you want here.. it's modular! */}
<FormComponent data={data} handleSubmit={submitForm} />
</div>
)}
</FormContainer>
)