React 组件 API 涉及多个重要的方面,包括生命周期方法、状态管理、属性传递和事件处理。
以下是 React 组件 API 的详细说明:
React 组件的生命周期方法分为三个主要阶段:挂载、更新和卸载,详细说明参见:React 组件的生命周期 。
constructor(props)
: 构造函数,用于初始化状态或绑定方法。static getDerivedStateFromProps(props, state)
: 每次在调用 render 方法之前调用,用于更新状态。componentDidMount()
: 组件挂载后调用,此时可以进行 DOM 操作或数据请求。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
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)
: 在组件更新后调用。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
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()
: 组件即将卸载时调用,用于清理资源(如定时器、事件监听等)。
1 2 3 4 5 6 7 8 9 |
class MyComponent extends React.Component { componentWillUnmount() { console.log('Component will unmount'); } render() { return <div>{this.state.count}</div>; } } |
状态是一个组件内部的数据,使用 this.state
来定义和管理。通过 setState
方法更新状态。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
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 进行类型检查。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
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 指向正确。
1 2 3 4 5 6 7 8 9 |
class MyComponent extends React.Component { handleClick = () => { console.log('Button clicked'); }; render() { return <button onClick={this.handleClick}>Click me</button>; } } |
通过条件语句控制组件的渲染。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
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 方法渲染列表。
1 2 3 4 5 6 7 8 9 10 11 12 |
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> ); } } |
通过状态控制表单元素的值。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
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 是 React 中用于更新组件状态的方法。
语法格式如下:
1 |
setState(object nextState[, function callback]) |
object nextState
: 一个对象,包含要更新的状态键值对。React 会将这个对象合并到当前状态中。function callback
: 一个可选的回调函数,会在状态更新并重新渲染完成后执行。合并 nextState 和当前 state,并重新渲染组件。
setState 是 React 事件处理函数中和请求回调函数中触发 UI 更新的主要方法。
不能在组件内部通过 this.state 修改状态,因为该状态会在调用 setState() 后被替换。
setState() 并不会立即改变 this.state,而是创建一个即将处理的 state。setState() 并不一定是同步的,为了提升性能 React 会批量执行 state 和 DOM 渲染。
setState()总是会触发一次组件重绘,除非在 shouldComponentUpdate() 中实现了一些条件渲染逻辑。
通过合理使用 setState,可以有效地管理组件状态,并确保在状态更新后执行必要的操作,从而提高应用的响应性和可靠性。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
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。
from:https://www.runoob.com/react/react-component-api.html