组件原则
减少组件之间的耦合性,让组件简单,容易理解,原则
- 保持接口小,porps数量要少
- 根据边界划分组件,充分利用组合 composition
- 按照数据划分边界原则
- 用 propTypes来定义组件的 props
- 避免 renderXXX的内部函数
- 把 state往父组件提取,让下层组件实现为纯函数
- 有状态的组件,组件有自己的 state
- 如何判断组件是否有自己的 state??
- 假设组件没有 state,定义为函数形式的无状态组件
- state是组件内部状态,只能通过组件自己来更新
- 确定了组件结构和 state后,剩下的就是 props设计
- 不大可能一次就写出完美的代码,软件开发是个逐渐精进的过程,应该让组件达到这样的要求
- 功能正常
- 代码整洁
- 高性能
有状态组件
react组件就是软件设计中的模块
- 一个组件就是一个独立的文件,然后用 export default 导出这个组件
- 任何 jsx都需要
import React from 'react'
- 有状态的组件 state,不能用 函数组件
- state需要初始化
秒表组件
- 组件框架
```jsx
// 父组件:容器组件
class StopWatch extends React.PureComponent {
render() {
} }return (
<>
<MajorClock />
<ControllerButton />
<SplitTimes />
</>
)
// 子组件 const MajorClock = (props) => { // 返回秒表的 jsx }
const ControllerButton = (props) => { // 返回2个按钮 }
const SplitTimes = (props) => { // 返回计次所有的时间;要用一个数组来存放时间 }
2. 组件代码
```jsx
// 父组件
class StopWatch extends React.PureComponent {
render() {
return (
<MajorClock />
<ControllerButton />
<SplitTimes />
)
}
}
// 子组件
const MajorClock = (props) => {
// 返回秒表的 jsx
const { milliseconed=0 } = props
reutrn (
<h1>{ ms2Time(millisecond) }</h1>
)
}
MajorClock.propTypes = {
milliseconds: PropTypes.number.isRequired
}
// 返回2个按钮
const ControllerButton = (props) => {
const { actived, onStart, onReset, onPause, onSplit } = props
// actived true 返回计次和停止
if (actived) {
return (
<div>
<Button onClick={onSplit}>计次</Button>
<Button onClick={onPause}>停止</Button>
</div>
)
}
// actived false 返回复位和启动
return (
<div>
<Button onClick={onReset}>复位</Button>
<Button onClick={onStart}>启动</Button>
</div>
)
}
ControllerButton.propTypes = {
actived: PropTypes.bool,
onStart: PropTypes.func.isRequired,
onPause: PropTypes.func.isRequired,
onSplit: PropTypes.func.isRequired,
onReset: PropTypes.func.isRequired,
}
// 返回计次所有的时间;要用一个数组来存放时间
const SplitTimes = (props) => {
}
SplitTimes.propTypes = {
splits: PropTypes.arrayOf(PropTypes.number)
}
ms2Time
// ms2Time
export const ms2Time = millisecond => {
let time = millisecond
// 毫秒
const ms = time % 1000
time = (milliseconds - ms) / 1000
// 秒
const seconds = time % 60
time = (time - seconds) / 60
// 小时
const minutes = time % 60
const hours = (time - minutes) / 60
// 时 分 秒
const fulltime = padStart(hour, 2, '0') + ':' + padStart(minutes,2 '0') + ':' + padStart(seconds, 3, '0')
}