리액트의 장점
리액트의 단점
리액트 명령어
# 리액트 파일만들기 npx create-react-app {원하는 파일} # 리액트 실행 npm run start
JSX : 자바스크립트의 확장 문법
Javascript + HTML
리액트를 사용하는 대부분의 사람들이 사용함
Element(Component의 객체)를 쉽게 사용하기 위해 사용
주의해야 하는 문법
function hello() { return ( // 안녕하세요라는 element와 반갑습니다라는 element를 하나의 부모로 묶어줘야한다 <div> <div> 안녕하세요 </div> <div> 반갑습니다 </div> </div> ) }
To-Do 앱 만들기
App.css
.container { margin: auto; max-width: 600px; } .todoBlock { padding: 30px; margin-top: 50px; background: #fff; border-radius: 10px; box-shadow: -9px 17px 13px rgb(0 0 0 /16%); }
App.js
import React, {Component} from "react"; import "./App.css"; export default class App extends Component { state = { todoData : [], value: "", } btnStyle = { color: "#fff", border: "none", padding: "5px 9px", borderRadius: "50%", cursor: "pointer", float: "right", } getStyle = (completed) => { return { padding: "10px", borderBottom: "1px #ccc dotted", // 조건부 삼항 연산자 textDecoration: completed ? "line-through" : "none", } } handleClick = (id) => { let newTodoData = this.state.todoData.filter(data => data.id !== id) console.log('newTodoData', newTodoData) this.setState({todoData: newTodoData}) } handleChange = (e) => { console.log('e', e.target.value) this.setState({ value: e.target.value }) } handleSubmit = (e) => { e.preventDefault(); // 새로운 할 일 데이터 let newTodo = { id: Date.now(), title: this.state.value, completed: false, }; // 원래 있던 할 일에 새로운 할 일 더해주기 // 전개 연산자 사용 this.setState({ todoData: [...this.state.todoData, newTodo], value: "" }) } handleCompleteChange = (id) => { let newTodoData = this.state.todoData.map(data => { if (data.id === id) { data.completed = !data.completed; } return data; }) this.setState({ todoData: newTodoData}); } render() { return( <div className="container"> <div className="todoBlock"> <div className="title"> <h1>할 일 목록</h1> </div> {this.state.todoData.map((data) => ( <div style={this.getStyle(data.completed)} key={data.id}> <input type="checkbox" defaultChecked={false} onChange={() => this.handleCompleteChange(data.id)} /> {data.title} <button style={this.btnStyle} onClick={() => this.handleClick(data.id)}>x</button> </div> ))} <form style={{ display: 'flex'}} onSubmit={this.handleSubmit}> <input type="text" name="value" style={{ flex: '10', padding: '5px'}} placeholder= "해야 할 일을 입력하세요." value={this.state.value} onChange={this.handleChange} /> <input type="submit" value="입력" className="btn" style ={{ flex: '1'}} /> </form> </div> </div> ) } }
Filter 메소드
// filter에서 data.id와 id가 다른경우만 포함되므로 같은경우는 지워진다 handleClick = (id) => { let newTodoData = this.state.todoData.filter(data => data.id !== id) console.log('newTodoData', newTodoData) this.setState({todoData: newTodoData}) }