React is a JavaScript library, is used for building UIs and front-end applications.
Often called a framework.
선언적 VS 절차적
-
const hi = <p>Hi</p>;
const hi = <p>Hi</p>;
const myFavorite = {
food: <li>샐러드</li>,
animal: <li>dog></li>,
hobby: <li>programming</li>
};
<div />
<div></div> 는 동일
const hi = <input readOnly={true} />;
const myFavorite = {
food: <li>샐러드</li>,
animal: <li>dog</li>,
hobby: <li className="list-item">programming</li>
};
reactDOM.render{
<h1>Hello, World!</hi>
document.getelementById('root')
};
function Welcome() {
return <h1>Hello </h1>;
}
ReactDOM.render(
<Welcome />,
document.getElementById('root')
);
class Welcome extends React.Component {
render() {
return <h1>Hello, {this.props.name}</h1>;
}
}
function Comment(props) {
return (
<div className="comment">
<div className="user-info">
<img className="avatar"
src={props.author.avatarUrl}
alt={props.author.name}
/>
<div className="user-info-name">
{props.author.name}
</div>
</div>
<div className="comment-text">
{props.text}
</div>
<div className="comment-date">
{formatDate(props.date)}
</div>
</div>
);
}
function Avatar(props) {
return (
<img className="avatar"
src={props.user.avatarUrl}
alt={props.user.name}
/>
);
}
Avatar 컴포넌트에서 user의 avatarUrl과 name이 필요하므로, Comment 컴포넌트에서 props.author 정보를 user라는 attribute로 넘겨주었습니다. props.author의 avatarUrl, name 값이 user를 통해 전달되었습니다.
.user-info 부분을 component 로 분리하는 경우.
function UserInfo(props) {
return (
<div className="user-info">
<Avatar user={props.user} />
<div className="user-info-name">
{props.user.name}
</div>
</div>
);
}
function Comment(props) {
return (
<div className="comment">
<UserInfo user={props.author} />
<div className="comment-text">
{props.text}
</div>
<div className="comment-date">
{formatDate(props.date)}
</div>
</div>
);
}
class Button extends React.Component {
constructor() {
super();
this.state = {
clicked: false
}
}
render() {
return (
<div
className="btn"
onClick={()=>{this.setState({ clicked: !this.state.clicked })}}
>
{this.state.clicked ? '좋아요' : '싫어요'}
</div>
);
}
}
ReactDOM.render(
<Button />,
document.getElementById('root')
);
상단의 코드는 버튼을 눌렀을때 state 를 변화시켜 화면에 보여지는 텍스트가 "좋아요" "싫어요" 로 클릭할때마다 바뀐다.
state 는 여러개 추가가 가능하며 이름은 원하는 대로 짓는다.
click 이벤트 발생시 clicked 라는 state 가 수정된다.
constructor() 함수는 class 의 instance가 생성될때 항상 호출되는 함수생성자 이다.
constructor() {
super();
this.state = {
clicked: false
}
}
button component 를 그리려면 this.state.clicked 값이 필요한데 최초에는 해당 값이 존재하지 않으므로 constructor 에서 false 값을 지정해 준다.
super() 키워드는 React.Component class에 있는 methods( ex. render) 을 사용하기 위해 꼭 필요하다.
props 도 추가한 코드
class Button extends React.Component {
constructor() {
super();
this.state = {
clicked: false
}
}
render() {
return (
<div
className={`btn ${this.props.type === 'like' ? 'like-btn' : ''}`}
onClick={()=>{this.setState({ clicked: !this.state.clicked })}}
>
{this.state.clicked ? '좋아요' : '싫어요'}
</div>
);
}
}
ReactDOM.render(
<Button type="like" />,
document.getElementById('root')
);
function tick() {
const element = (
<div>
<h1>Hello, world!</h1>
<h2>It is {new Date().toLocaleTimeString()}.</h2>
</div>
);
ReactDOM.render(
element,
document.getElementById('root')
);
}
setInterval(tick, 1000);
onClick={()=>{this.setState({ clicked: !this.state.clicked })}}
를 통해 event handling 을 하는것을 볼 수 있다.
class Button extends React.Component {
constructor() {
super();
this.state = {
clicked: false
}
this.handleClick = this.handleClick.bind(this);
}
handleClick() {
this.setState({
clicked: !this.state.clicked
});
}
render() {
return (
<div
className={`btn ${this.props.type === 'like' ? 'like-btn' : ''}`}
onClick={this.handleClick}
>
{this.state.clicked ? '좋아요' : '싫어요'}
</div>
);
}
}
ReactDOM.render(
<Button type="like" />,
document.getElementById('root')
);
this.handleClick = this.handleClick.bind(this);