Việc cập nhật state không làm thay đổi giá trị hiện tại mà chỉ giúp trigger quá trình re-render. Trong quá trình re-render, giá trị của state sẽ được gán bởi một giá trị mới được trả về từ useState.

Ví dụ:

import { useState } from "react"
 
function App() {
  const [name, setName] = useState("Taylor")
 
  function handleClick() {
    setName("Robin")
    console.log(name) // Still "Taylor"!
  }
 
  return (
    <>
      <p>My name is {name}</p>
      <button onClick={handleClick}>Change name</button>
    </>
  )
}

Giả sử chúng ta cập nhật state dựa trên giá trị hiện tại nhiều lần liên tiếp:

import { useState } from "react"
 
function App() {
  const [number, setNumber] = useState(0)
 
  function handleClick() {
    setNumber(number + 1)
    setNumber(number + 1)
    setNumber(number + 1)
  }
 
  return (
    <div>
      <h1>{number}</h1>
      <button onClick={addOne}>Add Three</button>
    </div>
  )
}

Các dòng cập nhật state ở trên sẽ tương đương với:

setNumber(0 + 1)
setNumber(0 + 1)
setNumber(0 + 1)

Có thể thấy, mặc dù có 3 lần cập nhật state nhưng 3 lần này đều cập nhật giá trị của state thành 1 do giá trị hiện tại của state vẫn chưa bị thay đổi.

Để có thể cập nhật state dựa trên state trước đó, ta cần sử dụng kỹ thuật functional update.

Resources