组件原则

减少组件之间的耦合性,让组件简单,容易理解,原则

  1. 保持接口小,porps数量要少
  2. 根据边界划分组件,充分利用组合 composition
    1. 按照数据划分边界原则
    2. 用 propTypes来定义组件的 props
    3. 避免 renderXXX的内部函数
  3. 把 state往父组件提取,让下层组件实现为纯函数
    1. 有状态的组件,组件有自己的 state
  4. 如何判断组件是否有自己的 state??
    1. 假设组件没有 state,定义为函数形式的无状态组件
    2. state是组件内部状态,只能通过组件自己来更新
    3. 确定了组件结构和 state后,剩下的就是 props设计
  5. 不大可能一次就写出完美的代码,软件开发是个逐渐精进的过程,应该让组件达到这样的要求
    1. 功能正常
    2. 代码整洁
    3. 高性能

有状态组件

react组件就是软件设计中的模块

  1. 一个组件就是一个独立的文件,然后用 export default 导出这个组件
  2. 任何 jsx都需要 import React from 'react'
  3. 有状态的组件 state,不能用 函数组件
  4. state需要初始化

秒表组件

  1. 组件框架 ```jsx // 父组件:容器组件 class StopWatch extends React.PureComponent { render() {
    1. return (
    2. <>
    3. <MajorClock />
    4. <ControllerButton />
    5. <SplitTimes />
    6. </>
    7. )
    } }

// 子组件 const MajorClock = (props) => { // 返回秒表的 jsx }

const ControllerButton = (props) => { // 返回2个按钮 }

const SplitTimes = (props) => { // 返回计次所有的时间;要用一个数组来存放时间 }

  1. 2. 组件代码
  2. ```jsx
  3. // 父组件
  4. class StopWatch extends React.PureComponent {
  5. render() {
  6. return (
  7. <MajorClock />
  8. <ControllerButton />
  9. <SplitTimes />
  10. )
  11. }
  12. }
  13. // 子组件
  14. const MajorClock = (props) => {
  15. // 返回秒表的 jsx
  16. const { milliseconed=0 } = props
  17. reutrn (
  18. <h1>{ ms2Time(millisecond) }</h1>
  19. )
  20. }
  21. MajorClock.propTypes = {
  22. milliseconds: PropTypes.number.isRequired
  23. }
  24. // 返回2个按钮
  25. const ControllerButton = (props) => {
  26. const { actived, onStart, onReset, onPause, onSplit } = props
  27. // actived true 返回计次和停止
  28. if (actived) {
  29. return (
  30. <div>
  31. <Button onClick={onSplit}>计次</Button>
  32. <Button onClick={onPause}>停止</Button>
  33. </div>
  34. )
  35. }
  36. // actived false 返回复位和启动
  37. return (
  38. <div>
  39. <Button onClick={onReset}>复位</Button>
  40. <Button onClick={onStart}>启动</Button>
  41. </div>
  42. )
  43. }
  44. ControllerButton.propTypes = {
  45. actived: PropTypes.bool,
  46. onStart: PropTypes.func.isRequired,
  47. onPause: PropTypes.func.isRequired,
  48. onSplit: PropTypes.func.isRequired,
  49. onReset: PropTypes.func.isRequired,
  50. }
  51. // 返回计次所有的时间;要用一个数组来存放时间
  52. const SplitTimes = (props) => {
  53. }
  54. SplitTimes.propTypes = {
  55. splits: PropTypes.arrayOf(PropTypes.number)
  56. }

ms2Time

  1. // ms2Time
  2. export const ms2Time = millisecond => {
  3. let time = millisecond
  4. // 毫秒
  5. const ms = time % 1000
  6. time = (milliseconds - ms) / 1000
  7. // 秒
  8. const seconds = time % 60
  9. time = (time - seconds) / 60
  10. // 小时
  11. const minutes = time % 60
  12. const hours = (time - minutes) / 60
  13. // 时 分 秒
  14. const fulltime = padStart(hour, 2, '0') + ':' + padStart(minutes,2 '0') + ':' + padStart(seconds, 3, '0')
  15. }