react란
업데이트:
카테고리: react
/클래스형 컴포넌트
import React, {Component} from "react";
// 리액트에서 사용하는 컴포넌트를 사용하기 위해 상속
export default class App extends Component {
render() {
// 해당 UI 작성
return(
<div>
안녕하세요
</div>
)
}
}
함수형 컴포넌트
import logo from './logo.svg';
import './App.css';
function App() {
return (
<div className="App">
<header className="App-header">
<img src={logo} className="App-logo" alt="logo" />
<p>
Edit <code>src/App.js</code> and save to reload.
</p>
<a
className="App-link"
href="https://reactjs.org"
target="_blank"
rel="noopener noreferrer"
>
Learn React
</a>
</header>
</div>
);
}
export default App;
⇒ render를 작성할 필요가 없다
⇒ 클래스 작성은 class x className
css 적용
-
해당 앱과 같은 이름에 css 파일에서 작성한다.
// 앱 상단에 import를 해줘야한다. import "./App.css"
-
클래스 안에서 작성
export default class App extends Component { btnStyle = { color: "#fff", border: "none", padding: "5px 9px", borderRadius: "50%", cursor: "pointer", float: "right" }; // 속성을 부여 <button style={this.btnStyle}>x</button> }
-
함수로 정의
getStyle = () => { return { padding: "10px", borderBottom: "1px #ccc dotted" } } // 태그 안에서 스타일에 적용 <div style={this.getStyle()}>
Map 메소드
map 함수는 모든 요소 각각에 대하여 주어진 함수를 호출한 결과를 모아 새로운 배열을 반환한다.
todoData = [
{
id: "1",
title: "공부하기",
completed: true,
},
{
id: "2",
title: "청소하기",
completed: false,
},
]
// map을 이용해 해당 데이터를 나열한다.
{this.todoData.map(data => (
// 유니크한 key가 필요하다.
<div style={this.getStyle()} key={data.id}>
<input type="checkbox" defaultChecked={false}/>
{data.title}
<button style={this.btnStyle}>x</button>
</div>
))}
Key
- React가 변경, 추가, 제거된 항목을 식별하는데 도움이 된다.
- 가상돔을 이용하여 바뀐 부분만 변경하기 때문에 key를 이용하여 바뀐 요소를 인식할수 있다.
Filter 메소드
// 버튼 클릭시 해당 함수가 실행
<button style={this.btnStyle} onClick={() => this.handleClick(data.id)}>x</button>
handleClick = (id) => {
let newTodoData = this.todoData.filter(data => data.id !== id)
console.log('newTodoData', newTodoData)
};
React State
컴포넌트의 렌더링 결과물에 영향을 주는 데이터를 갖고 있는 객체, State가 변경되면 리렌더링이 실시
state = {
todoData : [
{
id: "1",
title: "공부하기",
completed: true,
},
{
id: "2",
title: "청소하기",
completed: false,
},
],
value : "",
};
handleClick = (id) => {
let newTodoData = this.todoData.filter(data => data.id !== id)
this.setState({todoData: newTodoData})
};
state 안에 변경을 원하는 데이터 입력 ⇒ 호출할때는 this.state.변수이름
this.setState({바꿀 state변수: 새 변수})
로 변수 내용을 저장
할 일 목록 추가하기
// 입력이 들어올 떄마다 state 의 값을 변경한다
handleChange = (e) => {
console.log(e.target.value)
this.setState({ value: e.target.value})
}
// 제출하면 원래 있던 데이터 형식에 맞춰서 추가한다
handleSumbit = (e) => {
e.preventDefault()
let newTodo = {
id: Date.now(),
title: this.state.value,
completed: false
};
// 원래 있던 데이터는 구조분해 할당으로 넣어준 뒤 마지막에 추가된 데이터 작성
this.setState({todoData: [...this.state.todoData, newTodo] });
this.setState({value: ""});
};
전개 연산자
특정 객체 또는 배열의 값을 다른 객체, 배열로 복제하거나 옮길 때 사용, ...
으로 사용
삼항 연산자
completed ? "line-through" : "none" => 조건 ? true일때 값 : false 일때 값