💻 Box.css
.box {
width: 100px;
height: 100px;
background-color: aquamarine;
}
💻 Box/index.js
import "./Box.css";
const Box = () => {
return <div className="box"/>;
};
export default Box;
💻 Box/index.js
import "./Box.css";
const Box = ( {bgColor} ) => {
return <div className="box" style={{backgroundColor: bgColor}}/>;
};
export default Box;
💻 App.js
import Box from './components/Box';
function App() {
return (
<div className="App">
<Box bgColor="red"/> // 인라인 스타일로 붉은색 적용
</div>
);
}
export default App;
💡 기존의 스타일시트와 충돌하였지만 인라인으로 지정한 스타일이 우선 적용되는 것을 알 수 있다. 이전에도 배운 적이 있다.
💢 Emotion의 경우 현재 실습 환경에서 설치 단계에서 계속 오류가 발생해 실습을 미뤘지만, 끝끝내 yarn 실행 오류와 함께 해결했다. 조만간 다뤄볼 예정이다.
🔷 최적화를 위해 필요한 훅
💻 ShowSum.js
import {useMemo} from "react";
function sum(n) {
console.log('Start')
let result = 0;
for(let i = 1; i <= n; i++) {
result += i;
}
console.log('Finished');
return result;
}
const ShowSum = ({label, n}) => {
const result = useMemo(() => sum(n), [n]); // n이 변경되었을 때만 연산하도록 useMemo로 지정
return (
<span>
{label}: {result}
</span>
)
}
export default ShowSum;
💻 App.js
import {useState} from 'react';
import ShowSum from './components/ShowSum';
import './App.css';
function App() {
const [label, setLabel] = useState('Result');
return (
<div className="App">
<button onClick={() => setLabel(label + ":")}>Change Label</button>
<ShowSum label={label} n={1000}></ShowSum> // 1000번 연산
</div>
);
}
export default App;
🖨 실행 결과
버튼을 아무리 눌러서 연산을 다시 시도해도 리렌더링이 이루어지지는 않는 모습이다. (로그가 찍히지 않음)
🔷 부모 컴포넌트의 상태가 변경되어도 자식 컴포넌트의 상태가 변경된 것이 아니라면 리렌더링하지 않게 한다.
const func = React.memo(({one, two}) => {
...
})
🔷 함수가 다시 정의되는 것을 막는다.
💡 함수가 재정의 되면서 새로운 메모리에 들어가면 memo와 상관없이 리렌더링 되는데 이를 막을 수 있다.
const func = useCallback((e) => setFunc(e.target.checked), []);
🔷 기존 훅을 조합하여 사용하는 것
ex) 눌렀을 때의 상태와 이벤트, 마우스를 올렸을 때의 상태와 이벤트 등
🔷 UI 컴포넌트를 모아서 문서화하고 보여주는 오픈소스 툴
❗ 윈도우 os에서 설치 단계부터 문제에 빠지는 경우가 있다.
내가 그랬다.파워쉘을 관리자 권한으로 실행한 후 간단한 작업을 거쳐서 yarn 명령어가 VSCode에서 돌아갈 수 있게 설정해야한다. 왜냐하면 yarn 명령어 이외의 방법으로 설치나 실행을 하려하면 무조건 오류가 발생하기 때문에 yarn을 사용하지 않던 사람이라도 스토리북을 실행하려면 사용해야만 할 것이다. (윈도우 한정)
💻 Counter.js
import { useState } from "react";
const Counter = ({onIncrease}) => {
const [count, setCount] = useState(0);
const handleIncrease = () => {
setCount(count+1);
onIncrease();
}
return <div>
<div>{count}</div>
<button onClick={handleIncrease}>+</button>
</div>
}
export default Counter;
💻 Counter.stories.js
import React from 'react';
import Counter from '../components/Counter';
export default {
title: 'Example/Counter',
component: Counter,
argTypes: {onIncrease: {action: "clicked"}}
};
const Template = (args) => <Counter {...args} />;
export const Default = Template.bind({});
실행은 yarn storybook 혹은 yarn start 명령어 입력을 통해 실행한다.
여기까지 배운 것들을 다음엔 응용하여 실습해보겠다.