html 태그는 항상 return 이후, 반드시 한 부모 요소가 전체 요소를 감싸는 형태!
function App() {
const str = 'hello';
return (
<div className='App'>
<span>{str}</span>
<span>world</span>
</div>
);
}
export default App;
html을 작성하다가 중간에 JS 문법을 사용하고 싶을 때는 중괄호 {}로 감싸야 함!
const str = 'hello,';
return(
<div className='App'>
<span>{str}</span>
<span>{str === 'hello,' ? 'world' : '세상'}</span>
<div>
{str === 'hello,' ? (<div><h2>react</h2></div>) : (<div><h2>리액트</h2></div>)}
</div>
</div>
);
const numbers = [1,2,3,4];
let sum = 0;
for (let num of numbers)
sum += num;
export default function App(){
return <span>{sum}</span>;
}
CSS를 인라인 형태로 적용할 때는 {object}형태로 저장!
export default function App() {
return <div style={{ fontSize: '32px', backgroundColor: 'crimson' }}>인라인 스타일</div>;
}
export default function App() {
const divStyle = { fontSize: '32px', backgroundColor: 'crimson' };
return <div style={divStyle}>인라인 스타일</div>;
}
return(
<div className='App' onClick={()=>{alert('hi')}}>
<span>{str}</span>
<span>wordl!!</span>
</div>
);
opening tag(빈태그)도 closing tag가 필요함
export default function App(){
return(
<div>
<input type='text' />
<input type='text'></input>
<br />
<br></br>
<img src={~} alt='alt' />
<img src={~} alt='alt'></img>
</div>
);
}
export default function App(){
/* return 밖에서의 주석 (기존의 JavaScript와 동일) */
return(
<div>
{/* return 내부에서의 주석 */}
</div>
)
}
기존 JavaScript에서, 에러 확인을 위해 console 창을 봐야했으나 React는 치명적인 버그일 경우 화면에 바로 띄워줌!
properties를 줄인 표현으로 컴포넌트 속성을 설정할 때 사용하는 요소
{/* 일반 사용법 */}
<ClassComponent />
{/* props 사용법 */}
<ClassComponent title="제목" content="내용" />
// 부모 컴포넌트에서 name props 전달
<FuncComponent name="새싹" />
// 자식 컴포넌트에서 name props 받음
const FuncComponent = (props) => {
return(
<>
<div>안녕? {props.name}</div>
<div>반가워!</div>
</>
)
}
부모 컴포넌트에서 props가 전달되지 않았을 때 기본값으로 보여줄 props 설정
// 부모 컴포넌트
<FuncComponent/>
// 자식 컴포넌트
const FuncComponent = (props) => {
return(
<>
<div>안녕? {props.name}</div>
<div>반가워!</div>
</>
)
}
FuncComponent.defaultProps = {
name: '홍길동'
}
부모 컴포넌트에서 자식 컴포넌트를 호출할 때 태그 사이에 작성한 문자열
// 부모 컴포넌트
<FuncComponent name="새싹">자식 내용</FuncComponent>
// 자식 컴포넌트
const FuncComponent = (props) => {
return(
<>
<div>안녕? {props.name}</div>
<div>반가워!</div>
<h4>{props.children}</h4>
</>
)
}
컴포넌트의 필수 props를 지정하거나 props의 타입을 지정할 때 사용
import PropTypes from 'prop-types';
FuncComponent.propTypes = {
name: PropTypes.string
}
class ClassComponent extends Component{
render() {
return(
<h1>Class Component 입니다. 이름은 {this.props.name}</h1>
);
}
// 방법 1
static defaultProps = {
name: '기본 이름',
};
static propTypes = {
name: PropTypes.string
};
}
// 방법 2
ClassComponent.defaultProps = {
name: '홍길동'
}
ClassComponent.propTypes = {
name: PropTypes.string
}
React에서 앱의 유동적인 데이터를 다루기 위한 개체
state vs. props
- props : 부모 컴포넌트에서 자식 컴포넌트에 데이터 전달 시 사용(읽기모드)
- state : 특정 컴포넌트가 갖는 상태 (값)
- 컴포넌트 내부에서 선언되고 내부에서 값을 변경함
import React, { Component } from "react";
class ClassState extends Component {
constructor(props){
super(props);
this.state = {
number: 0,
};
}
render(){
const { number } = this.state;
return (
<div> <h3>Number : {number}</h3> </div>
)
}
}
export default ClassState;
import React, { Component } from "react";
class ClassState extends Component {
state = {
number: 0,
};
render() {
const { number } = this.state;
return (
<div> <h3>Number : {number}</h3> </div>
);
}
}
export default ClassState;
import React, { useState } from 'react';
const FuncState = () => {
const [ msg, setMsg ] = useState(""); // 상태의 초기값
const onClickEnter = () => { setMsg("안녕하세용"); };
const onClickLeave = () => { setMsg("안녕히가세용"); };
return (
<div>
<button onClick={onClickEnter}>입장</button>
<button onClick={onClickLeave}>퇴장</button>
<h1>{msg}</h1>
</div>
);
};
export default FuncState;
<!-- 문자열 형식 호출문 등록 -->
<button onclick="antionEvent()">
Event Button
</button>
// 괄호를 없애 함수를 바로 실행하지 않고,
// 클릭이 발생했을 경우 함수가 호출됨
addEventListner('click', onClickEvent)
// 괄호를 없애 함수를 바로 실행하지 않고,
// 클릭이 발생했을 경우 함수가 호출됨
<button onClick={activeEvent}>
Event Button
</button>
Synthetic Event(합성 이벤트)
모든 브라우저에서 이벤트를 동일하게 처리하기 위한 Wrapper 객체
Wrapping 이란?
기본 기능을 감싸는 새로운 기능
리액트가 DOM이 아닌 VirtualDOM을 사용하는 것처럼 웹 브라우저의 nativeEvent가 아닌 nativeEvent를 감싼 SyntheticEvent를 사용
클래스형 컴포넌트에서는 this를 사용해야 함수를 찾아갈 수 있음 (state, props와 동일)
<button onClick={this.printConsole}>printConsole2</button>
<button onClick={this.handleConsole}>handleButton</button>
constructor(props) {
super(props);
this.eventExample = this.eventExample.bind(this);
}
eventExample(){
console.log(this);
}
eventExample = () => {
console.log(this);
}
<button onClick={() => onClickEvent("인자1")>클릭 이벤트</button>
<button onClick={(e) => onClickEvent2(e, "인자1")>클릭 이벤트</button>
<button onClick={onClickEvent.bind(null, "인자1")>클릭 이벤트</button>
<button onClick={increase}>더하기</button>
<button onClick={() => alertMsg('hello~')}>alert 출력</button>
<button onClick={(e) => consoleMsg(e, 'hello~')}console 출력</button>
e 객체
- e 객체는 합성 이벤트
- 사용 이유
- 브라우저마다 이벤트 이름, 종류 등 이벤트를 처리하는 방식이 다르기 때문