incompatible-library
๋ฉ๋ชจ์ด์ ์ด์ (์๋ ๋๋ ์๋)๊ณผ ํธํ๋์ง ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ์ ๋ํด ๊ฒ์ฆํฉ๋๋ค.
๊ท์น ์ธ๋ถ ์ฌํญ
์ผ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ React์์ ์ง์ํ์ง ์๋ ํจํด์ ์ฌ์ฉํฉ๋๋ค. ๋ฆฐํฐ๊ฐ ์๋ ค์ง ๋ชฉ๋ก์์ ์ด๋ฌํ API์ ์ฌ์ฉ์ ๊ฐ์งํ๋ฉด ์ด ๊ท์น์ ๋ฐ๋ผ ํ๋๊ทธ๋ฅผ ์ง์ ํฉ๋๋ค. ์ด๋ React ์ปดํ์ผ๋ฌ๊ฐ ์ฑ์ ์์์ํค์ง ์๊ธฐ ์ํด ์ด๋ฌํ ํธํ๋์ง ์๋ API๋ฅผ ์ฌ์ฉํ๋ ์ปดํฌ๋ํธ๋ฅผ ์๋์ผ๋ก ๊ฑด๋๋ธ ์ ์์์ ์๋ฏธํฉ๋๋ค.
// ์ด๋ฌํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ๋ฉ๋ชจ์ด์ ์ด์
์ด ๊นจ์ง๋ ์์
function Form() {
const { watch } = useForm();
// โ 'name' ํ๋๊ฐ ๋ณ๊ฒฝ๋์ด๋ ์ด ๊ฐ์ ์ ๋ ์
๋ฐ์ดํธ๋์ง ์์ต๋๋ค
const name = useMemo(() => watch('name'), [watch]);
return <div>Name: {name}</div>; // UI๊ฐ "์ผ์ด๋ถ์" ๊ฒ์ฒ๋ผ ๋ณด์
๋๋ค
}React ์ปดํ์ผ๋ฌ๋ React ๊ท์น์ ๋ฐ๋ผ ๊ฐ์ ์๋์ผ๋ก ๋ฉ๋ชจ์ด์ ์ด์
ํฉ๋๋ค. ์๋ useMemo๋ก ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ฉด ์ปดํ์ผ๋ฌ์ ์๋ ์ต์ ํ๋ ๊นจ์ง๋๋ค. ์ด ๊ท์น์ ์ด๋ฌํ ๋ฌธ์ ๊ฐ ์๋ ํจํด์ ์๋ณํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
์์ธํ ์ดํด๋ณด๊ธฐ
๋ผ์ด๋ธ๋ฌ๋ฆฌ API๋ Hook์ ์ค๊ณํ ๋ ๊ณ ๋ คํด์ผ ํ ์ง๋ฌธ ์ค ํ๋๋ API ํธ์ถ์ useMemo๋ก ์์ ํ๊ฒ ๋ฉ๋ชจ์ด์ ์ด์
ํ ์ ์๋์ง ์ฌ๋ถ์
๋๋ค. ๊ทธ๋ ์ง ์๋ค๋ฉด ์๋ ๋ฉ๋ชจ์ด์ ์ด์
๊ณผ React ์ปดํ์ผ๋ฌ ๋ฉ๋ชจ์ด์ ์ด์
๋ชจ๋ ์ฌ์ฉ์์ ์ฝ๋๋ฅผ ์์์ํฌ ๊ฒ์
๋๋ค.
์๋ฅผ ๋ค์ด, ์ด๋ฌํ ํธํ๋์ง ์๋ ํจํด ์ค ํ๋๋ โ๋ด๋ถ ๊ฐ๋ณ์ฑโ์ ๋๋ค. ๋ด๋ถ ๊ฐ๋ณ์ฑ์ ๊ฐ์ฒด๋ ํจ์๊ฐ ์ฐธ์กฐ๋ ๋์ผํ๊ฒ ์ ์ง๋์ง๋ง ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ๋ณ๊ฒฝ๋๋ ์์ฒด ์จ๊ฒจ์ง ์ํ๋ฅผ ์ ์งํ๋ ๊ฒ์ ๋งํฉ๋๋ค. ์ธ๋ถ์์๋ ๋์ผํด ๋ณด์ด์ง๋ง ๋ด์ฉ๋ฌผ์ ์๋ฐํ๊ฒ ์ฌ๋ฐฐ์นํ๋ ์์๋ผ๊ณ ์๊ฐํ๋ฉด ๋ฉ๋๋ค. React๋ ๋ค๋ฅธ ์์๋ฅผ ๋ฐ์๋์ง๋ง ํ์ธํ๊ณ ์์ ๋ฌด์์ด ๋ค์ด ์๋์ง๋ ํ์ธํ์ง ์๊ธฐ ๋๋ฌธ์ ๋ณ๊ฒฝ ์ฌํญ์ ์ ์ ์์ต๋๋ค. ์ด๋ ๋ฉ๋ชจ์ด์ ์ด์ ์ ๊นจ๋จ๋ฆฌ๋๋ฐ, React๋ ๊ฐ์ ์ผ๋ถ๊ฐ ๋ณ๊ฒฝ๋ ๊ฒฝ์ฐ ์ธ๋ถ ๊ฐ์ฒด(๋๋ ํจ์)๊ฐ ๋ณ๊ฒฝ๋๋ ๊ฒ์ ์์กดํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
React API๋ฅผ ์ค๊ณํ ๋์ ๊ฒฝํ ๋ฒ์น์ผ๋ก, useMemo๊ฐ ์ด๋ฅผ ๊นจ๋จ๋ฆด์ง ์๊ฐํด๋ณด์ธ์.
function Component() {
const { someFunction } = useLibrary();
// ์ด์ ๊ฐ์ ํจ์๋ฅผ ๋ฉ๋ชจ์ด์ ์ด์
ํ๋ ๊ฒ์ ํญ์ ์์ ํด์ผ ํฉ๋๋ค
const result = useMemo(() => someFunction(), [someFunction]);
}๋์ , ๋ถ๋ณ ์ํ๋ฅผ ๋ฐํํ๊ณ ๋ช ์์ ์ธ ์ ๋ฐ์ดํธ ํจ์๋ฅผ ์ฌ์ฉํ๋ API๋ฅผ ์ค๊ณํ์ธ์.
// โ
์ข์ ์์: ์
๋ฐ์ดํธ๋ ๋ ์ฐธ์กฐ๊ฐ ๋ณ๊ฒฝ๋๋ ๋ถ๋ณ ์ํ๋ฅผ ๋ฐํ
function Component() {
const { field, updateField } = useLibrary();
// ์ด๊ฒ์ ํญ์ ๋ฉ๋ชจ์ด์ ์ด์
ํ๊ธฐ์ ์์ ํฉ๋๋ค
const greeting = useMemo(() => `Hello, ${field.name}!`, [field.name]);
return (
<div>
<input
value={field.name}
onChange={(e) => updateField('name', e.target.value)}
/>
<p>{greeting}</p>
</div>
);
}์๋ชป๋ ์์
์ด ๊ท์น์ ๋ํ ์๋ชป๋ ์ฝ๋ ์์์ ๋๋ค.
// โ react-hook-form `watch`
function Component() {
const {watch} = useForm();
const value = watch('field'); // ๋ด๋ถ ๊ฐ๋ณ์ฑ
return <div>{value}</div>;
}
// โ TanStack Table `useReactTable`
function Component({data}) {
const table = useReactTable({
data,
columns,
getCoreRowModel: getCoreRowModel(),
});
// table ์ธ์คํด์ค๊ฐ ๋ด๋ถ ๊ฐ๋ณ์ฑ์ ์ฌ์ฉํฉ๋๋ค
return <Table table={table} />;
}์ฌ๋ฐ๋ฅธ ์์
์ด ๊ท์น์ ๋ํ ์ฌ๋ฐ๋ฅธ ์ฝ๋ ์์์ ๋๋ค.
// โ
react-hook-form์ ๊ฒฝ์ฐ `useWatch`๋ฅผ ์ฌ์ฉํ์ธ์
function Component() {
const {register, control} = useForm();
const watchedValue = useWatch({
control,
name: 'field'
});
return (
<>
<input {...register('field')} />
<div>ํ์ฌ ๊ฐ: {watchedValue}</div>
</>
);
}์ผ๋ถ ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์์ง React์ ๋ฉ๋ชจ์ด์ ์ด์ ๋ชจ๋ธ๊ณผ ํธํ๋๋ ๋์ฒด API๊ฐ ์์ต๋๋ค. ๋ฆฐํฐ๊ฐ ์ด๋ฌํ API๋ฅผ ํธ์ถํ๋ ์ปดํฌ๋ํธ๋ Hook์ ์๋์ผ๋ก ๊ฑด๋๋ฐ์ง ์๋๋ค๋ฉด ์ด์๋ฅผ ์ ์ถํ์ฌ ๋ฆฐํฐ์ ์ถ๊ฐํ ์ ์๋๋ก ํด์ฃผ์ธ์.