[DAY-49] React (2)
π ν·κ°λ Έλ & λͺ°λλ λΆλΆλ€λ§ μ 리νλ λλ§μ TIL
π― λͺ¨λ κ°μ λ΄μ©μ μ μ§ μμμ!
μ€λμ μκ°μ?
μ€ν 리보λ μ λ§ μ λ§ μ λ§ λ무 λ§μ λ€μ΄μ
μ»΄ν¬λνΈλ₯Ό μκ°μ μΈ μμλ‘ λ°λ‘ νμΈν μ μλ€λ..
μ΄κ±Έ μ μ΄μ μμμκΉμ?
μ€ν 리보λλ λ°λ‘ μ 리νμ΅λλ€.
[1] μ»΄ν¬λνΈ μ€νμΌλ§
리μνΈ μ»΄ν¬λνΈμ μ€νμΌμ μ μ©νλ λ°©λ²μλ 3κ°μ§κ° μμ΅λλ€.
- μ€νμΌ μνΈ μ΄μ©
- Inline style μ μ©
- CSS in JS
[1-1] μ€νμΌ μνΈ μ΄μ©
import "./Box.css"; // ν΄λΉ λ°©μμΌλ‘ λΆλ¬μμ μ μ©ν μ μμ΅λλ€.
const Box = () => {
return <div className="box" />;
};
export default Box;
[1-2] Inline Style μ μ©
const Box = ({ bgColor }) => {
return <div className="box" style={{ backgroundColor: bgColor }} />;
};
export default Box;
[1-3] CSS in JS
ν΄λΉ λ°©λ²μ emotion
λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©ν μ μμ΅λλ€.
npm install --save @emotion/react
npm install --save @emotion/styled
// ---> λ λ°©μμ΄ λ€λ¦
λλ€. μ¬μ©μ λ°λΌ μ€μΉν μ μμ΅λλ€.
npm install --save @emotion/babel-plugin
emotion
λΌμ΄λΈλ¬λ¦¬λ CSSλ₯Ό JSμ ννλ‘ μμ±ν μ μκ² ν΄μ€λλ€.
/** @jsxImportSource @emotion/react */ // νλκ·Έλ§λ₯Ό λΆμ¬μ€λλ€.
import "./App.css";
import Box from "./components/Box";
import { css } from "@emotion/react";
const style = css`
color: hotpink;
`;
const SomeComponent = ({ children }) => (
<div css={style}>Some Hotpink text! {children}</div>
);
function App() {
return (
<div>
<SomeComponent />
<Box />
</div>
);
}
export default App;
create-react-appμμλ νλκ·Έλ§λ₯Ό λΆμ¬μ£Όλ λμ .babelrc νμΌμ λ§λ€μ΄λ μ μ©μ΄ λμ§ μμ΅λλ€.
λ°λΌμ νΉλ³ν λ°©λ²μ μ¬μ©ν΄μΌ ν©λλ€.
κ·Έ μ€ νλμ λ°©λ²μΌλ‘ craco
λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©ν μ μμ΅λλ€.
craco
λ create-react-app-config-override
λ₯Ό μ€μΈ λ§μ΄λΌκ³ ν©λλ€.
npm install --save @craco/craco
npm install --save @emotion/babel-preset-css-prop
- craco.config.js
module.exports = {
babel: {
presets: ["@emotion/babel-preset-css-prop"],
},
};
- package.json
"scripts": {
"start": "craco start",
"build": "craco build",
"test": "craco test"
},
λ€μ npm start
λͺ
λ Ήμ΄λ‘ μ€ννλ©΄ μ€νμΌμ΄ μ μ μ©λλ κ²μ νμΈν μ μμ΅λλ€.
[2] useMemo ν
useMemo
λ μ΅μ νλ₯Ό μν ν
μ
λλ€.
리μνΈ μ»΄ν¬λνΈλ₯Ό ꡬνν λ ν¨μλ‘ κ΅¬νν©λλ€.
λ°λΌμ ν΄λΉ μ»΄ν¬λνΈκ° λλλ§ λλ€λ κ²μ, λκ΅°κ°κ° ν΄λΉ ν¨μλ₯Ό νΈμΆν΄μ μ€νμν¨λ€λ μλ―Έμ λμΌν©λλ€.
κ·Έλ λ€λ©΄ ν΄λΉ ν¨μλ μΈμ λ€μ 리λ λλ§ λ κΉμ?
- μμ μ μνκ° λ³κ²½λ λ
- λΆλͺ¨ μ»΄ν¬λνΈλ‘λΆν° λ°λ propμ΄ λ³κ²½λ λ
- λΆλͺ¨ μ»΄ν¬λνΈμ μνκ° λ³κ²½λ λ
μ΄λ¬ν 리λ λλ§ μμ μ ν¨μ λ΄λΆ μ°μ° μλκ° λλ¦° μ»΄ν¬λνΈλΌλ©΄ κ½€ λ§μ μ±λ₯μ μλΉνκ² λ©λλ€.
λ°λΌμ useMemo
ν
μ μ¬μ©ν΄μ μ΅μ νλ₯Ό μ§νν μ μμ΅λλ€.
const result = useMemo(() => sum(n), [n]);
// nμ κ°μ΄ λ³κ²½λμμ λλ§ sum ν¨μλ₯Ό νΈμΆν΄μ μ°μ°μ μ§νν©λλ€.
[3] React.memo
λΆλͺ¨ μ»΄ν¬λνΈμ μνκ° λ³κ²½λ λ 리λ λλ§μ΄ λλ κ²μ λ§κΈ° μν΄ React.memo
ν¨μλ₯Ό μ¬μ©ν μ μμ΅λλ€.
import React from "react";
import "./Box.css";
// λ¨μν React.memoλ‘ κ°μΈλ§ μ€λ 리λ λλ§μ λ§μ μ μμ΅λλ€!
const Box = React.memo(() => {
console.log("Render Box!");
return <div className="box"></div>;
});
export default Box;
[4] useCallback ν
ν¨μκ° λ€μ μ μλλ κ²μ λ§κΈ° μν΄ useCallback
ν
μ μ¬μ©ν μ μμ΅λλ€.
React.memo
λ₯Ό μ¬μ©ν΄μ μ μν Checkbox μ»΄ν¬λνΈλ₯Ό μ¬λ¬κ° μ¬μ©ν΄λ³΄κ² μ΅λλ€.
// App.js
function App() {
const [foodOn, setFoodOn] = useState(false);
const [clothesOn, setclothesOn] = useState(false);
const [shelterOn, setShelterOn] = useState(false);
const foodChange = (e) => setFoodOn(e.target.checked);
const clothesChange = (e) => setclothesOn(e.target.checked);
const shelterChange = (e) => setShelterOn(e.target.checked);
return (
<div>
<Checkbox label="Food" on={foodOn} onChange={foodChange} />
<Checkbox label="Clothes" on={clothesOn} onChange={clothesChange} />
<Checkbox label="Shelter" on={shelterOn} onChange={shelterChange} />
</div>
);
}
food Checkboxμ κ°μ΄ λ³ν΄λ λ€λ₯Έ 체ν¬λ°μ€κΉμ§ λͺ¨λ μ¬μ μλλ κ²μ νμΈν μ μμ΅λλ€.
λ°λΌμ μ΄λ΄ λ useCallback
μΌλ‘ ν¨μλ₯Ό κ°μΈμ€λλ€.
const foodChange = useCallback((e) => setFoodOn(e.target.checked), []);
const clothesChange = useCallback((e) => setclothesOn(e.target.checked), []);
const shelterChange = useCallback((e) => setShelterOn(e.target.checked), []);
// useMemoμ λμΌνκ² λλ²μ§Έ νλΌλ―Έν°λ‘ μ§μΌλ³΄κ³ μλ€κ°
// ν΄λΉ κ°μ΄ λ³κ²½λ λλ§ ν¨μ μ¬ν λΉμ νμ©ν μ μμ΅λλ€.
[5] μ¬μ©μ μ μ ν
κΈ°μ‘΄ ν λ€μ μ‘°ν©ν΄μ μ¬μ©μ μ μ ν μΌλ‘ λΉΌμ μ¬μ©ν μ μμ΅λλ€.
μ΄λ μ€λ³΅ μ½λλ₯Ό μ κ±°ν μ μλ€λ μ₯μ μ΄ μμ΅λλ€.
μ¬μ©μ μ μ ν
μ hooks
λλ ν 리 λ΄λΆμ μ μν©λλ€.
// useToggle.js
import { useCallback, useState } from "react";
const useToggle = (initialState = false) => {
const [state, setState] = useState(initialState);
const toggle = useCallback(() => setState((state) => !state), []);
return [state, toggle];
};
export default useToggle;
// App.js Component
// ...
const [on, toggle] = useToggle(); // state -> on
return (
<div>
<button onClick={toggle}>{on ? "True" : "False"}</button>
</div>
);
[6] λ‘κ·ΈμΈ, νμκ°μ νΌ
storybook
μΌλ‘ μ€μ΅μ μ§ννμ΅λλ€.
νλμ© λμ΄λλ μ»΄ν¬λνΈλ₯Ό λ³Ό λ λ§λ€ νΈμν΄μ§λ€μ.. π
λκΈλ¨κΈ°κΈ°