前言

React 自从在 v16.8版本引入了 Hooks能力之后,函数式组件➕Hooks 就注定成为趋势,类组件被慢慢废弃。在新版本的 React 官方文档中已经看不到类组件的概念了,全部模版都是函数式组件的方式。
因此之后提起 React 组件的时候全部是指代的是函数式组件。

定义组件

在 react 中,组件就是一个返回标签的 JavaScript 函数。
函数的名字就是组件的名字,且必须以大写字母开头。

  1. function MyButton() {
  2. return (
  3. <button>I'm a button</button>
  4. )
  5. }

内部数据

在组件中常常需要用到数据,动态渲染在组件模版中。
组件其实就是个函数,可以直接在函数中定义一个 js 变量,并在模版中使用。
变量在模版中使用的方式为 { },标签属性也是一样的。

  1. function MyButton() {
  2. let text = "I'm a button";
  3. let id = "myButton";
  4. return (
  5. <button id="{id}"> {text}</button>
  6. )
  7. }

如果 text 和 id 等变量的值变化了,视图是不会重新渲染的,也就是说引用这些变量的模版渲染出来的页面对应的值是不会变化成新的的值的。

但我们常常需要在数据变化的时候,让视图也重新渲染出新的值。react 提供了特定的 hook 来定义数据。
useStatehook ,用法如下:

  1. import { useState } from "react";
  2. function MyButton() {
  3. let [text, setText] = useState(""I'm a button"");
  4. function handleClick() {
  5. setText("new text");
  6. }
  7. return (
  8. <button onClick={handleClick}> {text}</button>
  9. )
  10. }

内部方法

在组件中定义一个方法,就是定义一个常规的 JavaScript 函数,在模版中使用即可。
在模版中使用方法作为事件处理函数的时候,只需要传递函数名即可,不需要调用函数。
同时模版中的事件名要写成小驼峰式,如 onclick-> onClick

  1. function MyButton() {
  2. function handleClick() {
  3. console.log("点击了按钮")
  4. }
  5. return (
  6. <button onClick={handleClick}> 按钮 </button>
  7. )
  8. }

外部数据

组件除了使用内部定义好的数据外,还可以接收外部传递过来的数据,这些外部数据在使用组件的时候确定。

组件函数接收一个 props 参数,也是函数组件唯一的参数。该参数包含了使用组件时传递的全部属性。

  1. function MyButton(props) {
  2. return (
  3. <button>{ props.title }</button>
  4. )
  5. }
  6. // 使用
  7. <MyButton title="I'm a button"/>

可以使用 es6 的解构语法如下:

  1. function MyButton({ title }) {
  2. return (
  3. <button>{ title }</button>
  4. )
  5. }
  6. // 使用
  7. function App() {
  8. return (
  9. <MyButton title="I'm a button"/>
  10. )
  11. }

改变外部数据

react 规定,组件不能改变 props 外部数据。如果需要改变,则需要同时传递一个改变数据的方法进来,在恰当的时机调用。

  1. import { useState } from "react";
  2. function MyButton({ title, handleClick }) {
  3. return (
  4. <button onClick="{handleClick}">{ title }</button>
  5. )
  6. }
  7. // 使用
  8. function App() {
  9. const [title, setTitle] = useState("I'm a button");
  10. function handleClick() {
  11. setTitle("new text");
  12. }
  13. return (
  14. <MyButton title="{title}" handleClick="{handleClick}"/>
  15. )
  16. }