useRef
useRef๋ก ํน์ DOM ์ ํํ๊ธฐ
โ DOM(๋ฌธ์ ๊ฐ์ฒด ๋ชจ๋ธ): XML์ด๋ HTML๋ฌธ์์ ์ ๊ทผํ๊ธฐ ์ํ ์ผ์ข ์ ์ธํฐํ์ด์ค, ์ด ๊ฐ์ฒด ๋ชจ๋ธ์ ๋ฌธ์ ๋ด์ ๋ชจ๋ ์์๋ฅผ ์ ์ํ๊ณ , ๊ฐ๊ฐ์ ์์์ ์ ๊ทผํ๋ ๋ฐฉ๋ฒ ์ ๊ณต
- ์๋ฐ์คํฌ๋ฆฝํธ์์๋ ํน์ DOM์ ์ ํํด์ผ ํ๋ ์ํฉ์ getElementById, querySelector ๊ฐ์ DOM. Selector ํจ์๋ฅผ ์ฌ์ฉํด์ DOM ์ ํ
- ๋ฆฌ์กํธ์์๋ ref์ฌ์ฉ
- ํจ์ํ ์ปดํฌ๋ํธ: useRef๋ผ๋ Hook ํจ์ ์ฌ์ฉ
- ํด๋์คํ ์ปดํฌ๋ํธ: ์ฝ๋ฐฑ ํจ์ ์ฌ์ฉํ๊ฑฐ๋ React.createRef๋ผ๋ ํจ์ ์ฌ์ฉ
useRef์ฌ์ฉ ์ด์
- ๊ฐ ์ ์ฅ: ํ์ฌ ์ ์ฅํ๊ณ ์ถ์ ๊ฐ์ ๋ฆฌ๋ ๋๋ง ์์ด ์ ์ฅ
- DOM ์ฐธ์กฐ: DOM์ฐธ์กฐ๊ฐ๋ฅ, ํ์ฌ DOM์์ element์ scroll์์น, image์ size ๋ฑ์ ์ฐธ์กฐํ ์ ์๋ค.
- useState๋ก ๊ด๋ฆฌํ๊ฒ ๋๋ฉด, ๋ฆฌ๋ ๋๋ง์ด ๊ณ์ ๋ฐ์ํ๋ฏ๋ก ๋นํจ์จ์ ์ด๊ณ , ์ฝ๋ ๊ตฌํํ๊ธฐ ์ด๋ ค์์ง
import React, { useState, useRef } from "react";
function InputSample() {
const [inputs, setInputs] = useState({
name: "",
nickname: "",
});
const nameInput = useRef();
const { name, nickname } = inputs;//๋น๊ตฌ์กฐํ ํ ๋น์ ํตํด ๊ฐ ์ถ์ถconst onChange = (e) => {
const { value, name } = e.target;//์ฐ์ e.target์์ name๊ณผ value๋ฅผ ์ถ์ถ
setInputs({
...inputs,//๊ธฐ์กด์ input๊ฐ์ฒด ๋ณต์ฌํ ๋ค
[name]: value,//nameํค๋ฅผ ๊ฐ์ง ๊ฐ์ value๋ก ์ค์
});
};
const onReset = () => {
setInputs({
name: "",
nickname: "",
});
nameInput.current.focus();//onResetํจ์์์ input์ ํฌ์ปค์คํ๋ focus() DOM API
};
return (
<div>
<input
name="name"
placeholder="์ด๋ฆ"
onChange={onChange}
value={name}
ref={nameInput}
/>
<input
name="nickname"
placeholder="๋๋ค์"
onChange={onChange}
value={nickname}
/>
<button onClick={onReset}>์ด๊ธฐํ</button>
<div>
<b>๊ฐ:</b>
{name} ({nickname})
</div>
</div>
);
}
export default InputSample;
- useRef()๋ฅผ ์ฌ์ฉํ์ฌ Ref ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ณ , ์ด ๊ฐ์ฒด๋ฅผ ์ฐ๋ฆฌ๊ฐ ์ ํํ๊ณ ์ถ์ DOM์ ref๊ฐ์ผ๋ก ์ค์ ํด์ฃผ์ด์ผ ํจ
- Ref๊ฐ์ฒด์ .current๊ฐ์ ์ฐ๋ฆฌ๊ฐ ์ํ๋ DOM ์ ๊ฐ๋ฆฌํค๊ฒ ๋จ
๋ฐฐ์ด ๋ ๋๋ง
import React from "react";
function User({ user }) {
return (
<div>
<b>{user.username}</b> <span>({user.email})</span>
</div>
);
}
function UserList() {
const users = [
{ id: 1, username: "velopert", email: "public.velopert@gmail.com" },
{ id: 2, username: "tester", email: "tester@example.com" },
{ id: 3, username: "liz", email: "liz@example.com" },
];
return (
<div>
<User user={users[0]} />
<User user={users[1]} />
<User user={users[2]} />
</div>
);
}
export default UserList;
- ๋ฐฐ์ด์ด ๊ณ ์ ์ ์ด๋ฉด ๊ด์ฐฎ์ง๋ง, ๋ฐฐ์ด ์ธ๋ฑ์ค ํ๋ํ๋ ์กฐํํ๋ฉฐ ๋ ๋๋งํ๋ ๋ฐฉ๋ฒ์ ๋์ ์ธ ๋ฐฐ์ด ๋ ๋๋ง ๋ชปํจ
๋์ ์ธ ๋ฐฐ์ด ๋ ๋๋ง ๋ฐฉ๋ฒ
: ์๋ฐ์คํฌ๋ฆฝํธ ๋ฐฐ์ด์ ๋ด์ฅํจ์ map() ์ฌ์ฉ, ์ด ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์ผ๋ฐ ๋ฐ์ดํฐ ๋ฐฐ์ด์ ๋ฆฌ์กํธ ์๋ฆฌ๋จผํธ๋ก ์ด๋ฃจ์ด์ง ๋ฐฐ์ด๋ก ๋ณํ
โญ๏ธ map: ๋ฐฐ์ด ์์ ๊ฐ ์์๋ฅผ ๋ณํํ์ฌ ์๋ก์ด ๋ฐฐ์ด์ ๋ง๋ค ๋ ์ฌ์ฉ
- ๋ฆฌ์กํธ์์ ๋ฐฐ์ด ๋ ๋๋ง ํ ๋, key๋ผ๋ props ์ค์ ํด์ผํจ
โบkey ๊ฐ์ ๊ฐ ์์๋ค๋ง๋ค ๊ฐ์ง๊ณ ์๋ ๊ณ ์ ๊ฐ์ผ๋ก ์ค์
import React from "react";
function User({ user }) {
return (
<div>
<b>{user.username}</b> <span>({user.email})</span>
</div>
);
}
function UserList() {
const users = [
{ id: 1, username: "velopert", email: "public.velopert@gmail.com" },
{ id: 2, username: "tester", email: "tester@example.com" },
{ id: 3, username: "liz", email: "liz@example.com" },
];
return (
<div>
{users.map((user) => (
<User user={user} key={user.id} />
))}
</div>
);
}
export default UserList;
- ๋ฐฐ์ด์ ๋ ๋๋ง ํ ๋ key ์ค์ ํ์ง ์์ผ๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฐฐ์ด์ index๊ฐ์ key๋ก ์ฌ์ฉํ๊ณ , ๊ฒฝ๊ณ ๋ฉ์์ง๊ฐ ๋ธ
โป ๋ฐฐ์ด ์์ ์์๊ฐ ๊ฐ์ง๊ณ ์๋ ๊ณ ์ ํ ๊ฐ์ด ์๋ค๋ฉด map()ํจ์๋ฅผ ์ฌ์ฉํ ๋ ์ค์ ํ๋ ์ฝ๋ฐฑํจ์์ ๋๋ฒ์งธ ํ๋ผ๋ฏธํฐ index๋ฅผ key๋ก ์ฌ์ฉ
return (
<div>
{users.map((user, index) => (
<User user={user} key={index} />
))}
</div>
);
key์ ์กด์ฌ์ ๋ฌด์ ๋ฐ๋ฅธ ์ ๋ฐ์ดํธ ๋ฐฉ์
key๊ฐ ์์ ๋,
const array=['a','b','c','d'];
array.map(item=><div>{item}</div>);
Q. b์ c ์ฌ์ด์ z๋ฅผ ์ฝ์ ํ๋ ๊ฒฝ์ฐ
A. ๋ฆฌ๋ ๋๋ง ์, <div>b</div>์ <div>c</div>์ฌ์ด์ ์๋ก์ด divํ๊ทธ๋ฅผ ์ฝ์ ํ๋ ๊ฒ์ด ์๋๋ผ, ๊ธฐ์กด์ c๊ฐ z๋ก ๋ฐ๋๊ณ , d๋ c๋ก ๋ฐ๋๊ณ , ๋งจ ๋ง์ง๋ง์ d๊ฐ ์๋ก ์ฝ์
Q. a๋ฅผ ์ ๊ฑฐํ๋ ๊ฒฝ์ฐ
A. ๊ธฐ์กด์ a๊ฐ b๋ก ๋ฐ๋๊ณ , b๋ z๋ก ๋ฐ๋๊ณ , z๋ c๋ก ๋ฐ๋๊ณ , c๋ d๋ก ๋ฐ๋๊ณ , ๋งจ ๋ง์ง๋ง์ ์๋ d์ ๊ฑฐ
์ฆ, key๊ฐ ์กด์ฌํ์ง ์์ ๋, ๊ธฐ์กด์ ์๋ ๊ฐ์ ๊ฑด๋ค์ด๋ฉด์ ์ ๋ฐ์ดํธ
key๊ฐ ์์ ๋,
[
{
id: 0,
text: 'a'
},
{
id: 1,
text: 'b'
},
{
id: 2,
text: 'c'
},
{
id: 3,
text: 'd'
}
];
array.map(item => <div key={item.id}>{item.text}</div>);
key๊ฐ ์์ ๋, ์์ ๋์ง ์๋ ๊ธฐ์กด์ ๊ฐ์ ๊ทธ๋๋ก ๋๊ณ ์ํ๋ ๊ณณ์ ๋ด์ฉ์ ์ฝ์ ํ๊ฑฐ๋ ์ญ์
- ๋ฐฐ์ด ์์ ์ค๋ณต๋๋ key๊ฐ ์์ ๋, ๋ ๋๋ง ์ ์ค๋ฅ๋ฉ์์ง๊ฐ ์ฝ์์ ๋ํ๋ ์ ๋ฐ์ดํฐ๊ฐ ์ ๋๋ก ์ด๋ฃจ์ด์ง์ง ์์
useRef๋ก ์ปดํฌ๋ํธ ์์ ๋ณ์ ๋ง๋ค๊ธฐ
useRef์ ์ฉ๋
- DOM ์ ํ
- ์ปดํฌ๋ํธ ์์์ ์กฐํ ๋ฐ ์์ ํ ์ ์๋ ๋ณ์ ๊ด๋ฆฌ
- setTimeout, setInterval์ ํตํด์ ๋ง๋ค์ด์ง id
- ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ์์ฑ๋ ์ธ์คํด์ค
- scroll์์น โธ [react] scroll event (ํ ์คํธ)
import React from "react";
function User({ user }) {
return (
<div>
<b>{user.username}</b> <span>({user.email})</span>
</div>
);
}
function UserList({ users }) {
return (
<div>
{users.map((user) => (
<User user={user} key={user.id} />
))}
</div>
);
}
export default UserList;
import React, { useRef } from "react";
import UserList from "./UserList";
function App() {
const users = [
{
id: 1,
username: "velopert",
email: "public.velopert@gmail.com",
},
{
id: 2,
username: "tester",
email: "tester@example.com",
},
{
id: 3,
username: "liz",
email: "liz@example.com",
},
];
const nextId = useRef(4); //useRef() ์ฌ์ฉํ ๋ ํ๋ผ๋ฏธํฐ ๋ฃ์ด์ฃผ๋ฉด, ์ด ๊ฐ์ด .current๊ฐ์ ๊ธฐ๋ณธ๊ฐ์ด ๋จ
const onCreate = () => {
nextId.current += 1; //๊ฐ ์์ ์, .current ๊ฐ ์์ ํ๋ฉด ๋๊ณ , ์กฐํํ ๋๋ .current์กฐํํ๋ฉด ๋จ
};
return <UserList users={users} />;
}
export default App;
'ํ๋ก ํธ์๋ > React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| useEffect์ useMemo (0) | 2022.11.23 |
|---|---|
| ์ปดํฌ๋ํธ ๋ ๋๋ง (0) | 2022.11.23 |
| โ ๋ฐฐ์ด ๋ด์ฅ ํจ์(์๋ฐ์คํฌ๋ฆฝํธ) (0) | 2022.11.17 |
| ๋ฆฌ์กํธ์ ๋ฐฐ์ด (0) | 2022.11.17 |
| ๋ฆฌ์กํธ Hooks (0) | 2022.11.15 |