当我刚开始写反应的时候,我看过很多写组件的方法。一百篇教程就有一百种写法。虽然反应本身已经成熟了,但是如何使用它似乎还没有一个“正”确的方法,所以我(作者)把我们团队这些年来总结的使用反应的经验总结在这里。希望这篇文字对你有用,不管你是初学者还是老手。
开始前:
我们使用ES6, ES7语法如果你不是很清楚展示组件和容器组件的区别,建议您从阅读这篇文章开始如果您有任何的建议,疑问都清在评论里留言基于类的组件
现在开发反应组件一般都用的是基于类的组件。下面我们就来一行一样的编写我们的组件:
进口的反应,从“反应”{组件}; 从“mobx-react”进口{观察者}; 从“进口ExpandableForm。/ExpandableForm '; 进口的。/风格/ProfileContainer.css;
我很喜欢css在javascript中。但是,这个写样式的方法还是太新了,所以我们在每个组件里引入css文件。而且本地引入的进口和全局的进口会用一个空行来分割。
初始化状态
进口的反应,{组件}从“反应” 从“mobx-react”进口{观察者} 从“进口ExpandableForm。/ExpandableForm ' 进口的。/风格/ProfileContainer.css” 出口的默认类ProfileContainer扩展组件{ 状态={扩展:假}您可以使用了老方法在构造函数<代码> 代码>里初始化<代码> 代码>状态。更多相关可以看这里。但是我们选择更加清晰的方法。
同时,我们确保在类前面加上了<代码>出口默认> 代码。(译者注:虽然这个在使用了回家的的时候不一定对)。
proptype和defaultProps
进口的反应,{组件}从“反应” 从“mobx-react”进口{观察者} 从“prop-types”进口{字符串、对象} 从“进口ExpandableForm。/ExpandableForm ' 进口的。/风格/ProfileContainer.css” 出口的默认类ProfileContainer扩展组件{ 状态={扩展:假} 静态proptype={ 模型:object.isRequired, 标题:字符串 } 静态defaultProps={ 模型:{ id: 0 }, 标题:“你的名字” }//? }
<代码> proptype 代码>和<代码> defaultProps> 代码是静态属性。尽可能在组件类的的前面定义,让其他的开发人员读代码的时候可以立刻注意到。他们可以起到文档的作用。
如果你使用了反应15.3.0或者更高的版本,那么需要另外引入<代码> prop-types> 代码包,而不是使用<代码> React.PropTypes> 代码。更多内容移步这里。
你所有的组件都应该有道具类型。
方法
进口的反应,{组件}从“反应” 从“mobx-react”进口{观察者} 从“prop-types”进口{字符串、对象} 从“进口ExpandableForm。/ExpandableForm ' 进口的。/风格/ProfileContainer.css” 出口的默认类ProfileContainer扩展组件{ 状态={扩展:假} 静态proptype={ 模型:object.isRequired, 标题:字符串 } 静态defaultProps={ 模型:{ id: 0 }, 标题:“你的名字” } handleSubmit=(e)=比;{ e.preventDefault () this.props.model.save () } handleNameChange=(e)=比;{ this.props.model.changeName (e.target.value) } handleExpand=(e)=比;{ e.preventDefault () 这一点。设置状态({扩展:! this.state。扩大}) }//? }
在类组件里,当你把方法传递给子组件的时候,需要确保他们被调用的时候使用的是正确的。一般都会在传给子组件的时候这么做:<代码> this.handleSubmit.bind(这)代码>。
使用ES6的箭头方法就简单多了。它会自动维护正确的上下文(<代码> 代码>)。
给设置状态传入一个方法
在上面的例子里有这么一行:
这一点。设置状态({扩展:! this.state。扩大});<代码>设置状态代码>其实是异步的!为反应了提高性能,会把多次调用的<代码>设置状态代码>放在一起调用,所以,调用了<代码>设置状态代码>之后状态不一定会立刻就发生改变。
所以,调用<代码>设置状态代码>的时候,你不能依赖于当前的状态值。因为我根本不知道它是值会是神马。