React logo

useState โ€“ Basics

ืชื•ื›ืŸ ืขื ื™ื™ื ื™ื

  1. ืžื” ื–ื” useState?
  2. Destructuring (Array) โ€“ ืื™ืš ืฉื•ืœืคื™ื ืืช ื”ืขืจื›ื™ื
  3. ื“ื•ื’ืžื” ื‘ืกื™ืกื™ืช: Counter
  4. ื›ืžื” ืกื˜ื™ื™ื˜ื™ื ื ืคืจื“ื™ื (name/age/hobby)
  5. ืกื˜ื™ื™ื˜ ื›ืื•ื‘ื™ื™ืงื˜ ืื—ื“
  6. ืขื“ื›ื•ืŸ ืคื•ื ืงืฆื™ื•ื ืœื™ ื•ืœืžื” ื”ื•ื ื—ืฉื•ื‘
  7. ืžืชื™ ืžืชื‘ืฆืข re-render?

1) ืžื” ื–ื” useState?

useState ื”ื•ื Hook ืฉืžืืคืฉืจ ืœืจื›ื™ื‘ื™ ืคื•ื ืงืฆื™ื” ื‘ืจื™ืืงื˜ ืœื”ื—ื–ื™ืง ืžืฆื‘ (state). ื”ื•ื ืžื—ื–ื™ืจ ืžืขืจืš ืขื ืฉื ื™ ืื™ื‘ืจื™ื:
โ€ข ื”ืขืจืš ื”ื ื•ื›ื—ื™ ืฉืœ ื”ึพstate
โ€ข ืคื•ื ืงืฆื™ื” ืฉืžืขื“ื›ื ืช ืืช ื”ึพstate (ื”ืขื“ื›ื•ืŸ ื’ื•ืจืจ re-render ืฉืœ ื”ืจื›ื™ื‘)

ื”ึพHook ืžืงื‘ืœ ืขืจืš ื”ืชื—ืœืชื™ ื›ืืจื’ื•ืžื ื˜ (ื”ื‘ืจื™ืจืช ืžื—ื“ืœ ืฉืœ ื”ึพstate). ื›ืœ ืงืจื™ืื” ืœืคื•ื ืงืฆื™ื™ืช ื”ืขื“ื›ื•ืŸ ืชื›ื ื™ืก ืขื“ื›ื•ืŸ ืœืชื•ืจ, ื•ึพReact ืชืจื ื“ืจ ืžื—ื“ืฉ ืืช ื”ืจื›ื™ื‘ ืขื ื”ืขืจืš ื”ืžืขื•ื“ื›ืŸ.

ื‘ื“ื•ื’ืžื” ื”ื‘ืื” ื ืจืื” ืืช ื—ืชื™ืžืช ื”ื‘ืกื™ืก ืฉืœ useState โ€” ืื™ืš ืžื’ื“ื™ืจื™ื state, ื•ืื™ืš ืžื‘ืฆืขื™ื destructuring ื›ื“ื™ ืœืงื‘ืœ ืืช ื”ืขืจืš ื•ืืช ืคื•ื ืงืฆื™ื™ืช ื”ืขื“ื›ื•ืŸ.

import { useState } from 'react';

// ื—ืชื™ืžื” ื‘ืกื™ืกื™ืช:
const [stateValue, setStateValue] = useState(defaultValue);

// ื“ื•ื’ืžื” ืงืฆืจื”:
const [isOpen, setIsOpen] = useState(false);
setIsOpen(true); // ื™ื’ืจื•ื ืœ-re-render ืขื isOpen=true

2) Destructuring (Array)

ืžื›ื™ื•ื•ืŸ ืฉึพuseState ืžื—ื–ื™ืจ ืžืขืจืš, ืžืงื•ื‘ืœ ืœื”ืฉืชืžืฉ ื‘ึพArray Destructuring ื›ื“ื™ ืœืฉืœื•ืฃ ืืช ืฉื ื™ ื”ืื™ื‘ืจื™ื ืœึพ2 ืžืฉืชื ื™ื. ื”ืฉื ื”ืจืืฉื•ืŸ ื”ื•ื ื”ึพstate, ื•ื”ืฉื ื™ ื”ื•ื ืคื•ื ืงืฆื™ื™ืช ื”ืขื“ื›ื•ืŸ (ืžืงื•ื‘ืœ ืœื”ื•ืกื™ืฃ ืงื™ื“ื•ืžืช set).

ื›ืš ืขื•ืฉื™ื Destructuring ื‘ืฆื•ืจื” ืงืจื™ืื”: ืฉื ื”ึพstate ืžืกื‘ื™ืจ ืžื” ื ืฉืžืจ, ื•ืฉื ืคื•ื ืงืฆื™ื™ืช ื”ืขื“ื›ื•ืŸ ืžืกื‘ื™ืจ ืžื” ื”ื™ื ืžืขื“ื›ื ืช.

const [count, setCount] = useState(0);
const [name, setName] = useState('peter');

3) ื“ื•ื’ืžื” ื‘ืกื™ืกื™ืช: Counter

ื›ืืŸ ื ืฉืชืžืฉ ื‘ึพuseState ื›ื“ื™ ืœื”ื—ื–ื™ืง ืžื•ื ื”. ื›ืœ ืœื—ื™ืฆื” ืขืœ ื”ื›ืคืชื•ืจ ืชืงืคื™ืฅ ืืช ื”ืขืจืš. ืฉื™ื ืœื‘: ืงืจื™ืื” ืœึพsetCount ืชื’ืจื•ื ืœึพre-render.

ื‘ื“ื•ื’ืžื”: count ื”ื•ื ื”ืขืจืš, ื•ึพsetCount ื”ื™ื ืคื•ื ืงืฆื™ื™ืช ื”ืขื“ื›ื•ืŸ. ื‘ืจื™ืจืช ืžื—ื“ืœ 0, ื•ื‘ืœื—ื™ืฆื” ืื ื—ื ื• ืฉื•ืœื—ื™ื ืขืจืš ื—ื“ืฉ.

import { useState } from 'react';

function Counter() {
  const [count, setCount] = useState(0);
  return (
    <>
      <p>count: {count}</p>
      <button className='btn' onClick={() => setCount(count + 1)}>
        +
      </button>
    </>
  );
}
ื“ื•ื’ืžื” ื—ื™ื”
0

4) ื›ืžื” ืกื˜ื™ื™ื˜ื™ื ื ืคืจื“ื™ื (name/age/hobby)

ืœืคืขืžื™ื ื ื•ื— ืœื”ืคืจื™ื“ ื‘ื™ืŸ ืขืจื›ื™ื ืฉื•ื ื™ื ืœึพstate ื ืคืจื“ ืœื›ืœ ืฉื“ื”. ื–ื” ื”ื•ืคืš ืขื“ื›ื•ื ื™ื ืœืคืฉื•ื˜ื™ื ื•ืžืžื•ืงื“ื™ื.

ื›ืืŸ ื ื’ื“ื™ืจ ืฉืœื•ืฉื” ืกื˜ื™ื™ื˜ื™ื: name, age, hobby. ื›ืคืชื•ืจ ืื—ื“ ื™ืขื“ื›ืŸ ืืช ืฉืœื•ืฉืชื.

import { useState } from 'react';

const UseStateObject = () => {
  const [name, setName] = useState('peter');
  const [age, setAge] = useState(24);
  const [hobby, setHobby] = useState('read books');

  const displayPerson = () => {
    setName('john');
    setAge(28);
    setHobby('scream at the computer');
  };
  return (
    <>
      <h3>{name}</h3>
      <h3>{age}</h3>
      <h4>Enjoys To: {hobby}</h4>
      <button className='btn' onClick={displayPerson}>
        show john
      </button>
    </>
  );
};

export default UseStateObject;
ื“ื•ื’ืžื” ื—ื™ื”
name: peter
age: 24
hobby: read books

5) ืกื˜ื™ื™ื˜ ื›ืื•ื‘ื™ื™ืงื˜ ืื—ื“

ื‘ืžืงื•ื ื›ืžื” ืกื˜ื™ื™ื˜ื™ื, ืืคืฉืจ ืœืจื›ื– ืื•ืชื ืœืื•ื‘ื™ื™ืงื˜ ืื—ื“. ื–ื” ืฉื™ืžื•ืฉื™ ื›ืฉืฉื“ื•ืช ืงืฉื•ืจื™ื ื™ื—ื“. ื—ืฉื•ื‘: ืื ืžืขื“ื›ื ื™ื ืจืง ืฉื“ื” ืื—ื“, ื™ืฉ ืœื”ืฉืชืžืฉ ื‘ึพspread ื›ื“ื™ ืœื ืœื“ืจื•ืก ืื—ืจื™ื.

ื›ืืŸ ืื ื• ืžื—ื–ื™ืงื™ื ืืช ื›ืœ ืคืจื˜ื™ ื”ืžืฉืชืžืฉ ืชื—ืช person, ื•ืžืขื“ื›ื ื™ื ืืช ื›ืœ ื”ืื•ื‘ื™ื™ืงื˜ ื‘ืœื—ื™ืฆื”.

import { useState } from 'react';

const UseStateObject = () => {
  const [person, setPerson] = useState({
    name: 'peter',
    age: 24,
    hobby: 'read books',
  });

  const displayPerson = () => {
    setPerson({ name: 'john', age: 28, hobby: 'scream at the computer' });
    // ืขื“ื›ื•ืŸ ื—ืœืงื™ ื ื›ื•ืŸ:
    // setPerson(prev => ({ ...prev, name: 'susan' }));
  };
  return (
    <>
      <h3>{person.name}</h3>
      <h3>{person.age}</h3>
      <h4>Enjoys To: {person.hobby}</h4>
      <button className='btn' onClick={displayPerson}>
        show john
      </button>
    </>
  );
};

export default UseStateObject;
ื“ื•ื’ืžื” ื—ื™ื”
name: peter
age: 24
hobby: read books

6) ืขื“ื›ื•ืŸ ืคื•ื ืงืฆื™ื•ื ืœื™ โ€“ ื›ืฉื”ืขืจืš ืชืœื•ื™ ื‘ืขืจืš ื”ืงื•ื“ื

ืœืžื” ืฆืจื™ืš? ื”ืงืจื™ืื” ืœึพsetState ืœื ืžืขื“ื›ื ืช ืžื™ื™ื“ื™ืช โ€” ื•ืœื›ืŸ ืื ื”ืขืจืš ื”ื—ื“ืฉ ืชืœื•ื™ ื‘ืขืจืš ื”ืงื•ื“ื, ืขื“ื™ืฃ ืœื”ืฉืชืžืฉ ื‘ืฆื•ืจื” ื”ืคื•ื ืงืฆื™ื•ื ืœื™ืช: setState(prev => next) . ื–ื” ืžื‘ื˜ื™ื— ืฉืชืฉืชืžืฉื• ื‘ืขืจืš ื”ืขื“ื›ื ื™.

ื”ื“ื•ื’ืžื” ื”ืจืืฉื•ื ื” ืžืขืœื” ืžื•ื ื” ื‘ื‘ื˜ื—ื”. ื”ื“ื•ื’ืžื” ื”ืฉื ื™ื™ื” ืžืจืื” ืื™ืš ืœืขืฉื•ืช ื–ืืช ื’ื ืื—ืจื™ ื”ืฉื”ื™ื™ื” (timeout).

const [value, setValue] = useState(0);

// ืชืœื•ื™ ื‘ืขืจืš ื”ืงื•ื“ื:
setValue(prev => prev + 1);

// ืื•ื‘ื™ื™ืงื˜ ืชืœื•ื™ึพืขืจืš:
setState(prev => ({ ...prev, count: prev.count + 1 }));
ื“ื•ื’ืžื” ื—ื™ื”
0

7) ืžืชื™ ืžืชื‘ืฆืข Re-render?

  • ื›ืœ ืงืจื™ืื” ืœึพsetState ืฉืžื—ืœื™ืคื” ืขืจืš ื‘ืžืฉื”ื• ื—ื“ืฉ ืชื’ืจื•ื ืœึพre-render.
  • React 18 ืขื•ืฉื” Auto-batching: ื›ืžื” ืขื“ื›ื•ื ื™ื ืฆืžื•ื“ื™ื ื‘ืื•ืชื• event-loop ื™ืื•ื—ื“ื• ืœืจื™ื ื“ื•ืจ ืื—ื“.
  • ืื ืชื“ืคื™ืกื• ืœืœื•ื’ ืžื™ื“ ืื—ืจื™ setState, ืชืจืื• ืืช ื”ืขืจืš ื”ื™ืฉืŸ. ื”ืจื™ื ื“ื•ืจ ื”ื—ื“ืฉ ื™ื’ื™ืข ืžื™ื“ ืœืื—ืจ ืžื›ืŸ.

๐Ÿ“š ืžืงื•ืจื•ืช ืžื•ืžืœืฆื™ื (Docs) โ€“ useState

ืขืžื•ื“ื™ ืชื™ืขื•ื“ ืจืฉืžื™ื™ื ืœื”ื‘ื ืช useState ืœืขื•ืžืง, ื“ืคื•ืกื™ ืขื“ื›ื•ืŸ ื•ืืจื›ื™ื˜ืงื˜ื•ืจืช state: