-
2. 간단한 TO-DO 앱 만들며 리액트 익히기 / 하React 2023. 4. 9. 16:54
05. To-Do 앱 만들기 시작
[05] To-Do (할 일 목록) 앱 - 원래 있던 부분 지우기
App.js , App.css , index.css
→ 안쪽 내용만 삭제 (파일 삭제X)
→ npm run start 로 앱 실행시 아무것도 없어야 정상
- 바탕 색 바꾸기
index. css 에 작성 (index.css 파일은 index.js 파일에서 import)
#index.js 파일에서 import 부분 삭제 시 변경사항 저장X
body { background-color: aliceblue; }
- 함수형 / 클래스형의 차이는 render()
→ 함수형은 render() 필요X, 클래스형은 render() 필요함
export default class App extends Component { render() { return( <div> 안녕하세요. </div> ) } }
- 컨테이너 만들기
App.js 에 작성
export default class App extends Component { render() { return( <div className="container"> <div className="todoBlock"> <div className="title"> <h1>할 일 목록</h1> </div> </div> </div> ) } }
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%); }
→ 결과
[05] 컨테이너 만들기 06. 할 일 목록 UI 만들기(JSX, CSS 작성)
- 하나의 목록 JSX(HTML) 추가하기
App.js 에 작성
export default class App extends Component { btnStyle = { color : "#fff", border : "none", padding : "5px 9px", borderRadius: "50%", cursor : "pointer", float: "right" } getStyle = () => { return { padding : "10px", borderBottom: "1px #ccc dotted", textDecoration: 'none' } } render() { return( <div className="container"> <div className="todoBlock"> <div className="title"> <h1>할 일 목록</h1> </div> <div style={this.getStyle()}> <input type="checkbox" defaultChecked={false}/> 공부하기 <button style={this.btnStyle}>x</button> </div> </div> </div> ) } }
→ 결과
[06] 목록 UI 만들기 07. map() 메소드를 사용한 할 일 목록 나열
map() 메소드는 배열 내의 모든 요소 각각에 대하여 주어진 함수를 호출한 결과를 모아 새로운 배열을 반환한다.
#예시) 배열 1 = { 1, 2, 3, 4 } 함수 = { x * 2 } 라고 할 때, map()은 { 2, 4, 6, 8 } 을 반환한다.
todoData = [ { id: "1", title: "공부하기", complited: true }, { id: "2", title: "청소하기", complited: false } ] render() { return( <div className="container"> <div className="todoBlock"> <div className="title"> <h1>할 일 목록</h1> </div> {this.todoData.map(data => <div style={this.getStyle()} key ={data.id}> <input type="checkbox" defaultChecked={false}/> {data.title} <button style={this.btnStyle}>x</button> </div> )} </div> </div> ) } }
→ 결과
[07] map() 메소드 이용하기 08. JSX Key 속성 이해하기
key = {data.id} 속성을 제거하면 앱에서 에러가 발생하는 것을 확인할 수 있다.
→ 리액트는 가상 돔을 사용한다. 즉, 변경된 부분만 찾아 실제 돔에 적용한다는 것.
→ key는 리액트가 변경, 추가 또는 제거된 항목을 찾는데 도움이 된다.
#요소에 안정적인 ID를 부여하려면 배열 내부의 요소에 키를 제공해야 한다.
key = {index} 는 비추천
→ 리스트가 제거되거나 추가되면 index 가 바뀌면서 key 도 바뀌기 때문.
09. Filter 메소드를 사용해서 할 일 목록 지우기
- 클릭 이벤트 발생 시 함수 호출하기
handleClick = (id) => { let newTodoData = this.todoData.filter(data => data.id != id) console.log('newTodoData', newTodoData) } render() { return( <div className="container"> <div className="todoBlock"> <div className="title"> <h1>할 일 목록</h1> </div> {this.todoData.map(data => <div style={this.getStyle()} key ={data.id}> <input type="checkbox" defaultChecked={false}/> {data.title} <button style={this.btnStyle} onClick={() => this.handleClick(data.id)}>x</button> </div> )} </div> </div> ) } }
→ 결과
[09] filter() 메소드 이용하기 x 버튼을 눌렀을 때, 로그에 newTodoData 찍히는 것 확인.
#예시) 공부하기 x버튼 누르면 청소하기 data가 newTodoData로 들어감.
10. React State 란?
리액트에서 데이터가 변할 때 화면을 다시 렌더링해주기 위해서 React State 사용.
- React State?
컴포넌트의 렌더링 결과물에 영향을 주는 데이터를 갖고 있는 객체.
(State가 변경되면 컴포넌트는 리랜더링된다. State는 컴포넌트 안에서 관리된다.)
- React State 생성하기
state = { todoData: [ { id: "1", title: "공부하기", complited: true }, { id: "2", title: "청소하기", complited: false } ] }
#this.todoData 를 모두 this.state.todoTata 로 변경해주어야한다.
- State를 이용한 할 일 목록 제거하기
handleClick = (id) => { let newTodoData = this.state.todoData.filter(data => data.id != id) this.setState({todoData : newTodoData}) }
#setState() 통해서 todoDate를 newTodoData로 변경
→ 결과
[10] setState() 이용해서 목록 삭제 #정상적으로 삭제되는 모습을 확인할 수 있다.
11. 할 일 목록 추가하기
- 할 일 목록을 입력하는 부분과 입력 버튼
handleChange = (e) => { this.setState({value : e.target.value}) } handleSubmit = (e) => { e.preventDefault(); let newTodo = { id: new Date(), title: this.state.value, complited: false, } this.setState({todoData: [...this.state.todoData, newTodo]}) } . . . <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>
→ 결과
[11] 할 일 목록 추가하기 12. 전개 연산자(Spread Opreator)
특정 객체 또는 열의 값을 다른 객체, 배열로 복사하거나 옮길 때 사용.
- 배열 조합
const arr1 = [1, 2, 3]; const arr2 = [4, 5, 6]; const arr3 = [...arr1, ...arr2]; console.log(arr3); // [1, 2, 3, 4, 5, 6]
- 객체 조합
전개 연산자 사용X 전개 연산자 사용O - 기존 배열을 보존
13. 마무리된 일 표시하기(조건부 삼항 연산자)
- 조건부 삼항 연산자란?
- 마무리된 일 표시하기
handleCompleChange = (id) => { let newTodoData = this.state.todoData.map((data) => { if (data.id === id) { data.complited = !data.complited; } return data; }) this.setState({ todoData : newTodoData }) } . . . {this.state.todoData.map(data => <div style={this.getStyle(data.complited)} key ={data.id}> <input type="checkbox" onChange={() => this.handleCompleChange(data.id)} defaultChecked={false}/> {data.title} <button style={this.btnStyle} onClick={() => this.handleClick(data.id)}> x </button> </div> )}
→ 결과
[13] 마무리된 일 표시하기 'React' 카테고리의 다른 글
5. Netflix 앱 완성하기 (0) 2023.05.10 4. Netflix 앱 만들기 시작 (0) 2023.05.07 3. To-Do 앱 최적화 하기 (0) 2023.05.02 2. 간단한 TO-DO 앱 만들며 리액트 익히기 / 상 (0) 2023.04.05 1. 리액트란 (0) 2023.04.03