React hooks之useState

345 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第19天,点击查看活动详情

useState 允许你在React函数组件中添加state的Hook, 在class类组件中我们通过在构造函数constructor中定义state,并为其初始化值。然而函数式组件我们以前也叫做无状态组件就是没有state,无法使用state。hooks中给我们提供了可以和类组件功能一样的状态useState

使用

可以通过useState定义一个状态,可以是基础类型也可以是引用类型。

语法类型定义

useState函数接收一个初始化值的参数可以为空,可以是一个普通值也可以是一个无参函数,返回一个值。 函数返回一个数组,数组第一个值就是状态值,第二个是一个修改状态值的函数,这个函数只有一个参数,是状态的新值或者是一个修改上一次状态值为新值的函数。

// 语法类型定义
type SetStateAction<S> = S | ((prevState: S) => S);
type Dispatch<A> = (value: A) => void;

function useState<S>(initialState: S | (() => S)): [S, Dispatch<SetStateAction<S>>];
function useState<S = undefined>(): [S | undefined, Dispatch<SetStateAction<S | undefined>>];

使用例子

开始时给count赋一个0的初始值,通过点击事件每次通过setCount方法 给count 加 1。

const Demo: React.FC = (props) => {
  // 通过ES6解构useState返回的数组值。
  const [count, setCount] = useState<number>(0);
  return (
    <React.Fragment>
      <div>{count}</div>
      <button onClick={() => setCount(count + 1)}>点击</button>
      // 建议修改状态值时使用函数的形式。
      <button onClick={() => setCount((prevCunt) => prevCunt + 1)}>点击</button>
    </React.Fragment>
  )
}

注意事项

  1. 在使用时useState要放到函数最外层,不要嵌套在if等语句中,因为useState会根据加载顺序维护state值,加上if语句等会改变加载顺序导致state错误。
  2. useState和setState一样的是异步的但是它没有setState一样的可以接收一个回调方法获取最新的状态是,useState得结合useEffect使用。