hook useState
useState hook sprendžia problema, dėl reactyvumo
useState(parametras)parametras gali buti bet kas, objektas, funkcija ir t.t. Nurodomas default parametras.- grąžina pirmu parametru
value- reikšme - grąžina antru parametru
setValuemechanizmą pakeisti tai reikšmei
const [value, setValue] = useState(0)
Inputo kontrolė, naudojant onCahnge handler
onChange={event => {
setValue(event.currentTarget.value)
}}
const [count, setCount] = useState(0) // then in a click event handler or something: setCount (count + 1) // but this is the exact same thing: setCount (previousCount => previousCount + 1)
setCount (previousCount => previousCount + 1) - leidžia inkapsuliuoti ir leidžia išventi count pasikeitimo nelaiku
Pavyzdys
Principai
State laikome taip
[
'X', '0', 'X',
'X', '0', '0',
'X', 'X', '0'
]
setCount(currentCount => { return currentCount + 1 })
const newSquares = squares.with (index, 'X')
Realizacija
const defaultState = Array(9).fill(null)
...
const [squares, setSquares] = useState(defaultState)
...
setSquares(previousSquares => {
const newSquares = previousSquares.with(index, nextValue)
return newSquares
})
...
function restart() {
setSquares(defaultState)
}
function renderSquare (i: number) {
return (
<button className="square" onClick={() => selectSquare(i)}>
{squares[i]}
</button>
)
}
Pavyzdys su localState
const [squares, set Squares] = useState<Squares>(() => { const squares = localStorage.getItem(key) if (!squares) return defaultState try { return JSON.parse(squares) } catch { return defaultState } }) useEffect (() => { localStorage.setItem(key, JSON.stringify(squares)) } [squares])
State optimizavimo pvz
const [count, setCount] = useState(0) ... setCount(0) // <-- will not trigger a rerender if the state is still 0
const [state, setState] useState({ count: 0 }) ... setState({ count: 0 }) // <-- will trigger a rerender setState(previousState => ({ count: previousState.count, })) // <-- will trigger a rerender setState(previousState => previousState) // <-- will not trigger a rerender
if (prevParams.toString() === searchParams.toString()) {patikriname ar pasikeitė, kad išvengti renderinimo
function setSearchParams(...args: Parameters<typeof setGlobalSearchParams>){ console.log('setting search params') const searchParams = setGlobalSearchParams(...args) setSearchParamsState(prevParams => { if (prevParams.toString() === searchParams.toString()) { return prevParams } return searchParams }) return searchParams }