菜单
×
   ❮     
HTML CSS JAVASCRIPT SQL PYTHON JAVA PHP HOW TO W3.CSS C C++ C# BOOTSTRAP REACT MYSQL JQUERY EXCEL XML DJANGO NUMPY PANDAS NODEJS R TYPESCRIPT ANGULAR GIT POSTGRESQL MONGODB ASP AI GO KOTLIN SASS VUE DSA GEN AI SCIPY AWS CYBERSECURITY DATA SCIENCE
     ❯   

React useState Hook


React useState Hook 允许我们在函数组件中跟踪状态。

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


导入 useState

要使用 useState Hook,我们首先需要将其 import 到我们的组件中。

示例

在组件的顶部,import useState Hook。

import { useState } from "react";

请注意,我们正在从 react 中解构 useState,因为它是命名导出。

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


初始化 useState

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

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

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

示例

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

import { useState } from "react";

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

请注意,我们再次从 useState 中解构返回的值。

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

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

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

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


w3schools CERTIFIED . 2022

获得认证!

完成 React 模块,完成练习,参加考试,并获得 w3schools 认证!

$95 注册

读取状态

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

示例

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

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 />);

运行示例 »


状态可以包含什么

useState Hook 可用于跟踪字符串、数字、布尔值、数组、对象以及它们的任何组合!

我们可以创建多个状态 Hooks 来跟踪单独的值。

示例

创建多个状态 Hooks

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 展开运算符仅更新汽车的颜色

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 并仅覆盖颜色。



×

联系销售

如果您想将 W3Schools 服务用于教育机构、团队或企业,请发送电子邮件给我们
sales@w3schools.com

报告错误

如果您想报告错误,或想提出建议,请发送电子邮件给我们
help@w3schools.com

W3Schools 经过优化,旨在方便学习和培训。示例可能经过简化,以提高阅读和学习体验。教程、参考资料和示例会不断审查,以避免错误,但我们无法保证所有内容的完全正确性。使用 W3Schools 即表示您已阅读并接受我们的使用条款Cookie 和隐私政策

版权所有 1999-2024 Refsnes Data。保留所有权利。W3Schools 由 W3.CSS 提供支持