Node.js
설치하기npx creat-react-app 폴더이름
cd 폴더이름
npm start
npm install
//App.js
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
ReactDOM.render(<App />, document.getElementById('root'));
.js
를 빼 준다. import App from './App'
)<App />
이라는 컴포넌트 사용됨div id='root'
를 찾아가서 렌더링 함//index.js
function App() {
return (
<div>
<h2>Let's get started!</h2>
</div>
);
}
export default App;
export default App;
으로 내보내기 가능다음 스크린샷에 보이는 함수는 자바스크립트 코드가 아닌데 웹에서 브라우징 할때 리액트에서 함수를 변형해주어 개발자들이 편하게 코드를 쓸 수 있게 해준다.
App()
함수 function App() {
return (
<div>
<h2>Let's get started!</h2>
</div>
);
}
export default App;
const para = document.createElement('p');
para.textContent = 'This is also visible';
document.getElementById('root').append(para);
ExpendItem.js
function ExpendItem() {
return <h2>Expend item!</h2>;
}
export default ExpendItem;
export default ExpendItem;
) 해주고 App.js에서 가져오기 해준다.import ExpendItem from "./component/ExpendItem";
function App() {
return (
<div>
<h2>Let's get started!</h2>
<ExpendItem></ExpendItem>
</div>
);
}
export default App;
Shift+Alt+F
Ctl+K+F
function ExpendItem() {
return (
<div>
<div>Jan 1st 2022</div>
<div>
<h2>React component guide</h2>
<div>My blog 2JE0</div>
</div>
</div>
);
}
export default ExpendItem;
ExpendItem.css
파일 생성하기ExpendItem.js
파일에서 import
해주기 import "./ExpendItem.css";
<div class="expense-item">
와 같이 했다면<div className="expense-item">
와 같이 해야함import "./ExpendItem.css";
function ExpendItem() {
return (
<div className="expense-item">
<div>Jan 1st 2022</div>
<div className="expense-item__description">
<h2>React component guide</h2>
<div className="expense-item__price">$294.67</div>
</div>
</div>
);
}
export default ExpendItem;
자바스크립트 언어임에도 불구하고 아직까지 자바스크립트 문법을 사용하지는 않았다 (함수 표현하는것을 제외하고는)
그리고 데이터들이 모두 하드코딩 되어있는데, 실제로 하드코딩으로 컴포넌트를 만든다면 재사용이 불가능할 것이다.
따라서 이번에는 자바스크립트 코드를 통해서 동적으로 데이터를 출력 해본다.
{ }
중괄호를 사용하면 자바스크립트 코드를 사용할 수 있다. import "./ExpendItem.css";
function ExpendItem() {
const expendDate = new Date();
const expendTitle = "React component guide";
const expendPrice = 294.67;
return (
<div className="expense-item">
<div>{expendDate.toISOString()}</div>
<div className="expense-item__description">
<h2>{expendTitle}</h2>
<div className="expense-item__price">${expendPrice}</div>
</div>
</div>
);
}
export default ExpendItem;
위의 코드는 동적으로 데이터를 출력하지만, 동적으로 출력하는 데이터 또한
const
변수로 데이터가 고정되어 있다.
컴포넌트를 재사용하기 위해서 형태는 고정되어있지만, 데이터를 바꿀수 있는 문법이 필요한데 그것이 바로 props이다.
//App.js
import ExpendItem from "./component/ExpendItem";
function App() {
const expenses = [
{
id: "e1",
title: "Toilet Paper",
amount: 94.12,
date: new Date(2020, 7, 14).toISOString(),
},
{
id: "e2",
title: "New TV",
amount: 799.49,
date: new Date(2021, 2, 12).toISOString(),
},
{
id: "e3",
title: "Car Insurance",
amount: 294.67,
date: new Date(2021, 2, 28).toISOString(),
},
{
id: "e4",
title: "New Desk (Wooden)",
amount: 450,
date: new Date(2021, 5, 12).toISOString(),
},
];
return (
<div>
<h2>Let's get started! </h2>
<ExpendItem
title={expenses[0].title}
amount={expenses[0].amount}
date={expenses[0].date}
></ExpendItem>
<ExpendItem
title={expenses[1].title}
amount={expenses[1].amount}
date={expenses[1].date}
></ExpendItem>
<ExpendItem
title={expenses[2].title}
amount={expenses[2].amount}
date={expenses[2].date}
></ExpendItem>
<ExpendItem
title={expenses[3].title}
amount={expenses[3].amount}
date={expenses[3].date}
></ExpendItem>
</div>
);
}
export default App;
//component.js
import "./ExpendItem.css";
function ExpendItem(props) {
return (
<div className="expense-item">
<div>{props.date}</div>
<div className="expense-item__description">
<h2>{props.title}</h2>
<div className="expense-item__price">${props.amount}</div>
</div>
</div>
);
}
export default ExpendItem;
이전의 코드는 날짜가 다음 사진의 형태로 되어있어서 읽기가 힘들었다.
따라서 컴포넌트 안에서 날짜에 대한 변수를 js 문법을 통해서 선언해준다.
import "./ExpendItem.css";
function ExpendItem(props) {
const month = props.date.toLocaleString("en-US", { month: "long" });
const day = props.date.toLocaleString("en-US", { day: "2-digit" });
const year = props.date.getFullYear();
return (
<div className="expense-item">
<div>
<div>{year}</div>
<div>{month}</div>
<div>{day}</div>
</div>
<div className="expense-item__description">
<h2>{props.title}</h2>
<div className="expense-item__price">${props.amount}</div>
</div>
</div>
);
}
export default ExpendItem;
위의 코드에서 날짜 컴포넌트를 추가하니 한 파일의 크기가 커졌다.
따라서 ExpendItem 컴포넌트를 두개로 분리해 보려고 한다.
ExpendDate.js
로 옮겨준다. const month = props.date.toLocaleString("en-US", { month: "long" });
const day = props.date.toLocaleString("en-US", { day: "2-digit" });
const year = props.date.getFullYear();
ExpendDate.js
로 옮겨준다. <div>
<div>{year}</div>
<div>{month}</div>
<div>{day}</div>
</div>
가져오기 내보내기
ExpendItem.js
파일에 import
문을 추가해준다.
import ExpendDate from "./ExpendDate";
props
ExpendDate.js
의 함수 인자에는 props
가 들어가야하고
ExpendItem.js
안에 컴포넌트를 추가하고 props를 넣는다.
<ExpendDate date={props.date} />
스타일링 추가하기
import "./ExpendDate.css";
컴포넌트 안에 내용이 없을 때
<ExpendDate></ExpendDate>
대신에 <ExpendDate />
을 쓴다.
//Expenses.js
import ExpendItem from "./ExpendItem";
import "./Expenses.css";
function Expenses(props) {
return (
<div className="expenses">
<ExpendItem
title={props.data[0].title}
amount={props.data[0].amount}
date={props.data[0].date}
/>
<ExpendItem
title={props.data[1].title}
amount={props.data[1].amount}
date={props.data[1].date}
/>
<ExpendItem
title={props.data[2].title}
amount={props.data[2].amount}
date={props.data[2].date}
/>
<ExpendItem
title={props.data[3].title}
amount={props.data[3].amount}
date={props.data[3].date}
/>
</div>
);
}
export default Expenses;
App.js 파일을 간소화 하기 위함
//App.js
return (
<div>
<h2>Let's get started! </h2>
<Expenses data={expenses} />
</div>
);
<Card></Card>
태그 안에 내용을 넣는 wrapper container를 만들수 도있다.
wrapper container component 안에 props를 이용하여 props.children
을 사용하면 태그 안에 들어가 있는 내용들을 감쌀 수 있다.
그런데 그렇게 하게 되면 <Card className = 'card'></Card>
처럼 클래스를 중복으로 사용할 수 없게 되는데 그럴때의 솔루션이 다음과 같다.
const classes
라는 변수를 선언한 후에 적용하고 싶은 클래스와 안쪽으로 들어오는 태그를 문자열 형태로 저장한다.
이때 첫번째 클래스이후 띄어쓰기를 해주어야 한다
그리고 wrapper container의 클래스를 그 문자열로 지정해 준다.
//Card.js
import "./Card.css";
function Card(props) {
const classes = "card " + props.className;
return <div className={classes}>{props.children}</div>;
}
export default Card;
//ExpendItem.js
return (
<Card className="expense-item">
<ExpendDate date={props.date} />
<div className="expense-item__description">
<h2>{props.title}</h2>
<div className="expense-item__price">${props.amount}</div>
</div>
</Card>
);