状态上移优于公共方法

一般组件不应提供公共方法,这样会破坏数据流只有一个方向的原则。

再因为我们倾向于更细颗粒的组件化,状态应集中在远离渲染的地方处理(比如应用级别的状态就在 redux 的 store 里),也能使兄弟组件更方便地共享。

  1. //bad
  2. class DropDownMenu extends Component {
  3. constructor (props) {
  4. super(props)
  5. this.state = {
  6. showMenu: false
  7. }
  8. }
  9. show () {
  10. this.setState({display: true})
  11. }
  12. hide () {
  13. this.setState({display: false})
  14. }
  15. render () {
  16. return this.state.display && (
  17. <div className="dropdown-menu">
  18. {/* ... */}
  19. </div>
  20. )
  21. }
  22. }
  23. class MyComponent extends Component {
  24. // ...
  25. showMenu () {
  26. this.refs.menu.show()
  27. }
  28. hideMenu () {
  29. this.refs.menu.hide()
  30. }
  31. render () {
  32. return <DropDownMenu ref="menu" />
  33. }
  34. }
  35. //good
  36. class DropDownMenu extends Component {
  37. static propsType = {
  38. display: PropTypes.boolean.isRequired
  39. }
  40. render () {
  41. return this.props.display && (
  42. <div className="dropdown-menu">
  43. {/* ... */}
  44. </div>
  45. )
  46. }
  47. }
  48. class MyComponent extends Component {
  49. constructor (props) {
  50. super(props)
  51. this.state = {
  52. showMenu: false
  53. }
  54. }
  55. // ...
  56. showMenu () {
  57. this.setState({showMenu: true})
  58. }
  59. hideMenu () {
  60. this.setState({showMenu: false})
  61. }
  62. render () {
  63. return <DropDownMenu display={this.state.showMenu} />
  64. }
  65. }

更多阅读: lifting-state-up