React 组件 API
React 组件 API 涉及多个重要的方面,包括生命周期方法、状态管理、属性传递和事件处理。
以下是 React 组件 API 的详细说明:
生命周期方法
React 组件的生命周期方法分为三个主要阶段:挂载、更新和卸载,详细说明参见:React 组件的生命周期 。
挂载阶段
constructor(props)
: 构造函数,用于初始化状态或绑定方法。
static getDerivedStateFromProps(props, state)
: 每次在调用 render 方法之前调用,用于更新状态。
componentDidMount()
: 组件挂载后调用,此时可以进行 DOM 操作或数据请求。
实例
class MyComponent extends React. Component {
constructor (props ) {
super (props ) ;
this. state = { count : 0 } ;
}
static getDerivedStateFromProps (nextProps , prevState ) {
if (nextProps. reset ) {
return { count : 0 } ;
}
return null ;
}
componentDidMount ( ) {
console. log ( 'Component mounted' ) ;
}
render ( ) {
return <div > { this. state. count } </div >;
}
}
更新阶段
static getDerivedStateFromProps(props, state)
: 与挂载阶段相同,用于更新状态。
shouldComponentUpdate(nextProps, nextState)
: 返回布尔值,决定组件是否重新渲染。
render()
: 渲染组件的 UI。
getSnapshotBeforeUpdate(prevProps, prevState)
: 在 DOM 更新之前调用,用于捕获一些信息(如滚动位置)。
componentDidUpdate(prevProps, prevState, snapshot)
: 在组件更新后调用。
实例
class MyComponent extends React. Component {
shouldComponentUpdate (nextProps , nextState ) {
return nextState. count !== this. state. count ;
}
getSnapshotBeforeUpdate (prevProps , prevState ) {
return { scrollPosition : window. scrollY } ;
}
componentDidUpdate (prevProps , prevState , snapshot ) {
if (snapshot ) {
window. scrollTo ( 0 , snapshot. scrollPosition ) ;
}
console. log ( 'Component updated' ) ;
}
render ( ) {
return <div > { this. state. count } </div >;
}
}
卸载阶段
componentWillUnmount()
: 组件即将卸载时调用,用于清理资源(如定时器、事件监听等)。
实例
class MyComponent extends React. Component {
componentWillUnmount ( ) {
console. log ( 'Component will unmount' ) ;
}
render ( ) {
return <div > { this. state. count } </div >;
}
}
状态管理
状态是一个组件内部的数据,使用 this.state
来定义和管理。通过 setState
方法更新状态。
实例
class MyComponent extends React. Component {
constructor (props ) {
super (props ) ;
this. state = { count : 0 } ;
}
increment = ( ) => {
this. setState ( (prevState ) => ( { count : prevState. count + 1 } ) ) ;
} ;
render ( ) {
return (
<div >
<p >Count : { this. state. count } </p >
<button onClick = { this. increment } >Increment </button >
</div >
) ;
}
}
属性传递
通过 this.props 访问传递给组件的属性,可以使用 PropTypes 进行类型检查。
实例
import PropTypes from 'prop-types' ;
class MyComponent extends React. Component {
render ( ) {
return <div > { this. props. title } </div >;
}
}
MyComponent. propTypes = {
title : PropTypes. string. isRequired ,
} ;
// 使用组件并传递属性
<MyComponent title = "Hello, World!" />
事件处理
通过事件处理函数处理用户交互。需要使用 .bind(this) 或箭头函数来确保 this 指向正确。
实例
class MyComponent extends React. Component {
handleClick = ( ) => {
console. log ( 'Button clicked' ) ;
} ;
render ( ) {
return <button onClick = { this. handleClick } >Click me </button >;
}
}
条件渲染
通过条件语句控制组件的渲染。
实例
class MyComponent extends React. Component {
constructor (props ) {
super (props ) ;
this. state = { isVisible : true } ;
}
toggleVisibility = ( ) => {
this. setState ( (prevState ) => ( { isVisible : !prevState. isVisible } ) ) ;
} ;
render ( ) {
return (
<div >
{ this. state. isVisible && <p >This is visible </p > }
<button onClick = { this. toggleVisibility } >Toggle </button >
</div >
) ;
}
}
列表渲染
通过数组的 map 方法渲染列表。
实例
class MyComponent extends React. Component {
render ( ) {
const items = [ 'Item 1' , 'Item 2' , 'Item 3' ] ;
return (
<ul >
{items. map ( (item , index ) => (
<li key = {index } > {item } </li >
) ) }
</ul >
) ;
}
}
受控组件
通过状态控制表单元素的值。
实例
class MyComponent extends React. Component {
constructor (props ) {
super (props ) ;
this. state = { value : '' } ;
}
handleChange = (event ) => {
this. setState ( { value : event. target. value } ) ;
} ;
handleSubmit = (event ) => {
event. preventDefault ( ) ;
console. log ( 'Submitted value:' , this. state. value ) ;
} ;
render ( ) {
return (
<form onSubmit = { this. handleSubmit } >
<input type = "text" value = { this. state. value } onChange = { this. handleChange } />
<button type = "submit" >Submit </button >
</form >
) ;
}
}
设置状态:setState
setState 是 React 中用于更新组件状态的方法。
语法格式如下:
setState(object nextState[, function callback])
参数说明
object nextState
: 一个对象,包含要更新的状态键值对。React 会将这个对象合并到当前状态中。
function callback
: 一个可选的回调函数,会在状态更新并重新渲染完成后执行。
合并 nextState 和当前 state,并重新渲染组件。
setState 是 React 事件处理函数中和请求回调函数中触发 UI 更新的主要方法。
关于setState
不能在组件内部通过 this.state 修改状态,因为该状态会在调用 setState() 后被替换。
setState() 并不会立即改变 this.state,而是创建一个即将处理的 state。setState() 并不一定是同步的,为了提升性能 React 会批量执行 state 和 DOM 渲染。
setState()总是会触发一次组件重绘,除非在 shouldComponentUpdate() 中实现了一些条件渲染逻辑。
通过合理使用 setState,可以有效地管理组件状态,并确保在状态更新后执行必要的操作,从而提高应用的响应性和可靠性。
React 实例
class Counter extends React . Component { constructor ( props ) { super ( props ) ; this . state = { clickCount : 0 } ; this . handleClick = this . handleClick . bind ( this ) ; } handleClick ( ) { this . setState ( function ( state ) { return { clickCount : state . clickCount + 1 } ; } ) ; } render ( ) { return ( < h2 onClick = { this . handleClick } >点我!点击次数为: { this . state . clickCount } </ h2 > ) ; } } const root = ReactDOM . createRoot ( document . getElementById ( " root " ) ) ; root . render ( < Counter /> ) ;
实例中通过点击 h2 标签来使得点击计数器加 1。