1) 컴포넌트의 뜻
2) 컴포넌트 제작
[App.js]
import Hello from './Hello.js';
import World from './World.js';
//js 붙이지 않아도 자동으로 읽어옴
export default function App() {
return (
<div>
<Hello></Hello>
<World></World>
//<World /> 이렇게도 사용 가능
</div>
);
}
[Index.js]
import ReactDOM from "react-dom";
import App from "./App";
ReactDOM.render(<App />, document.getElementById("root"));
[Hello.js]
export default functuon Hello() {
return <h1>Hello</h1>
[World.js]
export default function World() {
return <h2>World</h1
3) JSX와의 차이점
import
- 모듈을 불러오기
export
- 모듈을 내보내기
4) 컴포넌트 생성 시 주의사항
MyComponent
ArtuclePage
UserProfile
index.js
- entry point
- 최종 컴포넌트를 DOM에 render (ReactDOM.render)
App.js- 모든 컴포넌트들의 root 컴포넌트
1) Props의 개념
//App 컴포넌트에서 MyComponent 컴포넌트에 value라는 속성으로 텍스트를 전달
function App(){
return (
<div>
<MyComponent value={'test'}/>
</div>
);
}
funtion MyComponent(props) {
return <div>{props.value}</div>;
}
//컴포넌트에 감싸주는 방법
funtion App() {
return (
<div>
<MyComponent>
<h1>value</h1>
</MyComponent>
</div>
);
}
function MyComponent(props) {
return <div>{props.children}</div>;
}
2) Props의 활용 팁
3) 실습
[App.js]
import Heading from './components/Heading';
export default function App() {
return (
<div>
<Heading type ="h1">Hello<Heading/>
<Heading tyle = "h2">World</Heading>
</div>
);
}
[Index.js]
import ReactDOM from 'react-dom';
import App from './App';
ReactDOM.render(
<App />,
document.getElementById('root')
);
[Heading.js]
export default funtion Heading{props} {
if(props.type === 'h2') {
return <h2>{props.children}</h2>
}
return <h1>{props.children}</h1>;
}
1) State의 개념
State 값이 변하면 컴포넌트가 리렌더링 됨
렌더링 사이클에서 값이 보존됨리렌더링 : 특정 조건이 발생하면 다시 렌더링을 진행
- 내부 상태(state) 변경 시
- 부모에서 전달받은 값(props) 변경 시
- 중앙 상태값(Context value 혹은 redux store) 변경 시
- 부모 컴포넌트가 리렌더링되는 경우
2) State가 만들어지는 과정
[App.js]
// - value를 state로 만들기
// - Increase 버튼 함수 만들기 (+함수형 인자로)
// - Reset 버튼 함수 만들기
import{ useState } from "react";
export default function App() {
const [value, setState] = useState(0);
// 초기값 0으로 설정
// value : 현재 상태 값(여기서는 0부터 시작)
// setState : 상태를 업데이트하는 함수. 이 함수가 호출되면 React는 상태를 업데이트하고 컴포넌트를 다시 렌더링
return (
<div>
<h1>value: {value}</h1>
<button
onClick = {() => {
console.log('Increase value1', value);
value = value + 1;
console.log('Increase value2', value);
}}
>
Increase value
</button>
<button onClick={() => {
setValue(0)
}}>Reset value</button>
</div>
);
}
[index.js]
import ReactDOM from 'react-dom';
import App from './App';
ReactDOM.render(
<App />,
document.getElementById('root')
);
1) 클래스형 컴포넌트
useState와 같은 Hooks는 React 버전 16.8부터 등장
즉, 그 전에는 함수형 컴포넌트에서 state를 사용할 수 없었고, 클래스형 컴포넌트만 state를 가질 수가 있었음.
클래스의 멤버 변수로 state 정의
render라는 멤버 함수에서 반환한 값(JSX)이 화면에 그러짐
2) 함수형 컴포넌트
3) HooKs의 등장 이유
4) 실습 코드
[React.js]
import React, { Component } from 'react';
export default class App extends Component {
//클래스형 컴포넌트 구현
state = {
value1: 0
};
//이렇게 state 정의
//const [value1,setValue1] = useState(0);
//const [value2,setValue2] = useState(0);
constructor(props) {
super(props);
this.state = {
//this로 멤버 함수 호출
value: 1
};
}
resetValue() {
this.setState({ value: 0 });
}
render() {
return (
<div>
<h1>value: {this.state.value}</h1>
<button
onClick={() => {
this.setState((state) => ({
value: state.value + 1
}));
}}
>
Increase value
</button>
<button
onClick={this.resetValue.bind(this)}
//this.resetValue만 사용한다면 resetValue를 호출했을 때 setState 함수를 가지고 있지 않아서 오류가 발생. -> bind 사용하면 App 클래스를 호출하여 오류 없음.
>
Reset value
</button>
</div>
);
}
}