ReactuseState Hook


ReactuseStateHook 允许我们跟踪函数组件中的状态。

状态通常是指应用程序中需要跟踪的数据或属性。


ImportuseState

要使用useState钩子,我们首先需要import它进入我们的组件。

例子:

在组件的顶部,import这个useState钩。

import { useState } from "react";

请注意,我们正在解构useStatereact因为它是命名导出。

要了解有关解构的更多信息,请查看ES6部分


初始化useState

我们通过调用来初始化我们的状态useState在我们的函数组件中。

useState接受初始状态并返回两个值:

  • 目前的状态。
  • 更新状态的函数。

例子:

在函数组件顶部初始化状态。

import { useState } from "react";

function FavoriteColor() {
  const [color, setColor] = useState("");
}

再次注意,我们正在解构来自的返回值useState

第一个值,color,是我们当前的状态。

第二个值,setColor,是用于更新状态的函数。

这些名称是变量,您可以随意命名。

最后,我们将初始状态设置为空字符串:useState("")



读取状态

现在,我们可以将状态包含在组件中的任何位置。

例子:

在渲染组件中使用状态变量。

import { useState } from "react";
import ReactDOM from "react-dom/client";

function FavoriteColor() {
  const [color, setColor] = useState("red");

  return <h1>My favorite color is {color}!</h1>
}

const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(<FavoriteColor />);

运行示例 »


更新状态

为了更新我们的状态,我们使用状态更新器函数。

我们永远不应该直接更新状态。前任:color = "red"不允许。

例子:

使用按钮更新状态:

import { useState } from "react";
import ReactDOM from "react-dom/client";

function FavoriteColor() {
  const [color, setColor] = useState("red");

  return (
    <>
      <h1>My favorite color is {color}!</h1>
      <button
        type="button"
        onClick={() => setColor("blue")}
      >Blue</button>
    </>
  )
}

const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(<FavoriteColor />);

运行示例 »


国家可以持有什么

这个useStateHook 可用于跟踪字符串、数字、布尔值、数组、对象以及这些的任意组合!

我们可以创建多个状态 Hook 来跟踪各个值。

例子:

创建多个状态Hook:

import { useState } from "react";
import ReactDOM from "react-dom/client";

function Car() {
  const [brand, setBrand] = useState("Ford");
  const [model, setModel] = useState("Mustang");
  const [year, setYear] = useState("1964");
  const [color, setColor] = useState("red");

  return (
    <>
      <h1>My {brand}</h1>
      <p>
        It is a {color} {model} from {year}.
      </p>
    </>
  )
}

const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(<Car />);

运行示例 »

或者,我们可以只使用一种状态并包含一个对象!

例子:

创建一个包含对象的 Hook:

import { useState } from "react";
import ReactDOM from "react-dom/client";

function Car() {
  const [car, setCar] = useState({
    brand: "Ford",
    model: "Mustang",
    year: "1964",
    color: "red"
  });

  return (
    <>
      <h1>My {car.brand}</h1>
      <p>
        It is a {car.color} {car.model} from {car.year}.
      </p>
    </>
  )
}

const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(<Car />);

运行示例 »

由于我们现在跟踪单个对象,因此在渲染组件时需要引用该对象,然后引用该对象的属性。 (前任:car.brand


更新状态中的对象和数组

当状态更新时,整个状态将被覆盖。

如果我们只想更新汽车的颜色怎么办?

如果我们只打电话setCar({color: "blue"}),这将从我们的状态中删除品牌、型号和年份。

我们可以使用 JavaScript 扩展运算符来帮助我们。

例子:

使用 JavaScript spread 运算符仅更新汽车的颜色:

import { useState } from "react";
import ReactDOM from "react-dom/client";

function Car() {
  const [car, setCar] = useState({
    brand: "Ford",
    model: "Mustang",
    year: "1964",
    color: "red"
  });

  const updateColor = () => {
    setCar(previousState => {
      return { ...previousState, color: "blue" }
    });
  }

  return (
    <>
      <h1>My {car.brand}</h1>
      <p>
        It is a {car.color} {car.model} from {car.year}.
      </p>
      <button
        type="button"
        onClick={updateColor}
      >Blue</button>
    </>
  )
}

const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(<Car />);

运行示例 »

因为我们需要状态的当前值,所以我们将一个函数传递给我们的setCar功能。该函数接收先前的值。

然后我们返回一个对象,传播previousState并仅覆盖颜色。


通过练习测试一下

练习:

完成此语句以使用 useState Hook 跟踪 "count" 变量。

import { useState } from "react";

function KeepCount() {
  const [, ] = useState(0);
}

开始练习