组件化概念
组件化是一种(分而治之)的思想,组件是独立可复用的代码片段(功能块),开发一个个组件构造整个应用(组件树)。
组件化可以让代码更加方便组织、管理、具有更强的扩展性。
React中定义组件的方式有两种: 类组件(Class Component) 和 函数组件(Functional Component)。
类组件
概念:使用ES6的 class 创建的组件,叫做类组件
类组件的要求:
- 组件的名称必须是大写字母开头
- 必须继承(extends) React.Component父类,从而使用父类中提供的方法或属性
- 必须实现 render 函数,render方法必须有返回值,表示该组件的UI结构
- 使用类名称作为组件标签名称,可以成对出现 也可以自闭合
import React from 'react'
// 定义类组件
class YComp extends React.Component {
render () {
return <div>这是一个类组件!</div>
}
}
function App () {
return (
<div className="App">
{/* 渲染类组件 */}
<YComp />
<YComp></YComp>
</div>
)
}
export default App
函数组件
概念:使用JS的function(或者箭头函数)定义的函数,这个函数返回组件的UI结构
函数组件的特点:
- 没有生命周期,会被更新、挂载、卸载,但是没有生命周期函数
- this 关键字不能指向组件实例(因为没有组件实例)
约定说明:
- 组件的名称必须首字母大写,react内部会根据这个来判断是组建还是普通的HTML标签
- 函数组件必须有返回值,表示该组件的UI结构;如果不需要渲染任何内容,则返回null
- 使用函数名称作为组件标签名称,可以成对出现 也可以自闭合
// 定义函数组件
function YFunComp () {
return <div>这是我的第一个函数组件!</div>
}
// 定义类组件
function App () {
return (
<div className="App">
{/* 渲染函数组件 */}
<YFunComp />
<YFunComp></YFunComp>
</div>
)
}
export default App
生命周期
组件的生命周期是指组件从被创建到挂载到页面中运行起来,再到组件不用时卸载的过程,注意,只有类组件才有生命周期(类组件 实例化 函数组件 不需要实例化)
projects.wojtekmaj.pl/react-lifec…
常用生命周期
constructor:创建组件时,最先执行,初始化的时候只执行一次
- 初始化state
- 创建 Ref
- 使用 bind 解决 this 指向问题等
注意:如果不做前三点,组件可以不用实现构造函数
render:每次组件渲染都会触发
注意: 不能在里面调用setState()
componentDidMount:在组件挂载(完成DOM渲染)后执行,初始化的时候执行一次
- 发送网络请求
- DOM操作
- 添加一些订阅(在componentWillUnmount取消订阅)
componentDidUpdate:组件更新后(DOM渲染完毕),首次渲染不会执行
- DOM操作,可以获取到更新后的DOM内容,不要直接调用setState
- 如果对更新前后的 props 进行了比较,可以选择在此处进行网络请求;(例如,当 props 未发生变化时,则不会执行网络请求)。
componentWillUnmount:组件卸载、销毁之前调用
- 执行清理工作(比如:清理定时器等)
- 例如:清除timer,取消网络请求或清除componentDidMount()创建的订阅等
不常用的生命周期
static getDerivedStateFromProps:state的值在任何时候都依赖于props时使用;该方法返回一个对象来更新state
showComponentUpdate:
getSnapshotsBeforeUpdate:在React更新DOM之前回调一个函数,可以获取DOM更新之前的一些信息(比如滚动位置)