useState

useState 是一个 React Hook(函数),它允许我们向组件添加一个 状态变量 ,从而控制影响组件的渲染结果。

本质:和普通JS变量不同的是,状态变量一旦发生变化,组件的视图UI也会跟着变化(数据驱动视图

基本使用

useState 接收一个参数作为状态的初始值,并返回一个包含两个元素的数组,第一个元素是当前的状态值,第二个元素是更新该状态的函数。

调用 setState 函数更新 state 将会重新渲染组件

1const [state, setState] = useState(initialState)

对于基本类型的使用

1import { useState } from "react";
2
3export default function App() {
4  let [count, setCount] = useState<number>(0);
5  function handler() {
6    setCount(count + 1);
7  }
8  return (
9    <>
10      <button onClick={handler}>{count}</button>
11    </>
12  );
13}

对于复杂类型的使用

在 React 中,状态被认为是只读的,因此 你应该替换它而不是改变现有对象

数组

1import { useState } from "react";
2
3export default function App() {
4  let [arr, setArr] = useState([1, 2, 3]);
5  function handler() {
6    setArr([...arr, 4]);
7  }
8  return (
9    <>
10      <button onClick={handler}>{arr}</button>
11    </>
12  );
13}

对象

1import { useState } from "react";
2
3export default function App() {
4  let [obj, setObj] = useState(() => {
5    // 处理逻辑,一定要返回值
6    // 这个函数只会初始化执行一次
7    return {
8      name: "dancy",
9      age: 18,
10    };
11  });
12  function handler() {
13    // 写法一
14    // setObj({
15    //   ...obj,
16    //   age: obj.age + 1,
17    // });
18
19    // 写法二:传递一个更新函数
20    // setObj((prev) => {
21    //   return {
22    //     ...prev,
23    //     age: prev.age + 1,
24    //   };
25    // });
26
27    // 写法三
28    setObj(Object.assign({}, obj, { age: obj.age + 1 }));
29  }
30  return (
31    <>
32      <div>{obj.name}</div>
33      <div>{obj.age}</div>
34      <button onClick={handler}>更新</button>
35    </>
36  );
37}