React ์ฃผ๋ง #6
#6 ์นจ๋์์ ๋น๊ธ
useRef ๋ก ํน์ DOM ์ ํ
์๋ฐ์คํฌ๋ฆฝํธ์์๋ ์ฐ๋ฆฌ๊ฐ ํน์ DOM์ ์ ํํด์ผํ ๋, getElementById, querySelector ๊ฐ์ DOM selector ํจ์๋ฅผ ์ฌ์ฉํด์ผํ๋ค.
๋ฆฌ์กํธ์์ ๊ฐ๋์ DOM์ ์ง์ ์ ํํด์ผ ํ๋ ์ํฉ์ด ์ฌ ์ ์๋ค.
์ด ๋, ๋ฆฌ์กํธ์์ ref๋ผ๋ ๊ฒ์ ์ฌ์ฉํ๋ค.
ํจ์ํ ์ปดํฌ๋ํธ์์ ref ๋ฅผ ์ฌ์ฉ ํ ๋์๋ useRef ๋ผ๋ Hook ํจ์๋ฅผ ์ฌ์ฉํ๋ค.
ํด๋์คํ ์ปดํฌ๋ํธ์์๋ ์ฐ๋ฆฌ๊ฐ ์ฝ๋ฐฑ ํจ์๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ React.createRef ๋ผ๋ ํจ์๋ฅผ ์ฌ์ฉํ๋๋ฐ ํ์ฌ๋ ์ค์ํ์ง ์๋๋ค.
์ ์ ๋ง๋ InputSample ์ด๊ธฐํ ๋ฒํผ์ ํด๋ฆญํ์ ๋ ์ด๋ฆ input ์ ํฌ์ปค์ค๊ฐ ์กํ๋๋ก useRef ๋ฅผ ์ฌ์ฉํ์ฌ ๊ธฐ๋ฅ์ ๊ตฌํํ๊ฒ ๋ค!
InputSample.js
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();
};
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 ์ ๊ฐ๋ฅดํจ๋ค.
์์ ์ฝ๋์์ onReset ํจ์์์ input์ ํฌ์ปค์ค๋ฅผ ํ๋ focus( ) API๋ฅผ ํธ์ถํด์คฌ๋ค.
nameInput.current.focus();
๊ฒฐ๊ณผ๋...
์ด๊ธฐํ๋ฅผ ๋๋ ์ ๋, ์ด๋ฆ input ํ๊ทธ์ focus๊ฐ ๋ค์ด์จ๋ค.
๊ทธ๋ฆฌ๊ณ
const refContainer = useRef(initialValue);
useRef๋ .current ํ๋กํผํฐ๋ก ์ ๋ฌ๋ ์ธ์(initialValue)๋ก ์ด๊ธฐํ๋ ๋ณ๊ฒฝ ๊ฐ๋ฅํ ref ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค.
๋ฐฐ์ด ๋ ๋๋งํ๊ธฐ
์ด๋ฒ์๋ ๋ฆฌ์กํธ์์ ๊ฐ์ฒด๊ฐ ์๋ ๋ฐฐ์ด์ ๋ ๋๋งํ๋ ๋ฐฉ๋ฒ์ ์์๋ณด๊ฒ ๋ค.
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'
}
];
์ด๋ ๊ฒ ๋ฐฐ์ด์ด ์กด์ฌํ๋ค๊ณ ๊ฐ์ ํด๋ณด์!
์ด๋ป๊ฒํ๋ฉด์ ์ด ๋ฐฐ์ด์ ์ปดํฌ๋ํธ๋ก ๋ ๋๋งํ ์ ์์๊น?
๊ทธ๋ฅ ์ฝ๋ ๊ทธ๋๋ก ์์ฑ์ ํ๋ฉด๋๋๋ฐ, ์ฐ๋ฆฌ๋ src ํด๋์ UserList๋ผ๋ ํ์ผ์ ์์ฑํด์ ๋ค์๊ณผ ๊ฐ์ด ์ปดํฌ๋ํธ๋ฅผ ์์ฑํ๋ค.
UserList.js
import React from 'react';
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>
<div>
<b>{users[0].username}</b> <span>({users[0].email})</span>
</div>
<div>
<b>{users[1].username}</b> <span>({users[1].email})</span>
</div>
<div>
<b>{users[2].username}</b> <span>({users[1].email})</span>
</div>
</div>
);
}
export default UserList;
์์์ฒ๋ผ ์ฝ๋๋ฅผ ์์ฑํด๋ดค๋๋ฐ, ๋ค์ ์ฌ์ฉํ๋ ์ฝ๋๋ฅผ ์ผ์ผํ ๋ฃ๋๊ฑด ๋นํจ์จ์ ์ด๋ผ ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฌ์ฉ ํ ์ ์๋๋ก ์๋ก ๋ง๋ค์ด๋ณด๊ฒ ๋ค.
UserList ํ์ผ์ ๋ค์ ์์ ํด์ฃผ๋ฉด...
์! ๊ทธ๋ฆฌ๊ณ ํ ํ์ผ์ ํ๋์ ์ปดํฌ๋ํธ๊ฐ ์๋๋ผ ์ฌ๋ฌ๊ฐ์ ์ปดํฌ๋ํธ๋ฅผ ์ ์ธํด๋ ์๋ฌด๋ฐ ๋ฌธ์ ๋ ์๋ค!
UserList.js
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;
์ด์ ์ปดํฌ๋ํธ๋ฅผ App ํ์ผ์์ ๋ ๋๋งํด๋ณด๊ฒ ๋ค.
App.js
import React from 'react';
import UserList from './UserList';
function App() {
return (
<UserList />
);
}
export default App;
๊ฒฐ๊ณผ๋...
๋ง์ฝ ๋ฐฐ์ด์ด 100๊ฐ ์ด์์ด๋ฉด ํ๋ํ๋ ์กฐํํด๊ฐ๋ฉด์ ๋ ๋๋งํ๋ ๋ฐฉ๋ฒ์ ๋นํจ์จ์ ์ด๋ผ ์ด๋ด ๋, ์๋ฐ์คํฌ๋ฆฝํธ ๋ฐฐ์ด์ ๋ด์ฅํจ์์ธ map( )์ ์ฌ์ฉํ๋ฉด๋๋ค.
map() ํจ์๋ ๋ฐฐ์ด์์ ์๋ ๊ฐ ์์๋ฅผ ๋ณํํ์ฌ ์๋ก์ด ๋ฐฐ์ด์ ๋ง๋ค์ด์ค๋ค.
๋ฆฌ์กํธ์์๋ ๋์ ์ธ ๋ฐฐ์ด์ ๋ ๋๋ง์ ํ ๋๋ map ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์ผ๋ฐ ๋ฐ์ดํฐ ๋ฐฐ์ด์ ๋ฆฌ์กํธ ์๋ฆฌ๋จผํธ๋ก ์ด๋ฃจ์ด์ง ๋ฐฐ์ด๋ก ๋ฐ๊ฟ์ค๋ค.
UserList ์ปดํฌ๋ํธ๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ์์ ํด๋ณธ๋ค.
UserList.js
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} />
))}
</div>
);
}
export default UserList;
์ด๋ ๊ฒ ์์ฑํ๋ฉด ์ผ์ผํ ๊ฐ ๋ฐฐ์ด์ ์์๋ฅผ ๋ฐ๋ณตํด๊ฐ๋ฉด์ ์ฐ๋๊ฒ ์๋๋ผ ํ ๋ฒ๋ง map ํจ์๋ฅผ ์ฐ๋ฉด ๋ชจ๋ ์์๊ฐ ๋ ๋๋ง๋๋ค.
ํ์ง๋ง ๋ธ๋ผ์ฐ์ ์ ์ฝ์๋ก ๊ฐ๋ณด๋ฉด ํน์ ์๋ฌ๊ฐ ๋ณด์ผ ๊ฒ ์ด๋ค.
๋ฆฌ์กํธ์์๋ ๋ฐฐ์ด์ ๋ ๋๋งํ ๋, key๋ผ๋ props๋ฅผ ์ค์ ํด์ค์ผํ๋ค.
key ๊ฐ์ ๊ฐ ์์๋ค์ ๊ณ ์ ๊ฐ์ ์ค์ ํด์ผ ํด์ ์์ ๊ฐ์ ๊ฒฝ์ฐ์๋ id๊ฐ ๊ณ ์ ๊ฐ์ด๋ค.
key prop์ ์ถ๊ฐํ๋ฉด...
UserList.js
return (
<div>
{users.map(user => (
<User user={user} key={user.id} />
))}
</div>
);
๋ง์ฝ์ ๋ฐฐ์ด์์ ๊ณ ์ ๊ฐ์ด ์๋ค๋ฉด, map ํจ์๋ฅผ ์ฌ์ฉํ ๋ ์ค์ ํ๋ ์ฝ๋ฐฑํจ์์ ๋ ๋ฒ์งธ ํ๋ผ๋ฏธํฐ์ธ index๋ฅผ key๋ก ์ค์ ํด๋ฌ๋๋ค.
<div>
{users.map((user, index) => (
<User user={user} key={index} />
))}
</div>
์ฌ๊ธฐ์ ์ ๋ฆฌํ์๋ฉด...
map ํจ์์์ key๊ฐ ํ์ํ ์ด์ ๋
- Map์ key ๊ฐ์ด์๋ค๋ฉด ์ค๊ฐ์ ๊ฐ์ด ๋ฐ๋์์๋ ๊ทธ ํ์ ๊ฐ๋ค์ด ์ ๋ถ ๋ณํ๊ธฐ ๋๋ฌธ์ธ๋ค. key๊ฐ์ ์ฌ์ฉํ๋ค๋ฉด key๋ฅผ ์ด์ฉํด ์ค๊ฐ์ ๊ฐ์ ์ถ๊ฐํ๊ฒ ๋๋ค.
์ฐธ๊ณ : ๋ฒจ๋กํผํธ์ ํจ๊ปํ๋ ๋ชจ๋ ๋ฆฌ์กํธ
๋๋์ :
- ์ค๋์ useRef์ ๋ฐฐ์ด์ ๋ ๋๋ง์ ๋ํด ์์๋ณด๋ ์๊ฐ์ ๊ฐ์ก์ต๋๋ค.
- map ํจ์๋ ๋ฐฐ์ด๋ฅผ ์๋กญ๊ฒ ๋ฆฌํดํ๊ธฐ ๋๋ฌธ์, ๋ฆฌ์กํธ์์ ๋ง์ด ์ฌ์ฉ๋๊ณ ์๊ณ , useRef๋ ์์ง ํท๊ฐ๋ฆฌ๋ ๋ถ๋ถ์ด ์์ ์ ์์ด์ ๋ค์ ๊ณต๋ถํด์ผ๊ฒ ๋ค.
Author And Source
์ด ๋ฌธ์ ์ ๊ดํ์ฌ(React ์ฃผ๋ง #6), ์ฐ๋ฆฌ๋ ์ด๊ณณ์์ ๋ ๋ง์ ์๋ฃ๋ฅผ ๋ฐ๊ฒฌํ๊ณ ๋งํฌ๋ฅผ ํด๋ฆญํ์ฌ ๋ณด์๋ค https://velog.io/@klucas/React-์ฃผ๋ง-6์ ์ ๊ท์: ์์์ ์ ๋ณด๊ฐ ์์์ URL์ ํฌํจ๋์ด ์์ผ๋ฉฐ ์ ์๊ถ์ ์์์ ์์ ์ ๋๋ค.
์ฐ์ํ ๊ฐ๋ฐ์ ์ฝํ
์ธ ๋ฐ๊ฒฌ์ ์ ๋
(Collection and Share based on the CC Protocol.)
์ข์ ์นํ์ด์ง ์ฆ๊ฒจ์ฐพ๊ธฐ
๊ฐ๋ฐ์ ์ฐ์ ์ฌ์ดํธ ์์ง
๊ฐ๋ฐ์๊ฐ ์์์ผ ํ ํ์ ์ฌ์ดํธ 100์ ์ถ์ฒ ์ฐ๋ฆฌ๋ ๋น์ ์ ์ํด 100๊ฐ์ ์์ฃผ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์ ํ์ต ์ฌ์ดํธ๋ฅผ ์ ๋ฆฌํ์ต๋๋ค