特殊属性 children属性
;<Hello children='我是子节点' />
// children 是一个特殊的 prop,上面的写法和下面等价,当内容比较多的时候,下面的写法更加直观
;<Hello>我是子节点</Hello>
props
校验
- 1.下载并引入
import PropTypes from 'prop-types'
- 2.往类组件上面添加静态属性 propTypes
- 3.添加相关的校验规则
- 4.常见校验规则
{
// 常见类型
fn1: PropTypes.func,
// 必选
fn2: PropTypes.func.isRequired,
// 特定结构的对象
obj: PropTypes.shape({
color: PropTypes.string,
fontSize: PropTypes.number
})
}
在class类中写入静态校验
// 【静态】
static propTypes = {
// 校验 colors 必须是一个数组
colors: PropTypes.array,
}
方法二组件添加
// !#2 组件.propTypes = {}
/* Hello.propTypes = {
// 校验 colors 必须是一个数组
colors: PropTypes.array,
} */
生命周期
三大阶段五个钩子
1.挂载阶段:
- (1)constructor 初始化状态 state 和 创建 ref 引用
- (2)render 渲染UI 和 不能直接调用 setState
- (3)componentDidMount 发请求 和 操作DOM
2.更新阶段
- (1)render
- (2)componentDidUpdate 可以根据更新完之后的数据做相关操作 , 不能直接调用setState
3. 卸载(销毁)阶段
- componentWillUnMount 可以用来清除定时器 和 解绑事件
setState
更新数据的表现
- 同步 : 在定时器内进行setState 和 在原生事件内部进行setState
- 异步 : 在生命周期钩子里面进行 setState 或者 在合成事件的回调函数里面进行setState
第一个参数可以是函数
// 初始
state = { count: 1 }
// 更新
this.setState((preState) => {
return {
count: preState.count + 1,
}
})
this.setState((preState) => {
return {
count: preState.count + 2,
}
})
// 输出
console.log(this.state.count) // 依然是 1
其中 preState 是上一次更新完毕的状态
可以拿到上一次更新完毕的状态, 更新数据的表现依然是异步的,返回值必须是一个对象,里面表示要更新的状态。 其中 preState 是上一次更新完毕的状态
第二个参数页可以写一个回调函数
-
- 可以在此回调函数里面拿到更新完毕后的数据
- 2 . 页可以在 componentDidUpdate钩子里面拿到更新完毕的数据
Hooks
- 可以为函数组件提供状态和生命周期
- 只能在函数式组件或另一个自定义 Hook中使用
- 可以解决组件的状态和业务逻辑服用问题
- Hook + 函数式组件的写法可以和class组件的写法共存