ReactJS 教程

ReactJS - 主页 ReactJS - 简介 ReactJS - 路线图 ReactJS - 安装 ReactJS - 功能 ReactJS - 优势和缺点 ReactJS - 架构 ReactJS - 创建 React 应用程序 ReactJS - JSX ReactJS - 组件 ReactJS - 嵌套组件 ReactJS - 使用组件 ReactJS - 集合组件 ReactJS - 样式 ReactJS - 属性 (props) ReactJS - 使用属性创建组件 ReactJS - props 验证 ReactJS - 构造函数 ReactJS - 组件生命周期 ReactJS - 事件管理 ReactJS - 创建事件感知组件 ReactJS - Expense Manager 事件 ReactJS - 状态管理 ReactJS - 状态管理 API ReactJS - 无状态组件 ReactJS - Hooks 进行状态管理 ReactJS - Hooks 的组件生命周期 ReactJS - 布局组件 ReactJS - 分页 ReactJS - Material UI ReactJS - Http 客户端编程 ReactJS - 表单编程 ReactJS - 受控组件 ReactJS - 非受控组件 ReactJS - Formik ReactJS - 条件渲染 ReactJS - 列表 ReactJS - Key 键 ReactJS - 路由 ReactJS - Redux ReactJS - 动画 ReactJS - Bootstrap ReactJS - Map ReactJS - 表格 ReactJS - 使用 Flux 管理状态 ReactJS - 测试 ReactJS - CLI 命令 ReactJS - 构建和部署 ReactJS - 示例

Hooks

ReactJS - Hooks 简介 ReactJS - 使用 useState ReactJS - 使用 useEffect ReactJS - 使用 useContext ReactJS - 使用 useRef ReactJS - 使用 useReducer ReactJS - 使用 useCallback ReactJS - 使用 useMemo ReactJS - 自定义 Hooks

ReactJS 高级

ReactJS - 可访问性 ReactJS - 代码拆分 ReactJS - 上下文 ReactJS - 错误边界 ReactJS - 转发 Refs ReactJS - 片段 ReactJS - 高阶组件 ReactJS - 与其他库集成 ReactJS - 优化性能 ReactJS - Profiler API ReactJS - Portals ReactJS - 不使用 ES6 ECMAScript ReactJS - 不使用 JSX 的 React ReactJS - Reconciliation ReactJS - Refs 和 DOM ReactJS - 渲染道具 ReactJS - 静态类型检查 ReactJS - 严格模式 ReactJS - Web 组件

其他概念

ReactJS - 日期选择器 ReactJS - Helmet ReactJS - 内联样式 ReactJS - PropTypes ReactJS - BrowserRouter ReactJS - DOM ReactJS - 轮播 ReactJS - 图标 ReactJS - 表单组件 ReactJS - 参考 API

ReactJS 有用资源

ReactJS - 快速指南 ReactJS - 备忘录 Axios - 备忘录 ReactJS - 有用资源 ReactJS - 讨论


ReactJS - 静态 getDerivedStateFromProps() 方法

React 是一个用于创建用户界面的著名 JavaScript 库。React 中有一个名为 getDerivedStateFromProps 的方法,看起来很复杂,但让我们将其分解成简单的词语。

在 React 中,getDerivedStateFromProps 方法在组件渲染之前被调用,无论是首次出现时还是更新时。其目标是找出组件的状态是否需要更改以响应其 props 的变化。

语法

static getDerivedStateFromProps(props, state)

参数

  • props −组件将要渲染的下一组 props。

  • state − 组件即将渲染的状态。

返回值

如果需要更新状态,则应返回一个对象;否则,应返回 null。

示例

示例 1

让我们使用 getDerivedStateFromProps 函数创建一个简单的 React 应用。在此示例中,我们将创建一个表单,当用户 ID 更改时,该表单会自动刷新电子邮件地址。

import React, { Component } from 'react';

class Form extends Component {
   state = {
      email: this.props.defaultEmail,
      prevUserID: this.props.userID
   };   
   static getDerivedStateFromProps(props, state) {
      if (props.userID !== state.prevUserID) {
         return {
            prevUserID: props.userID,
            email: props.defaultEmail
         };
      }
      return null;
   }   
   handleUserIDChange = (e) => {
      
      // 模拟用户 ID 更改
      this.props.onUserIDChange(e.target.value);
   };
   
   handleEmailChange = (e) => {
      this.setState({ email: e.target.value });
   };
   
   render() {
      return (
         <div>
            <label>
               User ID:
               <input type="text" value={this.props.userID} onChange={this.handleUserIDChange} />
            </label>
            <br />
            <label>
               Email:
               <input type="text" value={this.state.email} onChange={this.handleEmailChange} />
            </label>
         </div>
      );
   }
}

class App extends Component {
   state = {
      userID: '123',
      defaultEmail: 'user@example.com'
   };
   
   handleUserIDChange = (newUserID) => {
      this.setState({ userID: newUserID });
   };
   
   render() {
      return (
         <div>
            <h1>Form App</h1>
            <Form
               userID={this.state.userID}
               defaultEmail={this.state.defaultEmail}
               onUserIDChange={this.handleUserIDChange}
            />
         </div>
      );
   }
}

export default App;

输出

form app

在上面的例子中,Form 组件有一个用户 ID 和一个电子邮件输入。当用户 ID 更改时,getDerivedStateFromProps 函数会重置电子邮件。函数 handleUserIDChange 模拟用户 ID 更改。App 组件设置 Form 并管理对用户 ID 的更改。这是一个基本示例,我们可以对其进行更改以满足我们的特定要求。

示例 2

现在我们将创建一个简单的计数器应用程序,其中初始计数作为参数给出,计数器可以递增。当 prop 更改时,将调用 getDerivedStateFromProps 函数来更新状态。

import React, { Component } from 'react';
import './App.css';

class Counter extends Component {
   state = {
      count: this.props.initialCount,
   };
   
   static getDerivedStateFromProps(props, state) {
      // 检查初始 count prop 是否已改变
      if (props.initialCount !== state.count) {
         // 使用新的初始计数更新状态
         return {
            count: props.initialCount,
         };
      }
      return null;
   }
   
   handleIncrement = () => {
      this.setState((prevState) => ({
         count: prevState.count + 1,
      }));
   };
   
   render() {
      return (
         <div>
            <p>Count: {this.state.count}</p>
            <button onClick={this.handleIncrement}>Increment</button>
         </div>
      );
   }
}

class App extends Component {
   state = {
      initialCount: 0,
   };
   
   handleInitialCountChange = (e) => {
      const newInitialCount = parseInt(e.target.value, 10);
      this.setState({ initialCount: newInitialCount });
   };
   
   render() {
      return (
         <div className='App'>
            <h1>Counter App</h1>
            <label>
               Initial Count:
               <input
                  type="number"
                  value={this.state.initialCount}
                  onChange={this.handleInitialCountChange}
               />
            </label>
            <Counter initialCount={this.state.initialCount} />
         </div>
      );
   }
}

export default App;

输出

initial count

现在,我们有一个简单的 React 应用,其中计数器根据初始计数 prop 进行更新,并且 getDerivedStateFromProps 方法用于处理 prop 更改。

示例 3

让我们创建一个简单的 React 应用,该应用使用生命周期方法 getDerivedStateFromProps 根据用户是否已登录显示一条消息。因此,运行应用后,我们将能够看到用户已登录或已注销的消息。

import React, { Component } from 'react';
import './App.css';

class LoginStatus extends Component {
   static getDerivedStateFromProps(props, state) {
      // 检查用户是否已登录
      const isLoggedIn = props.isLoggedIn;
      // 根据登录状态显示不同的消息
      return {
         statusMessage: isLoggedIn ? 'Welcome back! You are logged in.' : 'Please log in.'
      };
   }
   
   render() {
      return (
         <div>
            <p>{this.state.statusMessage}</p>
         </div>
      );
   }
}

class App extends Component {
   state = {
      isLoggedIn: false
   };
   
   handleLoginToggle = () => {
      this.setState((prevState) => ({
         isLoggedIn: !prevState.isLoggedIn
      }));
   };
   
   render() {
      return (
         <div className='App'>
            <h1>Login App</h1>
            <button onClick={this.handleLoginToggle}>
            {this.state.isLoggedIn ? 'Logout' : 'Login'}
            </button>
            <LoginStatus isLoggedIn={this.state.isLoggedIn} />
         </div>
      );
   }
}

export default App;

输出

login app

在上面的应用中,我们使用 getDerivedStateFromProps() 方法来检查用户的登录和注销状态。正如我们在上面的输出中看到的那样,屏幕上显示了一个按钮,当我们单击该按钮时,它会显示消息"欢迎回来!您已登录。"按钮更改为注销。

限制

  • 与以前的 UNSAFE_componentWillReceiveProps 不同,它在每次渲染时都会被调用。

  • 它无法访问组件实例,因此我们不能直接在其中使用它。

摘要

getDerivedStateFromProps 函数乍一看可能很难,但它是针对特定条件的工具。从根本上讲,它允许我们根据其 props 的变化来管理组件的状态。

reactjs_reference_api.html