# 组件和传参

组件允许你将 UI 拆分为独立可复用的代码片段,并对每个片段进行独立构思。

# 定义组件

# 函数组件

定义组件最简单的方式就是编写 JavaScript 函数:

function Welcome(props) {
  return <h1>Hello, {props.name}</h1>;
}

# 类组件

import React from "react";
class Welcome extends React.Component {
  render() {
    return <h1>Hello, {this.props.name}</h1>;
  }
}

# 渲染组件

function Welcome(props) {
  return <h1>Hello, {props.name}</h1>;
}
export default Welcome;
import Welcome from "./components/Welcom";
const root = ReactDOM.createRoot(document.getElementById('root'));
const element = <Welcome name="Sara" />;
root.render(element);

让我们来回顾一下这个例子中发生了什么:

  • 我们调用 root.render() 函数,并传入 <Welcome name="Sara" /> 作为参数。
  • React 调用 Welcome 组件,并将 {name: 'Sara'} 作为 props 传入。
  • Welcome 组件将 <h1>Hello, Sara</h1> 元素作为返回值。
  • React DOM 将 DOM 高效地更新为 <h1>Hello, Sara</h1>

WARNING

注意: 组件名称必须以大写字母开头。

React 会将以小写字母开头的组件视为原生 DOM 标签。

例如,<div /> 代表 HTML 的 div 标签,而 <Welcome /> 则代表一个组件,并且需在作用域内使用 Welcome。

# 组件嵌套

组件可以在其输出中引用其他组件。这就可以让我们用同一组件来抽象出任意层次的细节。

import Welcome from "./components/Welcom";
const root = ReactDOM.createRoot(document.getElementById('root'));

function App() {
  return (
    <div>
      <Welcome name="Sara" />
      <Welcome name="Cahal" />
      <Welcome name="Edite" />
    </div>
  );
}
root.render(App());

# Props 的只读性

组件无论是使用函数声明还是通过 class 声明,都绝不能修改自身的 props。来看下这个 sum 函数:

function sum(a, b) {
  return a + b;
}

这样的函数被称为“纯函数”,因为该函数不会尝试更改入参,且多次调用下相同的入参始终返回相同的结果。

相反,下面这个函数则不是纯函数,因为它更改了自己的入参:

function withdraw(account, amount) {
  account.total -= amount;
}