โ ๏ธ ์ ๋ฆฌํ ๋ด์ฉ์ ์คํ๋ ์๋ชป๋ ์ ๋ณด๊ฐ ์์ ์ ์์ต๋๋ค. ๋๊ธ๋ก ์๋ ค์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค.
์น ์ ๊ทผ์ฑ์ ๋ชจ๋๊ฐ ์ฌ์ฉํ ์ ์๋๋ก ์น์ฌ์ดํธ๋ฅผ ๋์์ธ, ๊ฐ๋ฐํ๋ ๊ฒ์ ์๋ฏธํ๋ค.
React๋ ์ ๊ทผ์ฑ์ ๊ฐ์ถ ์น์ฌ์ดํธ๋ฅผ ๋ง๋ค ์ ์๋๋ก ๋ชจ๋ ์ง์์ ํ๊ณ ์์ผ๋ฉฐ, ๋๋ถ๋ถ์ ํ์ค HTML ๊ธฐ์ ์ด ์ฌ์ฉ๋๋ค.
์ ๊ทผ์ฑ์ ์ค์ํ๋ฉด ๋ณด์กฐ๊ธฐ๊ธฐ ์ฌ์ฉ์์ ์ ๊ทผ์ฑ์ ํฅ์์ํฌ ์ ์์ผ๋ฉฐ, SEO๋ ํฅ์ ์ํฌ ์ ์๋ค.
์ ๊ทผ์ฑ์ ๊ฐ์ถ ์น ์ฌ์ดํธ๋ฅผ ๋ง๋๋ ๋ฐ ํ์ํ ์ง์นจ์ ์ ๊ณตํ๋ค.
์ ๊ทผ์ฑ์ ๊ฐ์ถ JavaScript ์์ ฏ์ ๋ง๋๋ ๋ฐ ํ์ํ ๊ธฐ์ ๋ค์ด ๋ด๊ฒจ ์๋ค.
JSX์์๋ ๋ชจ๋ aria-*
HTML ์ดํธ๋ฆฌ๋ทฐํธ๋ฅผ ์ง์ํ๊ณ ์๋ค. ์ด ์ดํธ๋ฆฌ๋ทฐํธ๋ ์ผ๋ฐ์ ์ธ HTML๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก hypen-case๋ก ์์ฑํด์ผ ํ๋ค.
<input
type="text"
aria-label={labelText}
aria-required="true"
onChange={onchangeHandler}
value={inputValue}
name="name"
/>
JavaScript๋ฅผ ํ์ฅํ ๋ฌธ๋ฒ์ด๋ค. JSX๋ก ์์ฑ๋ ์ฝ๋๋ ๋ธ๋ผ์ฐ์ ์์ ์คํ๋๊ธฐ ์ ์ ์ฝ๋๊ฐ ๋ฒ๋ค๋ง๋๋ ๊ณผ์ ์์ ๋ฐ๋ฒจ์ ์ฌ์ฉํ์ฌ ์ผ๋ฐ ์๋ฐ์คํฌ๋ฆฝํธ ํํ์ ์ฝ๋๋ก ๋ณํ๋๋ค.
์๋ฉํฑ HTML์ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ด ์ ๊ทผ์ฑ์ ๊ธฐ์ด์ด๋ค. HTML ํ๊ทธ๋ฅผ ์น ์ฌ์ดํธ์์ ์ฌ์ฉํ๋ฉด ์์ฐ์ค๋ฝ๊ฒ ์ ๊ทผ์ฑ์ด ๊ฐ์ถ์ด์ง๋ค. ์ฆ, ์๋ฏธ์ ๋ง๋ ํ๊ทธ๋ฅผ ์ฌ์ฉํด ๋ฌธ์๋ฅผ ์์ฑํ๋ ๊ฒ์ ๋งํ๋ค.
๋ฆฌ์กํธ์์๋ <div>
์ ๊ฐ์ ์๋ฆฌ๋จผํธ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ๋ณด๋ค React Fragment
๋ฅผ ์ฌ์ฉํด์ ์ฌ๋ฌ ์๋ฆฌ๋จผํธ๋ฅผ ๋ฌถ๋ ๊ฒ์ ๊ถ์ฅํ๋ค.
import React, { Fragment } from 'react';
function ListItem({ item }) {
return (
<Fragment>
<dt>{item.term}</dt>
<dd>{item.description}</dd>
</Fragment>
);
}
<input>
๊ณผย <textarea>
ย ๊ฐ์ ๋ชจ๋ HTML ํผ ์ปจํธ๋กค์ ์คํฌ๋ฆฐ ๋ฆฌ๋๋ฅผ ์ฌ์ฉํ๋ ์ฌ์ฉ์๋ฅผ ์ํด ๊ตฌ๋ถํ ์ ์๋ ๋ผ๋ฒจ์ด ํ์ํ๋ค.
<label htmlFor="namedInput">Name:</label>
<input id="namedInput" type="text" name="name"/>
React ์ฑ๋ค์ ๋ฐํ์๋์ HTML DOM์ ๋ณ๊ฒฝํ๊ธฐ ๋๋ฌธ์, ๊ฐ๋ ํค๋ณด๋ ํฌ์ปค์ค๋ฅผ ์๊ฑฐ๋ ์์์น ๋ชปํ ์๋ฆฌ๋จผํธ์ ํฌ์ปค์ค๋ฅผ ๋ง์ถ๊ณค ํ๋ค.
โ ๏ธย ํค๋ณด๋ ํฌ์ปค์ค๋ ๋งค์ฐ ์ค์ํ ์ ๊ทผ์ฑ ๊ธฐ๋ฅ์ด์ง๋ง, ๋์์ ๋งค์ฐ ์กฐ์ฌํด์ ์ฌ์ฉํด์ผ ํ๋ค. ํค๋ณด๋ ํฌ์ปค์ค ํ๋ฆ์ด ํํธ๋ฌ์ก์ ๋ ์ด๋ฅผ ๊ณ ์น๋ ค๋ ๋ฐฉ๋ฒ์ผ๋ก ์ฌ์ฉํด์ผ ํ๋ค.
ํค๋ณด๋๋ก ์ด์ ์ ํ์ํ ์์ญ์ ๊ฑด๋๋ธ ๋ฐฉ๋ฒ์ ์ ๊ณตํด์ผ ํ๋ค.
Skil Navigation Links
ํค๋ณด๋ ์ฌ์ฉ์๊ฐ ํ์ด์ง์ ์ํธ์์ฉํ ๋๋ง ํ์๋๋ ์จ๊ฒจ์ง ๋งํฌ๋ค
<nav>
)์๋ฅผ ๋ค์ด, ๋ชจ๋ฌ์ด ๋ซํ ํ์๋ ๋ชจ๋ฌ์ ์ด์๋ ๋ฒํผ์ผ๋ก ํค๋ณด๋ ํฌ์ปค์ค๋ฅผ ๋ค์ ๋ง์ถฐ์ฃผ์ด์ผ ํจ
React์์ ํฌ์ปค์ค๋ฅผ ์ง์ ํ๋ ๋ฐฉ๋ฒ
ref
์ฌ์ฉcreateRef
class App extends React.Component {
componentDidMount() {
this.divRef = React.createRef();
}
render() {
return (
<div>
<div id="divR" ref={this.divRef}>
App, here
</div>
</div>
);
}
}
useRef
import React, { useRef } from "react";
const App = () => {
const divRef = React.useRef();
const valueRef = React.useRef(90);
return (
<div>
๊ฐ : {valueRef.current}
<div id="divR" ref={divRef}>
App, here
</div>
<button onClick={() => (valueRef.current = 88)}> ์ฆ๊ฐ </button>
</div>
);
};
export default App;
createRef
๋ฅผ ์ฌ์ฉํ๋ฉด ref๊ฐ ์ด๊ธฐํ๋์ด ์ํ๋ ๊ฐ์ ์ป์ง ๋ชปํ๊ธฐ ๋๋ฌธ์ useRef
๋ฅผ ์ฌ์ฉ๋ง์ฐ์ค ํน์ ํฌ์ธํฐ ์ด๋ฒคํธ๋ก ๋ ธ์ถ๋ ๋ชจ๋ ๊ธฐ๋ฅ์ ํค๋ณด๋๋ง์ผ๋ก ์ฌ์ฉํ ์ ์๋๋ก ํด์ผํ๋ค.
ํด๋ฆญ ์ด๋ฒคํธ๋ก ์ ๊ทผ์ฑ์ด ๋จ์ด์ง๋ ์์
์ธ๋ถ ํด๋ฆญ ํจํด
onBlur
๋๋ onFocus
์ ๊ฐ์ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.๊ณต๋ถํ๋ฉด์ ๊ทธ๋์ ์น ์๋ฉํฑ์ด๋ผ๊ณ ํ๋ฉด์ ์ ๊ทผ์ฑ์ ๋จ์ ์ง์ง ์์๋ํ๋ ์๊ฐ์ด ๋ค์๋ค. ์ ๊ทผ์ฑ์๋ ์๋ฉํฑ ๋ฟ๋ง ์๋๋ผ ํผ, ํค๋ณด๋, ๋ง์ฐ์ค ์์ง์ ๋ฑ์ ์ฌ๋ฌ ์ฌ์ฉ์์ ์์ง์๋ ํฌํจํ๋ ๊ฒ์ด์๋ค.
๋ํ aria-*
๋ aria-label
๋ง๊ณ ๋ ์ ๊ทน์ ์ผ๋ก ์ฌ์ฉํ์ง ์์๋๋ฐ ๋ค์๋ถํฐ๋ ํ๊ทธ๋ง์ผ๋ก ์ค๋ช
ํ ์ ์์ ๊ฒฝ์ฐ ๊ผญ ๋ฃ์ด์ผ ๊ฒ ๋ค๊ณ ๋ค์งํ๋ค.