react组件进阶
children 属性
children属性是什么
表示该组件的子节点,只要组件内部有子节点,props中就有该属性
children可以是什么
- 普通文本
- 普通标签元素
- 函数
- JSX
props校验
对于组件来说,props是由外部传入的,我们其实无法保证组件使用者传入了什么格式的数据,如果传入的数据格式不对,就有可能会导致组件内部错误,有一个点很关键 - 组件的使用者可能报错了也不知道为什么
- 安装属性校验包:
yarn add prop-types - 导入
prop-types 包 - 使用
组件名.propTypes = {} 给组件添加校验规则
import PropTypes from 'prop-types'
const List = props => {
const arr = props.colors
const lis = arr.map((item, index) => <li key={index}>{item.name}</li>)
return <ul>{lis}</ul>
}
List.propTypes = {
colors: PropTypes.array
}
props 校验规则说明
- 常见类型:array、bool、func、number、object、string
- React元素类型:element
- 必填项:isRequired
- 特定的结构对象:shape({})
optionalFunc: PropTypes.func,
requiredFunc: PropTypes.func.isRequired,
optionalObjectWithShape: PropTypes.shape({
color: PropTypes.string,
fontSize: PropTypes.number
})
props默认值
通过 defaultProps 可以给组件的props设置默认值,在未传入props的时候生效
函数组件
直接使用函数参数默认值
function List({pageSize = 10}) {
return (
<div>
此处展示props的默认值:{ pageSize }
</div>
)
}
<List />
类组件
使用类静态属性声明默认值,`static defaultProps = {}
class List extends Component {
static defaultProps = {
pageSize: 10
}
render() {
return (
<div>
此处展示props的默认值:{this.props.pageSize}
</div>
)
}
}
<List />
组件生命周期
组件的生命周期是指组件从被创建到挂载到页面中运行起来,再到组件不用时卸载的过程,注意,只有类组件才有生命周期(类组件 实例化 函数组件 不需要实例化)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NcX94qly-1651135234582)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1650014871805.png)]
生命周期-挂载阶段
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hWlYQM35-1651135234584)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1650014987177.png)]
钩子 函数 | 触发时机 | 作用 |
---|
constructor | 创建组件时,最先执行,初始化的时候只执行一次 | 1. 初始化state 2. 创建 Ref 3. 使用 bind 解决 this 指向问题等 | render | 每次组件渲染都会触发 | 渲染UI(注意: 不能在里面调用setState() ) | componentDidMount | 组件挂载(完成DOM渲染)后执行,初始化的时候执行一次 | 1. 发送网络请求 2.DOM操作 |
生命周期-更新阶段
钩子函数 | 触发时机 | 作用 |
---|
render | 每次组件渲染都会触发 | 渲染UI(与 挂载阶段 是同一个render) | componentDidUpdate | 组件更新后(DOM渲染完毕) | DOM操作,可以获取到更新后的DOM内容,不要直接调用setState |
生命周期-卸载状态
钩子函数 | 触发时机 | 作用 |
---|
componentWillUnmount | 组件卸载(从页面中消失) | 执行清理工作(比如:清理定时器等) |
|