Handle DOM in React - JeongWu/fe-javascript GitHub Wiki
render ๋ฉ์๋์์ ์์ฑ๋ DOM ๋ ธ๋๋ React ์๋ฆฌ๋จผํธ์ ์ ๊ทผ
- animation ์ ์ด๋ฅผ ํด์ผํ ๋
- focus,text, media ์ ํ ์ ์ด๊ฐ ํ์ํ ๋(DOM API ํธ์ถ์ ํด์ผํ ๋)
- ์ธ๋ถ DOM Library ์ฌ์ฉํ ๋
const myRef=react.createRef()๋ฅผ ํตํด ์์ฑ
- ref ์์ฑ์ ํตํด ์ฐธ์กฐ๋ฅผ ์ค์
-
const TextInput = () => {
const textInput = useRef(null);
const focusInput = () => {
textInput.current.focus();
}
return (
<div>
<input
type="text"
ref={textInput}
/>
<button onClick={focusInput}>
Focus
</button>
</div>
);
}
export default TextInput;
๋ถ๋ชจ ์ปดํฌ๋ํธ์ ๋ฐ๊นฅ์ DOM ๋ ธ๋๋ก ์์์ ๋ ๋๋ง
- modal, tooltip, ์ธ๋ถ layer ๋ฑ
ReactDOM.createPortal(child: React.ReactNode, container: HTMLElement)
react root DOM node ์ธ๋ถ์ React Element ๊ทธ๋ฆฌ๊ธฐ
const Modal = () => {
return ReactDOM.createPortal(
<div>I am a modal</div>,
document.body.querySelector('#app')
)
}
const App = () => {
const [count, setCount] = React.useState(0);
return (
<div onClick={() => setCount(count + 1)}>
<div>Hello!</div>
<div>count: {count}</div>
<Modal />
</div>
)
}
export default App
์ฑ ์ ์ฒด์์ ์ฌ๋ฌ๊ตฐ๋ฐ์์ ์ฌ์ฉ๋๋ ๊ฐ(global value)์ ์์์์ ์ ๋ฌํ๋ ๋ฐฉ๋ฒ
- React.createContext(defaultValue); ํตํด Context ๊ฐ์ฒด๋ฅผ ์์ฑ
- <Context.Provider value={contextValue}> ๋ฅผ ํตํด context ์ฃผ์
- ํ์ ์ด๋ component์์๋ผ๋ useContext(Context) ํตํด contextValue ํ๋๊ฐ๋ฅ
- context ์ฌ์ฉ x
function App() {
return <Toolbar theme="green" />;
}
function Toolbar({ theme }) {
return (
<div>
<ThemedButton theme={theme} />
</div>
);
}
const ThemedButton = ({ theme }) => (
<button className={`button-${theme}`}>
button
</button>
)
export default App;
- context ์ฌ์ฉ
const ThemeContext = createContext('green');
function App() {
return (
<ThemeContext.Provider value="blue">
<Toolbar />
</ThemeContext.Provider>
);
}
function Toolbar() {
return (
<div>
<ThemedButton />
</div>
);
}
const ThemedButton = () => {
const theme = useContext(ThemeContext) //import themeprovider์ value๊ฐ ๋ฐ์์ด
return (
<button className={`button-${theme}`}>
button
</button>
)
}
export default App;
Error: React App ์ ์ฒด๋ฅผ unmount
class ErrorBoundary extends React.Component {
constructor(props) {
super(props);
this.state = { hasError: false };
}
static getDerivedStateFromError(error) {
// Update state so the next render will show the fallback UI.
return { hasError: true };
}
componentDidCatch(error, info) {
// You can also log the error to an error reporting service
logErrorToMyService(error, info);
}
render() {
if (this.state.hasError) {
// You can render any custom fallback UI
return <h1>Something went wrong.</h1>;
}
return this.props.children;
}
}
<ErrorBoundary>
<MyWidget />
</ErrorBoundary>
- Mock ์ค๋น
- ํ๋ฉด์ ๋๋ ์ ์ปดํฌ๋ํธ ๋ง๋ค๊ธฐ
- ์ ์ (static) ๋ฒ์ ๋ง๋ค๊ธฐ