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。