状态上移优于公共方法
一般组件不应提供公共方法,这样会破坏数据流只有一个方向的原则。
再因为我们倾向于更细颗粒的组件化,状态应集中在远离渲染的地方处理(比如应用级别的状态就在 redux 的 store 里),也能使兄弟组件更方便地共享。
//bad
class DropDownMenu extends Component {
constructor (props) {
super(props)
this.state = {
showMenu: false
}
}
show () {
this.setState({display: true})
}
hide () {
this.setState({display: false})
}
render () {
return this.state.display && (
<div className="dropdown-menu">
{/* ... */}
</div>
)
}
}
class MyComponent extends Component {
// ...
showMenu () {
this.refs.menu.show()
}
hideMenu () {
this.refs.menu.hide()
}
render () {
return <DropDownMenu ref="menu" />
}
}
//good
class DropDownMenu extends Component {
static propsType = {
display: PropTypes.boolean.isRequired
}
render () {
return this.props.display && (
<div className="dropdown-menu">
{/* ... */}
</div>
)
}
}
class MyComponent extends Component {
constructor (props) {
super(props)
this.state = {
showMenu: false
}
}
// ...
showMenu () {
this.setState({showMenu: true})
}
hideMenu () {
this.setState({showMenu: false})
}
render () {
return <DropDownMenu display={this.state.showMenu} />
}
}
更多阅读: lifting-state-up