React Components 作用可以类似于 JS 的函数和类,但是可以通过render()函数直接返回HTML代码块。

Create Class 创建类

在我们的源代码里面,我们已经有一个 App 类。大致是这样的:

class App extends Component {
  render() {
    return (
        /* html code */
    );
  }
}

现在我们创建一个名为 Car 的类,然后将内容返回到 App 类中,如下所示:

class Car extends Component {
  render() {
    return (
        <h1>I am a Car!</h1>
    );
  }
}

class App extends Component {
  render() {
    return (
        <div class="App">
            <Car />  
        </div>
    );
  }
}

上述代码返回的 HTML 代码等同于

<div class="App">
    <h1>I am a Car</h1>
</div>

构造器 Constructor

在讲构造器之前我们先理解一下state。state是一个存属性的对象。例如在创建的 Car 类中,加入这样的一段代码

class Car extends Component {
  constructor() {
    super();
    this.state = {
        color: "red",
    };
  }

  render() {
    return (
        <h1>I am a {this.state.color} Car!</h1>
    );
  }
}

返回的 HTML 代码等同于

<h1>I am a red Car!</h1>

在上面的代码中,我们加入了state属性,设置 color 为 red。在调用时,我们使用{ this.state.color }来获取这个属性。

Change State 改变属性

我们可以添加函数来改变属性,比如改变 color,我们就在类里加上下面的函数

changeColor = () => {
    this.setState({color: "blue"});
}

然后添加一个按钮调用这个函数,将render()写为

render() {
    return (
        <div>
            <h1>I am a {this.state.color} Car!</h1>
            <button onClick={this.changeColor}>Change Color</button> 
        </div>
    );
}

点击按钮,标题里的 red 变为 blue。

Props

Props用于传递属性给 Component,比如我们在 App 类里这样写

class App extends Component {
  render() {
    return (
        <div class="App">
            <Car brand="Ford"/>
        </div>
    );
  }
}

这段代码中的 Car 有了一个属性叫做 brand,数值为 Ford。这样我们就能在 Car 中调用这个函数,例如在render()中写

render() {
    return (
        <div>
            <h1>I am a {this.props.brand} Car!</h1>
        </div>
    );
}

这样返回的HTML代码就代表了

<div>
    <h1>I am a Ford Car!</h1>
</div>

和state不同的是,props是无法改变的属性(试图改变props会报错)