TAB 2022 2학기 학회활동 [팀 스터디]
TIL 포스팅입니다.
작성자 : 40기_강한림
작성 참고 및 강의 : 생활코딩 - WEB - React
지난 강의에서 이어지는 내용입니다.
9. 수정기능 (Update)
Update = creat + read
Creat아래에 Update 할 수 있는 링크를 추가한다. (ul - li 태그를 사용한다.)
------------------------ 수업에 들어가기 앞서 여러 자잘한 기능들을 추가합니다 -----------------------
Update가 상세보기 페이지로 들어갔을때만 보이게 하자.
let contextControl = null;
mode가 read 일때 나타나야하므로
if (mode === 'READ') {
// 기존의 코드들//
content = <Article title={title} body={body}></Article>
contextControl = <li><a href = "/update" + id> Update </a></li>} // id값을 추가했다.
이후 Creat 태그 아래에 아래의 {contextControl}을 입력한다.
{contextControl}
Update의 기본적인 내용들을 추가한다.
contextControl = <li><a href = "/update" + id onClick = {event =>{
event.preventDefault();
setMode('UPDATE');
}> Update </a></li>}
본격적인 Update 기능을 만듭니다.
else if(mode === 'UPDATE'){
content = <Update></Update> // Update 컴포넌트가 실행되도록 한다.
}
function Update(props){ //Creat와 거의 동일하다.
return <article>
<h2>Create</h2>
<form onSubmit={event=>{
event.preventDefault();
const title = event.target.title.value;
const body = event.target.body.value;
props.onUpdate(title, body);
}}>
<p><input type="text" name="title" placeholder="title"/></p>
<p><textarea name="body" placeholder="body"></textarea></p>
<p><input type="submit" value="Create"></input></p>
</form>
</article>
}
// 미완성 상태입니다. 수업이 진행되면서 수정/완성됩니다.
onUpdate속성을 추가합니다.
else if(mode === 'UPDATE'){
content = <Update onUpdate={(title, body)=> {
}}></Update>
}
function Update를 수정합니다.
function Update(props){ //Creat와 거의 동일하다.
return <article>
<h2>Update</h2>
<form onSubmit={event=>{
event.preventDefault();
const title = event.target.title.value;
const body = event.target.body.value;
props.onUpdate(title, body);
}}>
<p><input type="text" name="title" placeholder="title"/></p>
<p><textarea name="body" placeholder="body"></textarea></p>
<p><input type="submit" value="Update"></input></p>
</form>
</article>
}
Update는 수정기능이기 때문에, form에는 기존의 내용(수정되어야 할 내용)이 담겨있어야 합니다.
- > Update 컴포넌트가 기존의 내용을 가져와야 합니다.
- > Update 컴포넌트가 title과 body의 값을 기본적으로 가지고 있어야 합니다.
else if(mode === 'UPDATE'){
let title, body = null;
for (let i = 0; i<topics.length; i++){
if(topics[i].id === id){
title = topics[i].title;
body = topics[i].body;
}
}
content = <Update title ={title} body = {body} onUpdate={(title, body)=> {
}}></Update>
}
founction Update에서, props를 통해서 들어온 값을 title에 value값으로 줍니다.
body또한 동일하게 해줍니다.
function Update(props){
return <article>
<h2>Update</h2>
<form onSubmit={event=>{
event.preventDefault();
const title = event.target.title.value;
const body = event.target.body.value;
props.onUpdate(title, body);
}}>
<p><input type="text" name="title" placeholder="title" value = {props.title}/></p>
<p><textarea name="body" placeholder="body" value = {props.body}></textarea></p>
<p><input type="submit" value="Update"></input></p>
</form>
</article>
}
react에서 props값은 외부자(사용자)가 내부자에게 전달하는 값.
state는 내부자가 사용하는 값(데이터) 임을 다시 상기시킵니다.
props를 state로 바꿉니다.
function Update(props){
const [title, setTitle] = useState(props.title);
const [body, setBody] = useState(props.body);
return <article>
<h2>Update</h2>
<form onSubmit={event=>{
event.preventDefault();
const title = event.target.title.value;
const body = event.target.body.value;
props.onUpdate(title, body);
}}>
<p><input type="text" name="title" placeholder="title" value = {title}/></p>
<p><textarea name="body" placeholder="body" value = {body}></textarea></p>
<p><input type="submit" value="Update"></input></p>
</form>
</article>
}
입력을 시도할때, 입력을 받을 수 있도록 / 입력하면 값이 변하도록 합니다.
function Update(props){
const [title, setTitle] = useState(props.title);
const [body, setBody] = useState(props.body);
return <article>
<h2>Update</h2>
<form onSubmit={event=>{
event.preventDefault();
const title = event.target.title.value;
const body = event.target.body.value;
props.onUpdate(title, body);
}}>
<p><input type="text" name="title" placeholder="title" value = {title} onChange={event=>{
console.log(event.target.value);
}
/></p>
<p><textarea name="body" placeholder="body" value = {body}></textarea></p>
<p><input type="submit" value="Update"></input></p>
</form>
</article>
}
react에서는 값을 입력할 때마다 onChange={}가 호출됩니다.
(html에서는 커서가 밖으로 빠져나갔을때, 호출되었습니다.)
console.log(event.target.value)
- 호출하게한 태그를 찾습니다 : .target
방금 입력되어 바뀐 값을 새로운 state로 바꾸어 줍니다.
function Update(props){
const [title, setTitle] = useState(props.title);
const [body, setBody] = useState(props.body);
return <article>
<h2>Update</h2>
<form onSubmit={event=>{
event.preventDefault();
const title = event.target.title.value;
const body = event.target.body.value;
props.onUpdate(title, body);
}}>
<p><input type="text" name="title" placeholder="title" value = {title} onChange={event=>{
console.log(event.target.value);
setTitel.log(event.target.value);
}
/></p>
<p><textarea name="body" placeholder="body" value = {body}></textarea></p>
<p><input type="submit" value="Update"></input></p>
</form>
</article>
}
setTitle.log(event.target.value);
- 가장 최근에 변경된 값을 새로운 title값으로 바꿉니다.
중간 정리
: props로 들어온 'title'값을 state로 바꾸어줍니다.
- > 그 state를 value=(title)을 통해 value값으로 줍니다.
- > state는 컴포넌트 안에서 변경할 수 있습니다.
- > onChange에서 새로운 value로 키워드를 입력할 때마다, setTitle 값을 정해줍니다.
- > 그때마다 'title'의 값이 바뀌고, 컴포넌트가 다시 실행됩니다.
- > 컴포넌트가 다시 실행되면, value의 title값을 바뀌게 되고, 이것이 반복됩니다.
body 또한 동일하게 수정합니다.
function Update(props){
const [title, setTitle] = useState(props.title);
const [body, setBody] = useState(props.body);
return <article>
<h2>Update</h2>
<form onSubmit={event=>{
event.preventDefault();
const title = event.target.title.value;
const body = event.target.body.value;
props.onUpdate(title, body);
}}>
<p><input type="text" name="title" placeholder="title" value = {title} onChange={event=>{
setTitel.log(event.target.value);
}
/></p>
<p><textarea name="body" placeholder="body" value = {body} onChange={event =>{
setBody(event.target.value);
}></textarea></p>
<p><input type="submit" value="Update"></input></p>
</form>
</article>
}
이후 Update 버튼을 클릭하면, onSubmit가 호출되면서, title과 body의 값을 onUpdate로 전달합니다.
onUpdate에 수정된 값이 들어오도록 해줍니다.
else if(mode === 'UPDATE'){
let title, body = null;
for (let i = 0; i<topics.length; i++){
if(topics[i].id === id){
title = topics[i].title;
body = topics[i].body;
}
}
content = <Update title ={title} body = {body} onUpdate={(title, body)=> {
console.log(title, body);
}}></Update>
}
이 수정된 값들이 topics(본문)에 전달되도록 합니다.
topics는 객체/배열임을 주의합니다.
else if(mode === 'UPDATE'){
let title, body = null;
for (let i = 0; i<topics.length; i++){
if(topics[i].id === id){
title = topics[i].title;
body = topics[i].body;
}
}
content = <Update title ={title} body = {body} onUpdate={(title, body)=> {
console.log(title, body);
const newTopics = [...topics]
const updatedTopic = {id:id, title:title, body:body}
}}></Update>
}
topics에서 id가 같은것을 찾는과정도 추가합니다.
else if(mode === 'UPDATE'){
let title, body = null;
for (let i = 0; i<topics.length; i++){
if(topics[i].id === id){
title = topics[i].title;
body = topics[i].body;
}
}
content = <Update title ={title} body = {body} onUpdate={(title, body)=> {
console.log(title, body);
const newTopics = [...topics]
const updatedTopic = {id:id, title:title, body:body}
for(let i = 0; i<newTopics.length; i++){
if(newTopics[i].id === id){
newTopics[i] = updateTopic;
break;
}
setTopics(newTopics);
}}></Update>
}
상세보기 페이지로 이동하게 합니다.
else if(mode === 'UPDATE'){
let title, body = null;
for (let i = 0; i<topics.length; i++){
if(topics[i].id === id){
title = topics[i].title;
body = topics[i].body;
}
}
content = <Update title ={title} body = {body} onUpdate={(title, body)=> {
console.log(title, body);
const newTopics = [...topics]
const updatedTopic = {id:id, title:title, body:body}
for(let i = 0; i<newTopics.length; i++){
if(newTopics[i].id === id){
newTopics[i] = updateTopic;
break;
}
setTopics(newTopics);
setMode('READ');
}}></Update>
}
10. Delete
Update 버튼 아래에 Delete 버튼을 만들도록 합니다.
Delete는 삭제를 위한 것이기에, 페이지로 이동할 필요가 없어 button으로 만듭니다
<> 빈 태그를 만들어 Update와 나누어준뒤 생성하도록 합니다.
<li><input type="button" value = "Delete" onClick={()=> {
}} /><li>
삭제해야할 데이터는 'topics'입니다.
<li><input type="button" value = "Delete" onClick={()=> {
const newTopics = []
for(let i=0; i<topics.length;i++){
if(topics[i].id !== id{
newTopics.push(topics[i]);
}
}
setTopics(newTopics);
}} /><li>
마무리 합니다.
<li><input type="button" value = "Delete" onClick={()=> {
const newTopics = []
for(let i=0; i<topics.length;i++){
if(topics[i].id !== id{
newTopics.push(topics[i]);
}
}
setTopics(newTopics);
setMode('WELCOME');
}} /><li>'22 - 1학기 > 팀 스터디' 카테고리의 다른 글
| [React] Vanila JS vs React Js | JSX (1) | 2022.09.29 |
|---|---|
| [웹 FE 스터디] React : 수정 ~ 삭제 기능 (0) | 2022.09.29 |
| [웹 FE 스터디] 리액트 시작하기(2) - JSX, elements, props (0) | 2022.09.22 |
| [웹 FE 스터디] JSX, Rendering Elements, Components, Props (0) | 2022.09.22 |
| [웹 FE 스터디] React : 이벤트 ~ 생성 기능 (0) | 2022.09.22 |