import React, { Component } from 'react';
class App extends Component {
render() {
return (
<div>
<h1>안녕하세요 리액트</h1>
</div>
);
}
}
export default App;
<div>
<input> // Error
<input /> // okay
</div>
<div> hi </div>
<div> bye </div> //Error
<div>
<div> hi </div>
<div> bye </div> //Okay
</div>
<fragment>
<div> hi </div>
<div> bye </div> //Okay
</fragment>
// 불필요한 div를 지우고 할수 있다.
//var
render(){
function foo(){
var a = 'hello ';
if(true){
var a = 'bye';
console.log(a) ; //bye
}
console.log(a) ; //bye
}
}
//let
render(){
function foo(){
let a = 'hello ';
if(true){
let a = 'bye';
console.log(a) ; //bye
}
console.log(a) ; //hello
}
}
class App extends Component {
render() {
return (
<div>
{
1 + 1 === 2
? '맞다'
: '틀리다'
}
</div>
);
}
}
render() {
const name ="tiger"
return (
<flagment>
<div>
{
name === 'tiger' && <div> 타이거 </div>
}
</div>
</flagment>
);
}
render(){
const style = {
backgroudColor: 'black',
// background-color > backgroundColor 카멜케이스 적용
padding: '16px',
color:'red'
}
return(
<div style = {style}> hi
</div>
)
}
import React, { Component } from 'react';
import './aqua.css';
class App extends Component {
render(){
return (
<div className="aqua">
// js에선 <div class="aqua">
hi
</div>
)
}
}
<div>
{/*이렇게 써야함*/}
<h1
something=blahblah // 여기선 이 주석을 사용
>
hi
</h1>
</div>
// MyName.js
import React, {Component} from 'react';
class MyName extends Component {
render(){
return(
<div>
안녕하세요 ! 제이름은 <b>Tiger</b>입니당.
안녕하세요 ! 제이름은 <b>{this.props.name}</b>입니당.
</div>
)
}
}
export default MyName;
// App.js
import React, { Component } from "react";
import MyName from "./MyName";
class App extends Component {
render() {
return <MyName name="리액트" />;
}
}
export default App;
import React, { Component } from "react";
class MyName extends Component {
static defaultProps = {
name: '기본이름'
} // 방식 1번째
render() {
return (
<div>
안녕하세요 ! 제이름은 <b>Tiger</b>입니당. <br />
안녕하세요 ! 제이름은 {this.props.name} 입니당.
</div>
);
}
}
MyName.defaultProps = {
name: '기본이름 2 '
} // 방식 2번째
export default MyName;
import React from "react";
const MyName = ({ name }) => {
// 비구조화 할당
return <div>안녕하세요 함수형 컴퍼넌트 {name} 입니다.</div>;
};
MyName.defaultProps = {
name: "함수형 기본이름"
};
export default MyName;
// 두개의 주요 차이점은 state와 lifecycle의 유무이다.
// 어떨때 사용해야 하는가 초기 마운트 속도가 더 빠르다.
// 불필요한 기능이 없어서 메모리자원을 덜 잡아먹는다.
// Counter.js
import React, { Component } from "react";
class Counter extends Component {
state = {
number: 0
};
handleIncrease = () => {
this.setState({
number: this.state.number + 1
});
};
handleDecrease = () => {
this.setState({
number: this.state.number - 1
});
};
render() {
return (
<div>
<h1> counter </h1>
<div> 값: {this.state.number} </div>
<button onClick={this.handleIncrease}>+</button>
<button onClick={this.handleDecrease}>-</button>
</div>
);
}
}
export default Counter;
//App.js
import React, { Component } from "react";
import Counter from "./Counter";
class App extends Component {
render() {
return <Counter />;
}
}
export default App;
constructor(props) {
super(props);
}
componentDidMount() {
// 외부 라이브러리 연동: D3, masonry, etc
// 컴포넌트에서 필요한 데이터 요청: Ajax, GraphQL, etc
// DOM 에 관련된 작업: 스크롤 설정, 크기 읽어오기 등
}
componentDidMount() {
// 외부 라이브러리 연동: D3, masonry, etc
// 컴포넌트에서 필요한 데이터 요청: Ajax, GraphQL, etc
// DOM 에 관련된 작업: 스크롤 설정, 크기 읽어오기 등
}
static getDerivedStateFromProps(nextProps, prevState) {
// 여기서는 setState 를 하는 것이 아니라
// 특정 props 가 바뀔 때 설정하고 설정하고 싶은 state 값을 리턴하는 형태로
// 사용됩니다.
/*
if (nextProps.value !== prevState.value) {
return { value: nextProps.value };
}
return null; // null 을 리턴하면 따로 업데이트 할 것은 없다라는 의미
*/
}
shouldComponentUpdate(nextProps, nextState) {
// return false 하면 업데이트를 안함
// return this.props.checked !== nextProps.checked
return true;
}
특정조건에 따라 렌더링을 막아줄 수 있는 api
더이상 사용되지 않는다.
1. render()
2. getSnapshotBeforeUpdate()
3. 실제 DOM 에 변화 발생
4. componentDidUpdate
getSnapshotBeforeUpdate(prevProps, prevState) {
// DOM 업데이트가 일어나기 직전의 시점입니다.
// 새 데이터가 상단에 추가되어도 스크롤바를 유지해보겠습니다.
// scrollHeight 는 전 후를 비교해서 스크롤 위치를 설정하기 위함이고,
// scrollTop 은, 이 기능이 크롬에 이미 구현이 되어있는데,
// 이미 구현이 되어있다면 처리하지 않도록 하기 위함입니다.
if (prevState.array !== this.state.array) {
const {
scrollTop, scrollHeight
} = this.list;
// 여기서 반환 하는 값은 componentDidMount 에서 snapshot 값으로 받아올 수 있습니다.
return {
scrollTop, scrollHeight
};
}
}
componentDidUpdate(prevProps, prevState, snapshot) {
if (snapshot) {
const { scrollTop } = this.list;
if (scrollTop !== snapshot.scrollTop) return; // 기능이 이미 구현되어있다면 처리하지 않습니다.
const diff = this.list.scrollHeight - snapshot.scrollHeight;
this.list.scrollTop += diff;
}
}
componentWillUnmount() {
// 이벤트, setTimeout, 외부 라이브러리 인스턴스 제거
}
componentDidCatch(error, info) {
this.setState({
error: true
});
}
//iterm
npx create-react-app my-app
//vscode
// my-app 열기
npm start
const numbers = [1,2,3,4,5]
console.log(numbers.slice(0,2))
// 0부터~2까지 index 까지의 배열을 가져와 새로운 배열출력
-.fliter
const numbers = [1,2,3,4,5];
console.log(numbers.filter(n => n>3)) // 3보다 큰
console.log(numbers.filter(n => n!== 3)) // 3이아닌
const numbers = [1,2,3,4,5]
[
...numbers.slice(0,2),
0
...numbers.slice(3,5)
]
numbers.map(n => {
if (n === 3 {
return 9
})
})