React 초급 -> 시작을 공식문서
로 해보는 것 좋다. 라이브러리를 만든 사람들이 직접 만든 목적
과 사용법
을 정리해둔 것!
친절
하고, 한국어
번역도 거의 되며, Tutorial
도 있다.목적
에 따라 나뉜다.써보기
vs 이해
해보기Javascript
(typescript)로 만들어진 IDE(통합 개발 환경)여러 기능
들이 있음ex)
npx create-react-app my-app
cd my-app
npm start
clasName
, tabindex -> tabIndex
이스케이프
하기때문에 명시적으로 작성되지 않은 내용은 주입되지 않는다.Babel은 JSX -> React.createElement()
호출로 컴파일 함
문서
ex)
App.js(수정)
import './App.css';
import Composition from './components/2-4.Props/Composition';
function App() {
return (
<div className="App">
<Composition />
</div>
)
}
Composition.jsx
import React from 'react'
function Welcome(props) {
return <h1>Hello, {props.name}</h1>
}
export default function Composition() {
return (
<div>
<Welcom name="Byeol"/>
<Welcom name="Timmy"/>
<Welcom name="Tommy"/>
<Welcom name="Amy"/>
</div>
)
}
출력창
재사용하고자 하는 부분을 추출하여 사용한다!
App.js
import './App.css';
import Composition from './components/2-4.Props/Composition';
import Extraction from './components/2-4.Props/Extraction/Extraction';
function App() {
return (
<div className="App">
<Extraction />
<Composition />
</div>
)
}
export default App;
Extraction.jsx(추출전 기능 구현 코드)
import React from "react";
function formatDate(date) {
return date.toLocaleDateString();
}
function Comment(props) {
return (
<div className="Comment">
<div className="UserInfo">
<img
className="Avatar"
src={props.author.avatarUrl}
alt={props.author.name}
/>
<div className="UserInfo-name">{props.author.name}</div>
</div>
<div className="Comment-text">{props.text}</div>
<div className="Comment-date">{formatDate(props.date)}</div>
</div>
);
}
const comment = {
date: new Date(),
text: "I hope you enjoy learning React!",
author: {
name: "Hello Kitty",
avatarUrl: "http://placekitten.com/g/64/64",
},
};
export default function Extraction(props) {
return (
<Comment date={comment.date} text={comment.text} author={comment.author} />
);
}
import React from "react";
function formatDate(date) {
return date.toLocaleDateString();
}
function Avatar(props) {
return (
<img
className="Avatar"
src={props.user.avatarUrl}
alt={props.user.name}
/>
);
}
function UserInfo(props) {
return (
<div className="UserInfo">
<Avatar user={props.user} />
<div className="UserInfo-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>
);
}
const comment = {
date: new Date(),
text: "I hope you enjoy learning React!",
author: {
name: "Hello Kitty",
avatarUrl: "http://placekitten.com/g/64/64",
},
};
export default function Extraction(props) {
return (
<Comment date={comment.date} text={comment.text} author={comment.author} />
);
}
상태조절 예시로 시간 컴포넌트를 사용해 보겠다.
App.js
import './App.css';
import Composition from './components/2-4.Props/Composition';
import Extraction from './components/2-4.Props/Extraction/Extraction';
import ClassComponent from './components/2-5.State/ClassComponent';
function App() {
return (
<div className="App">
<ClassComponent />
<Extraction />
<Composition />
</div>
)
}
export default App;
ClassComponent.jsx
import React, { Component } from "react";
export default class extends Component {
constructor(props) {
super(props);
this.state = { date: new Date() };
}
componentDidMount() { // 그려지자마자 호출됨
this.timerID = setInterval(() => this.tick(), 1000);
}
componentWillUnmount() { // 사라지기 직전에 호출됨
clearInterval(this.timerID);
}
tick() {
this.setState({
date: new Date(),
});
}
render() {
return (
<div>
<h1>Hello, world!</h1>
<h2>It is {this.state.date.toLocaleTimeString()}.</h2>
</div>
);
}
}
import React, { useEffect, useState } from "react";
export default function FunctionalComponent() {
const [date, setDate] = useState(new Date());
const tick = () => {
setDate(new Date());
}
useEffect(() => {
const interval = setInterval(() => tick(), 1000);
return () => {
clearInterval(interval);
};
}, [] );
return (
<div>
<h1>Hello, world! It's Functional</h1>
<h2>It is {date.toLocaleTimeString()}.</h2>
</div>
);
}
constructor()
render()
componentDidMount()
render()
componentDidUpdate()
componentWillUnmount()
import React, { Component } from 'react'
export default class ClassComponent extends Component {
constructor(props) {
super(props);
console.log('constructor');
this.state = { date: new Date() };
this.handleClick = this.handleClick.bind(this);
}
componentDidMount() {
console.log('componentDidMount');
this.timerID = setInterval(() => this.tick(), 1000);
}
componentDidUpdate() {
console.log('componentDidUpdate');
}
componentWillUnmount() {
console.log('componentWillUnmount');
clearInterval(this.timerID);
}
tick() {
//console.log('tick');
this.setState({date: new Date()});
}
handleClick() {
alert(this.state.date);
}
render() {
console.log('render');
return (
<div>
<h1 onClick={this.handleClick}>Hello, world!</h1>
<h2>{this.state.date.toLocaleTimeString()}</h2>
</div>
)
}
}
this.handleClick = this.handleClick.bind(this);
syntheticEvent(합성이벤트)
지원하는 이벤트
e.preventDefault()
: 리액트는 이렇게 디폴트 기능 꺼줘야.. if else 문 사용
조건부분
) {조건부분이 true 이면 리턴
} else {false면 리턴
}논리 && 연산자로 If를 인라인으로 표현하기
조건
&& A -> 조건이 TRUE이면 A가 그려지고, 아니면 안그려짐falsy
한 표현일 경우 조건 값이 그려져버릴 수 있다.&&
뒤의 엘리먼트는 조건이 true
일 때 출력.false
라면 React는 무시한다.조건부 연산자로 If-Else구문 인라인으로 표현하기
[조건부분] ?
[true일때 실행될 부분] :
[false일때 실행될 부분]
return null;
해라!기억해둘것!
: 컴포넌트 자체에 value를 주고 state로 관리 하는 것
App.js
import './App.css';
import ControlledComponent from './components/2-10.Form/ControlledComponent';
function App() {
return (
<div className="App">
<ControlledComponent />
</div>
)
}
export default App;
ControlledComponent.jsx
import React, { useState } from "react";
export default function ControlledComponent() {
const [name, setName] = useState("");
const [flavor, setFlavor] = useState("coconut");
const [essay, setEssay] = useState("Please write an essay about your favorite DOM element.");
function handleChange(event) {
setName(event.target.value);
}
function handleEssayChange(event) {
setEssay(event.target.value);
}
function handleFlavorChange(event) {
setFlavor(event.target.value);
}
function handleSubmit(event) {
alert(`name: ${name}, essay: ${essay}, flavor: ${flavor} `);
event.preventDefault();
}
return (
<form onSubmit={handleSubmit}>
<label>
Name:
<input type="text" value={name} onChange={handleChange} />
</label>
<br />
<br />
<label>
Essay:
<textarea value={essay} onChange={handleEssayChange} />
</label>
<br />
<br />
<label>
Pick your favorite flavor:
<select value={flavor} onChange={handleFlavorChange}>
<option value="grapefruit">Grapefruit</option>
<option value="lime">Lime</option>
<option value="coconut">Coconut</option>
<option value="mango">Mango</option>
</select>
</label>
<input type="submit" value="Submit" />
</form>
);
}
App.js
import './App.css';
import ControlledComponent from './components/2-10.Form/ControlledComponent';
import UncontrolledComponent from './components/2-10.Form/UncontrolledComponent';
function App() {
return (
<div className="App">
<ControlledComponent />
<br />
<br />
<UncontrolledComponent />
</div>
)
}
export default App;
UncontrolledComponent.jsx
import React, { useRef } from "react";
export default function UncontrolledComponent() {
const fileInputRef = useRef(null);
function handleSubmit(event) {
event.preventDefault();
alert(
`Selected file - ${fileInputRef.current.files[0].name}`
);
}
return (
<form onSubmit={handleSubmit}>
<label>
Upload file:
<input type="file" ref={fileInputRef} />
</label>
<br />
<button type="submit">Submit</button>
</form>
);
}
import React, { useState } from "react";
export default function ControlledComponent() {
const [name, setName] = useState("");
const [flavor, setFlavor] = useState("coconut");
const [essay, setEssay] = useState(
"Please write an essay about your favorite DOM element.");
function handleChange(event) {
const name = event.target.name;
if (name === "name") {
setName(event.target.value);
}
if (name === "essay") {
setEssay(event.target.value);
}
if (name === "flavor") {
setFlavor(event.target.value);
}
}
// function handleEssayChange(event) {
// setEssay(event.target.value);
// }
// function handleFlavorChange(event) {
// setFlavor(event.target.value);
// }
function handleSubmit(event) {
alert(`name: ${name}, essay: ${essay}, flavor: ${flavor} `);
event.preventDefault();
}
return (
<form onSubmit={handleSubmit}>
<label>
Name:
<input name = "name" type="text" value={name} onChange={handleChange} />
</label>
<br />
<br />
<label>
Essay:
<textarea name = "essay" value={essay} onChange={handleChange} />
</label>
<br />
<br />
<label>
Pick your favorite flavor:
<select name = "flavor" value={flavor} onChange={handleChange}>
<option value="grapefruit">Grapefruit</option>
<option value="lime">Lime</option>
<option value="coconut">Coconut</option>
<option value="mango">Mango</option>
</select>
</label>
<input type="submit" value="Submit" />
</form>
);
}
name
, type
등으로 사용 가능하다.출처 : fastcampus_React & Redux로 시작하는 웹 프로그래밍