부스트코스 강의 웹 프론트엔드 시작하기 (리액트&리덕스)
중 'Ch4 리액트를 활용해보기'를 정리한 내용이다.
CRUD - create, read, update, delete
React로 create 기능도 구현해보도록 한다. < TOC> 컴퍼넌트와 < Content> 컴퍼넌트 사이에 생성, 수정, 삭제 버튼을 만든다. create 버턴을 누르면 앱 컴퍼넌트의 mode가 create로 바뀌고 contents라는 읽기 모드의 컴퍼넌트가 글을 추가할 때 사용하는 모드의 컴퍼넌트로 바뀐다. 그 컴퍼넌트는 폼이 있고, 폼에 정보를 입력해 저장 버튼을 누르면 < APP> 컴퍼넌트의 contents의 목록에 새로운 컴퍼넌트 정보가 id 값, 제목, 본문이 객체로 담겨 contents에 추가된다.
< TOC>와 < Content>사이에 create, update, delete 각각의 mode로 진입하는 버튼을 만들어 준다. 유의해야 할 부분이 있는데 delete는 주의해서 작성해 주어야 한다. 경우에 따라 의도치 않게 내용이 삭제될 수 있으므로 링크 같은 페이지 개념이 아닌 버튼 같은 오퍼레이션 개념의 기능을 사용해야 한다.
Control.js라는 파일을 새로 만들어 < Control> 컴퍼넌트의 코드를 그곳에 작성해준다. < Control>에서 3개 중 하나를 클릭했을 때 어떠한 일이 발생하게 하기 위해 onChangeMode라는 이벤트를 정의해준다.
이벤트가 실행 됐을 때 실행되어야 하는 함수를 event handler라고 한다. 링크를 클릭했을 때 onChangeMode라는 event handler가 실행되게 하기 위해 onClick 속성을 추가한다.
onChangeMode가 호출될 때 어떤 역할을 하는 링크인지 알 수 있도록 첫번째 인자를 mode로 받는다. 함수 안에서는 이 mode 변수로 현재 상태가 전달된다. onChangeMode 함수가 호출될 때마다 앱 컴퍼넌트의 mode state 값을 바꾸기 위해 setState() 함수를 사용한다.
< CreateContent>안에 글을 추가하는 기능을 가진 Form을 만든다. 우선 App.js에서 mode를 create로 바꿔 구현하는 것을 확인하기 좋게 바꿔준다.
CreateContent.js 파일의 form 태그 안에는 아래 코드를 입력해준다. 'placeholder' 속성은 아무런 값이 입력되지 않은 경우 'placeholder'에 부여한 값이 출력되는 것이고, < textarea> 태그는 입력할 텍스트가 여러 줄일 때 사용하는 것이다.
submit 버튼을 클릭했을 때 onSubmit 이벤트가 실행되고 createContent 컴퍼넌트를 쓰고 있는 App 컴퍼넌트의 contetns의 끝에 데이터를 추가하도록 한다.
submit 버튼을 클릭했을 때 createContent의 이벤트로 설치된 함수를 실행시켜야 한다. onSubmit 이벤트를 만들고 그 이벤트가 발생했을 때 실행되는 함수의 입력 값으로 _title, _desc가 전달되면 setState를 통해서 새로운 content 값을 추가한다.
< CreateContent> 컴퍼넌트를 만드는 것처럼 < UpdateContent> 컴퍼넌트를 만들어 업데이트 기능을 구현한다.
UpdateContent.js를 만들어주고, App.js파일에서 불러온다. 현재의 컴퍼넌트 state값 mode가 update로 바뀌면 < UpdateContent>컴퍼넌트를 만들어준다. render()함수가 복잡해지므로 getContent(), getReadContent() 함수를 새로 만들어 render()함수 안의 코드를 분리시켜준다.
업데이트를 클릭하면 id, title, desc 값이 < UpdateContent>컴퍼넌트의 데이터로 잘 주입된다.
컴퍼넌트에 주입된 데이터를 기반으로 컴퍼넌트에 기본적으로 입력되는 값을 세팅한다. 만약 props를 직접 value에 넣을 때 onChange라는 handler를 사용하지 않으면 read-only가되므로 업데이트를 하려면 value값으로 컴퍼넌트 안에서 가변적인 데이터를 state화 시켜줘야 한다. UpdateContent.js에 constructor함수를 생성하고 input 태그를 수정해준다. 이때 input 태그에서 onChange를 이용한다.
업데이트를 할 때 어디를 업데이트 할지 식별자를 만들어준다.
form에서 수정할 때 id와 같이 사용자에게 보일 필요가 없는 데이터는 hidden form에 작성한다. UpdateContent.js에 기록해준다.
수정을 하기 위해 Array.from()을 이용해 contents를 복제해준다. contents 안에 있는 원소를 확인해 id값이 수정하고자 하는 것과 같은 원소를 찾고, 그 객체를 교채해준다.