๐งฉ์งง์ ์๊ฐ์ ์ ์ ์ ๋ ฅ ๋ฑ์ ์ด๋ฒคํธ๊ฐ ๋ง์ด ์ผ์ด๋๋ ๊ฒฝ์ฐ ํ๋ฉด์ด ๋๊ธธ ์ ์๋ ๊ฒฝ์ฐ๊ฐ ์๋๋ฐ ์ด๋ useDeferredValue& useTransition ์ฌ์ฉํ์ฌ ๋ณด์์ ํ ์ ์๋ค
useTransition
useTransition ํน์ ์ํ ์ ๋ฐ์ดํธ์ ์ฐ์ ์์๊ฐ ๋ฎ์์ ์๋ฆฌ๋ ๋ฐ ์ฌ์ฉํ ์ ์๋ค
React state๋ฅผ ์ ๋ฐ์ดํธํ ๋ ํธ๋์ง์ ์ ์ถ๊ฐํ์ฌ ์ํ ์ ๋ฐ์ดํธ๋ฅผ ๋ถ๋๋ฝ๊ฒ ์ฒ๋ฆฌํ๊ฒ ๋์์ค๋ค
์ฌ์ฉ์๊ฐ ํ๋ฉด์ ์คํฌ๋กคํ๊ฑฐ๋, ํ์ด์ง๋ฅผ ์ด๋ํ ๋ ์ฌ์ฉ๋๋ค ์ฌ์ฉ์๊ฐ ๋ค์ ํ์ด์ง๋ฅผ ํด๋ฆญํ๋ฉด, ์๋ก์ด ํ์ด์ง๊ฐ ๋ก๋๋๊ธฐ ์ ์ ๊ธฐ์กด ํ์ด์ง ์ ํ์ ๋ถ๋๋ฝ๊ฒ ๋ง๋ค์ด์ค๋ค
=> ๋ค๋ฅธ ๋ชจ๋ ์ํ ์ ๋ฐ์ดํธ ๋๋ UI ๋ ๋๋ง ํธ๋ฆฌ๊ฑฐ์ ์ฐ์ ์์๊ฐ ๋ ๋์
๋น๋๊ธฐ ์์ ์ ์์ํ๋ ์์ ์์ ์ผ์์ ์ผ๋ก UI๋ฅผ ์ง์ฐ์์ผ ๋ก๋ฉ ์ค์์ ์๋ฆฌ๊ณ , ์์ ์ด ์๋ฃ๋ ๋๊น์ง ๋๊ธฐ ์ํ๋ฅผ ์ ์งํ์ฌ ์ฌ์ฉ์ ๊ฒฝํ์ ๊ฐ์ ํ ์ ์๋ค.
const [isPending, startTransition] = useTransition();
isPending๋ ํ์ฌ ํธ๋์ง์ ์ํ๋ฅผ ๋ํ๋ด๋ฉฐ ์ฐ์ ์์๊ฐ ๋ฎ์ ์ํ ์ ๋ฐ์ดํธ๊ฐ ์์ง ๋ณด๋ฅ ์ค ์ธ์ง์ฌ๋ถ๋ฅผ ์๋ ค์ค ๋ startTransition์ ํธ๋์ง์ ์ ์์ํ๋ ํจ์
startTransition ํจ์๋ ์ฝ๋ฐฑ ํจ์๋ฅผ ์ธ์๋ก ๋ฐ์ ์คํํ๋ฉฐ, ์ด ์ฝ๋ฐฑ ํจ์ ๋ด์์ ์ํ๋ฅผ ๋ณ๊ฒฝํ๋ ์์
์ ์ํํ ์ ์๋ค.
useDeferredValue
์ฝ๋๋ฅผ ๋ํํ๊ณ ๋ฎ์ ์ฐ์ ์์๋ก ์ฒ๋ฆฌํ ์ง ๊ฒฐ์ ํ๋ฏ๋ก ์์ ํ ์ ์ด๊ฐ ๊ฐ๋ฅ
์ฌ์ฉ์๊ฐ ์ ๋ ฅ์ ํ๊ฑฐ๋ ์๋ฒ์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ฌ ๋ ์ฌ์ฉ๋๋ค
์๋ฅผ ๋ค์ด, ์ฌ์ฉ์๊ฐ ๊ฒ์์ฐฝ์ ์ ๋ ฅ์ ํ ๋๋ง๋ค ๊ฒ์ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ ธ์ค๋ API ํธ์ถ์ ์ํํ๊ฒ ๋๋ฉด, ๊ฒ์์ด๊ฐ ๋ฐ๋ ๋๋ง๋ค API๋ฅผ ํธ์ถํ์ฌ ๋ถํ์ํ ํธ์ถ์ด ๋ฐ์ํ ์ ์๋๋ฐ ์ด๋ฐ ๊ฒฝ์ฐ useDeferredValue๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์ ์ ๋ ฅ์ด ์ผ์ ์๊ฐ ๋์ ์ ์ง๋๋ ๊ฒฝ์ฐ์๋ง API๋ฅผ ํธ์ถํ๋๋กํ๋ค
=>useMemo์ ์ ์ฌํ๊ฒ ์ด์ ๊ฐ์ ๊ณ์ ๋ค๊ณ ์์ผ๋ฉด์ ์ ๋ฐ์ดํธ๋ฅผ ์ง์ฐ ์ํจ๋ค
๋ฏธ์ ์ฉ์
import { useState } from "react";
import classes from "./ex.module.css";
function Ex() {
const [name, setName] = useState("");
let array = new Array(10000).fill(0);
return (
<div>
<input
className={classes.i}
onChange={(e) => {
setName(e.target.value);
}}
/>
{array.map((_, idx) => {
return (
<div className={classes.a} key={idx}>
{name}
</div>
);
})}
</div>
);
}
export default Ex;
useDeferredValue& useTransition์ ์ฉ
import { useState, useTransition, useDeferredValue } from "react";
import classes from "./ex.module.css";
function Ex() {
const [name, setName] = useState("");
const [isPending, startTransition] = useTransition();
let array = new Array(10000).fill(0);
let ๋ฆ๊ฒ์ฒ๋ฆฌํ ๊ฑฐ_๋ด๊ธฐ = useDeferredValue(name);
return (
<div>
<input
className={classes.i}
onChange={(e) => {
startTransition(() => {
setName(e.target.value);
});
}}
/>
{isPending
? "๋ก๋ฉ์ค์
๋๋ค...."
: array.map((_, idx) => {
return (
<div className={classes.a} key={idx}>
{๋ฆ๊ฒ์ฒ๋ฆฌํ ๊ฑฐ_๋ด๊ธฐ}
</div>
);
})}
</div>
);
}
export default Ex;
์์ ์์ ์ ๋ค๋ก ๋ฏธ๋ฃฐ ์ ์๋ค!
useDeferredValue๋ ์ ๋ ฅ์ ์ง์ฐ์ํค๋ ๊ฒฝ์ฐ์ ์ฌ์ฉํ๊ณ , useTransition์ ํ๋ฉด ์ ํ์ ๋ถ๋๋ฝ๊ฒ ์ฒ๋ฆฌํ๋ ๊ฒฝ์ฐ์ ์ฌ์ฉ
๐๊ธฐ์กด์ ๋๋ฐ์ด์ฑ, ์ค๋กํ๋ง์ ์ฌ์ฉ์ ์ ๋งคํ์ฒ๋ฆฌ?(๋๋ฐ์ด์ฑ๊ณผ ์ค๋กํ๋ง์์ ์ ์ ํ ๋๋ ์ด๋ฅผ ์ ํํ๋ ๊ฒ์ ๊ฝค ์ด๋ ต๋ค )์ฐํํ๋ ๋ฌธ์ ๋ฅผ react hooks api ๋ก ์ง์ ํด๊ฒฐํ ์ ์๊ฒ ๋์๋ค
'React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ฆฌ์กํธ ์ค์ฒฉ ๋ผ์ฐํ (Nested Routing) (6) | 2023.03.24 |
---|---|
axios ์ธํฐ์ ํฐ๋ก ์๋๋ก๊ทธ์ธ ๊ตฌํ (6) | 2023.03.17 |
ref๋ฅผ prop์ผ๋ก ๋๊ธฐ๊ธฐ( forWardRef) (6) | 2023.03.10 |
react query (5) | 2023.02.23 |
๋ผ์ดํ์ฌ์ดํด๊ณผ useEffect (6) | 2023.02.16 |