React 构造函数怎么用?

文章导读
Previous Quiz Next 通常,class 中的 constructor 方法用于为新创建的对象设置初始值。React 同样使用 constructor() 来实现相同的初始化目的。但在 React 中,constructor 还用于 state 初始化和事件绑定
📋 目录
  1. props 的初始化
  2. state 的初始化
  3. 事件绑定
A A

React - 构造函数



Previous
Quiz
Next

通常,class 中的 constructor 方法用于为新创建的对象设置初始值。React 同样使用 constructor() 来实现相同的初始化目的。但在 React 中,constructor 还用于 state 初始化和事件绑定。

在本章中,我们将学习如何在 React 组件中使用 constructor。

props 的初始化

众所周知,每个 React 组件都有 props 和 state。props 应该在 constructor 中使用 super 关键字进行初始化。如果在基于 class 的 React 组件中没有正确初始化 props,那么 this.props 将无法正常工作并引入 bug。让我们创建一个带有正确 constructor 方法的简单组件。

class Welcome extends React.Component {
   constructor(props) {
      super(props);
   }
   render() {
      return (
         <div><h3>Welcome {this.props.name}</h3></div>
      )
   }
}

在这里,

  • super(props) 将在 Welcome 组件中初始化 props。

  • this.props.* 将提供对 props 细节的访问。

  • 该组件可以按以下方式使用 −

function App() {
   return (
      <div className="container">
         <div style={{ padding: "10px" }}>
            <div>
               <Welcome name={'John'} />
            </div>
         </div>
      </div>
   );
}

组件将渲染如下所示的欢迎消息 −

Initialization of Props

state 的初始化

类似于 props 初始化,state 的初始化非常重要,可以在 constructor 中完成。通常,React 提供了多种方式来设置和获取组件中的 state 信息,具体如下 −

使用 this.state = obj

这用于使用对象初始化 state

this.state = {
   pageSize: 10
}

使用 this.state.*

这用于访问 state 信息。(this.state.pageSize)

使用 this.setState()

这是一个接受对象或 lambda 函数的函数。用于设置 state 信息

this.setState({
   pageSize: 20
})
this.setState((state, props) => ({
   pageSize: state.pageSize + 1
}))

让我们创建一个带有正确 state 初始化的简单组件

class Welcome extends React.Component {
   constructor(props) {
      super(props);
      this.state = {
         welcomeMessage: "Hello"
      }
   }
   render() {
      return (
         <div><h3>{this.state.welcomeMessage}, {this.props.name}</h3></div>
      )
   }
}

在这里,this.state 用于设置欢迎消息的默认(初始)值。该组件可以按以下方式使用 −

function App() {
   return (
      <div className="container">
         <div style={{ padding: "10px" }}>
            <div>
               <Welcome name={'John'} />
            </div>
         </div>
      </div>
   );
}

组件将渲染如下所示的欢迎消息 −

Initialization State

事件绑定

类似于 props 和 state 的初始化,事件处理器必须正确绑定,以便在事件处理器中正确访问 this。让我们在 Welcome 组件中创建一个新按钮来更改欢迎消息,并添加一个事件处理器来处理按钮的 onClick 事件,如下所示 −

import React from "react";

class Welcome extends React.Component {
   constructor(props) {
      super(props);
      this.state = {
         welcomeMessage: "Hello"
      }
      this.changeMessageHandler = this.changeMessageHandler.bind(this)
   }
   changeMessageHandler() {
      this.setState(prevState => (({
         welcomeMessage: prevState.welcomeMessage == "Hello" ? "Welcome" : "Hello"
      })));
   }
   render() {
      return (
         <div>
            <div><h3>{this.state.welcomeMessage}, {this.props.name}</h3></div>
            <div><button onClick={this.changeMessageHandler}>Change welcome message</button></div>
         </div>
      )
   }          
}
export default Welcome;

这里,

步骤1 − 添加一个带有 onClick 事件的按钮

<div><button onClick={this.changeMessageHandler}>Change welcome message</button></div>

步骤 2 − 将 this.changeMessageHandler 方法设置为 onClick 事件处理器

步骤 3 − 在 constructor 中绑定事件处理器 this.changeMessageHandler

this.changeMessageHandler = this.changeMessageHandler.bind(this)

步骤 4 − 添加事件处理器并使用 this.setState 更新 state。

changeMessageHandler() {
   this.setState(prevState => ({
      welcomeMessage: prevState.welcomeMessage == "Hello" ? "Welcome" : "Hello"
   }));
}

该组件可以按如下方式使用 −

function App() {
   return (
      <div className="container">
         <div style={{ padding: "10px" }}>
            <div>
               <Welcome name={'John'} />
            </div>
         </div>
      </div>
   );
}

组件将渲染欢迎消息,如下所示 −

Event Binding

总结

在基于 class 的 React 组件中,constructor 非常重要。它的主要任务是以正确配置 props、state 和事件的方式设置组件,使其能够被组件的事件和 render 方法访问。