React์ Material UI๋ผ๋ React UI ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ํ๋ก์ ํธ๋ฅผ ํ๋ ์ค, ์ ๋ชฉ๊ณผ ๊ฐ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค.
findDOMNode is deprecated in StrictMode.
KOS ํ๋ก์ ํธ์์๋ ๋ฐ๊ฒฌํ๋ ์ค๋ฅ๋ฐ ๋์๋กญ์ง ์๊ฒ ๋๊ฒผ๋๋ ์ฌ๊ธฐ์ ๊ฑธ๋ฆฌ์ ๊ฑฐ๋ฆฌ๋๊ตฐ ใ ใ
์ด์จ๋ ํด๊ฒฐํด๋ณด์.
์ด์
์ ๋ฐ ์ค๋ฅ๊ฐ ๋จ๋ ์ด์ ๋ ๋ฌด์์ผ๊น?
๋จผ์ , create-react-app์ ํตํด React ํ๋ก์ ํธ๋ฅผ ์์ฑํ๋ฉด, index.js๊ฐ ๋ค์๊ณผ ๊ฐ์ด ์๊ฒผ๋ค.
import React from 'react';
import ReactDOM from 'react-dom';
import App from './App';
import reportWebVitals from './reportWebVitals';
ReactDOM.render(
<React.StrictMode>
<App />
</React.StrictMode>,
document.getElementById('root')
);
// If you want to start measuring performance in your app, pass a function
// to log results (for example: reportWebVitals(console.log))
// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals
reportWebVitals();
์ฌ๊ธฐ์ ์ฃผ์ํด์ ๋ณด์์ผํ ๊ฒ์ React.StrictMode๋ผ๋ tag์ด๋ค. ํด๋น tag๋ React ์ฝ๋๋ฅผ ์งค ๋ ๋ฐ์ํ๋ ์ฌ๋ฌ ์ค๋ฅ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํ ๊ฒ์ฌ๋ฅผ ํ๋๋ฐ, ๊ทธ ์ค ํ๋๊ฐ findDOMnode ๊ฒ์ฌ์ด๋ค.
ํด๊ฒฐ ๊ณผ์
forwardRef
์ด๋ ์น ์ํ ๋ช ๋ฒ ํด๋ณด๋ฉด React ref๋ฅผ ์ฌ์ฉํ๋ผ๊ณ ํด๊ฒฐ์ฑ ์ด ๋์จ๋ค. ๊ทธ๋ฐ๋ฐ ์ ๊ธฐํ ๊ฒ์ React ๊ณต์ ์ฌ์ดํธ์ functional component์ ๋ํด์ ref๋ฅผ ์ฌ์ฉํ์ง ๋ง๋ผ๊ณ ๋์ด์๋ ๊ฒ. ref๋ DOM ์์์ ์ ์ฉํ๋ ๊ฒ์ด๊ณ class component์ ์ธ์คํด์ค์๋ง ์ ์ฉํ๋ผ๊ณ ํ๋ค.
You may not use the ref attribute on function components
๊ทธ๋์, ํด๊ฒฐํ๋ ค๋ฉด ref๋ฅผ ์ฌ์ฉํ๋ผ๊ณ ํ๊ณ functional component์๋ ์ฌ์ฉํ์ง ๋ง๋ผ๊ณ ํ๋ฉด hook์ ์ด์ฉํด์ ๊ฐ๋ฐํ๊ณ ์๋ ๋ ์ด๋กํ์ง..?
ํด๋ต๋ ์์ react ํํ์ด์ง์ ๋์์์๋ค. functional component์์ ref๋ฅผ ์ฐ๊ณ ์ถ๋ค๋ฉด,
- class component๋ก ๋ฐ๊พธ๋์ง
- forwardRef ๋ฅผ ์ฐ๋ผ๊ณ ํ๋ค.
forwardRef๋ ์ด๋ ๊ฒ ์ฌ์ฉํ ์ ์๋ค.
// App.js
import React, { createRef } from 'react';
import Component from './';
const App = () => {
const appRef = createRef();
return(
<Component ref = {appRef}/>
);
}
// Component.js
import React, { forwardRef } from 'react';
const Component = forwardRef((props, ref) => {
return(
<div ref = {ref}>
<h1>let's resolve it</h1>
<div>so tired</div>
</div>
);
});
์ด๋ ๊ฒ ์์ ์ปดํฌ๋ํธ์์ createRef ํจ์๋ก ref๋ฅผ ๋ง๋ ๋ค์, ํ์ ์ปดํฌ๋ํธ์ props๋ก ๋๊ฒจ์ค๋ค. ํ์ ์ปดํฌ๋ํธ๋ forwardRef๋ฅผ ์ด์ฉํ์ฌ ์ปดํฌ๋ํธ๋ฅผ ์์ฑํ๋ฉด์ ๋งค๊ฐ๋ณ์๋ก ref๋ฅผ ๋ฐ๋๋ค. ๋งค๊ฐ๋ณ์๋ก ๋ฐ์ ref๋ ํด๋น ์ปดํฌ๋ํธ์ ์ต์์ JSX tag์ ref ์์ฑ์ผ๋ก ์ง์ ํ๋ค.
๋ฌธ์ ๋ ํ ๋ฒ๋ง ์ด๋ ๊ฒ ํ๋ ๊ฒ ์๋๋ผ ํ์ ์ปดํฌ๋ํธ๋ฅผ ์ซ์๊ฐ๋ฉด์ ๊ณ์ํด์ ref๋ฅผ ๋ง๋ค๊ณ ํ ๋นํ๋ ๊ฑธ ๋ฐ๋ณตํด์ผํ๋ค ใ ใ ํใ ใ
๊ทธ๋ฐ๋ฐ...
์ด๋ ๊ฒ ํด๊ฒฐํ๋๋ฐ๋ findDOMNode ...
์๋ฌ๋ ์ฌ์ ํ ๋ฌ๋ค. ๊ทธ๋๋ ์ค๊ฐ์ ๋ฑ์ฅํ๋ ์๋ฌ๋ค์ ref๋ก ๋ค ํด๊ฒฐ๋์๋ค.
๋ชจ๋ Material UI์ ์์ฒด tag๋ฅผ ์ฌ์ฉํ๋ฉด์ ref๋ฅผ ๋๊ฒจ์ค์ผํ๋ค๋ ์๋ฌ๋ค์ด๋ค.
-
์๋ฌ ์์ :
Invalid prop children supplied to ForwardRef(Slide).
=> Slide tag ์ฌ์ฉํ๋ค๊ฐ ๋์จ ์ค๋ฅ
unstable_createMuiStrictModeTheme
์์ง ์๋ฌ๊ฐ ์ฌ๋ผ์ง์ง ์์์ผ๋, ๋ค์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด๋ณด์.
๋ค๋ค ๋ง๋งํ๋์ง ์ค๊ฐ์ค๊ฐ์ StrictMode ํ๊ทธ๋ฅผ ๊ทธ๋ฅ ์์ ๋ฒ๋ฆฌ๋ผ๋ ์กฐ์ธ์ด ์ข ์ข ๋์จ๋ค...
๊ทธ๋ฌ๋ค๊ฐ MaterialUI์์ ๊ด๋ จ ๊ธ์ ์์ฑํด๋ ๊ฒ์ ๋ฐ๊ฒฌํ๋ค.
MaterialUI ์ธก๋ ๋น์ฐํ ํด๋น ๋ฌธ์ ๋ฅผ ์๊ณ ์์๊ณ , ๋ฌธ์ ์ ๋ํ ๋์์ ๋ง๋ จํด๋์๋ค. ์ฝ๋๋ก ์๊ฐํ๊ฒ ๋ค.
import { ThemeProvider } from "@material-ui/core/styles";
import { unstable_createMuiStrictModeTheme } from '@material-ui/core/styles';
const theme = unstable_createMuiStrictModeTheme();
const App = () => {
<ThemeProvider theme = {theme}>
<Component/>
</ThemeProvider>
}
์ด๋ ๊ฒ ์์ ๊ณ์ธต ์ปดํฌ๋ํธ์์ ThemProvider
๋ฅผ importํด์ wrapper tag๋ก ๊ฐ์ผ๋ค. ๊ทธ๋ฆฌ๊ณ ํด๋น tag์ ์์ฑ theme์ unstable_createMuiStrictModeTheme
๋ฅผ import ํ ๋ค ํจ์๋ฅผ ์คํํด์ ์ป์ theme์ ๋๊ฒจ์ฃผ๋ฉด ๋๋ค.
์ด๋ ๊ฒ๊น์ง ํ๋ฉด ์๋ฌ๊ฐ ๋จ์ง ์๊ณ ์ ๋์ํ๋ค :)
Comment