2022. 1. 16. 01:51ใWEB Dev/ToyProject
๐ท CloneTodo โ - Todomate Clone Project | Team CloneMate
CloneTodo : ๋ง์ ์ฌ๋๋ค์ด ์ฌ๋ํ๋ ํฌ๋๋ฉ์ดํธ๋ฅผ ํด๋ก ํ์ฌ ์น ์๋น์ค๋ฅผ ๋ฐฐํฌํด๋ณด๋ ํ๋ก์ ํธ
์ด์ ํด๋ณด์์ผ ํ ๊ฒ์ ์ด๋ฐ ๊ฒ์ด๋ค.
์กฐ๊ฑด๋ฌธ์ผ๋ก ์ด๋ค ์ํ๊ฐ add ์ด๋ฉด, <GoalForm /> ์ปดํฌ๋ํธ๊ฐ Goal ์ปดํฌ๋ํธ ์ ์๋ฆฌ์ ์๊ณ ,
์ํ๊ฐ edit์ผ๋ก ๋ฐ๋๋ฉด <GoalEditForm /> ์ด Goal ์ปดํฌ๋ํธ ์์ ์๋ ๊ฒ์ด๋ค.
์ ์ด๋ ๊ฒ ์๊ฐํ๋๋ฉด document.querySelector๋ก ๋ด๋ถ ๋ด์ฉ์ ๋ฐ๊พผ๋ค๊ณ ํด๋, ํ์ธ ๋ฒํผ์ด ์ด๋ฏธ onClick={onButtonClick}์ผ๋ก ์ค์ ๋์ด ์๊ธฐ ๋๋ฌธ์ ์์ ํ ๋ ์ป์ ์์ด๋ ๊ฐ์ ๋ง๊ฒ ๋ฐ๊พธ๊ธฐ ์ด๋ ค์์ ์ด๋ค.
App์ State ๋ง๋ค๊ธฐ
์ฒ์ ๊น๋ค์ ๋ ์ฑ ๋ฐ๋ผ ๋ง๋ค์๋ ๊ฒ์ฒ๋ผ readOnly๋ผ๋ state๋ฅผ ํ๋ ๋ง๋ค์ด์ฃผ๊ณ ๊ธฐ๋ณธ๊ฐ์ read๋ก ๋ง๋ค์ด์ค๋ค.
๊ฐ์ด read์ผ ๋๋ addGoal์ด ์๋ํ๋ GoalForm ์ปดํฌ๋ํธ๊ฐ
๊ฐ์ด edit์ผ ๋๋ editGoal์ด ์๋ํ๋ editGoalForm ์ปดํฌ๋ํธ๊ฐ ๋ํ๋๋๋ก ํด๋ณด์
let [readOnly, readOnlyChange] = useState('read');
๊ทธ๋ฌ๋ ค๋ฉด ๋ชฉํ๋ฅผ ํด๋ฆญํ ๋ ํด๋น state์ ๊ฐ์ด ๋ณ๊ฒฝ๋๋๋ก ํด์ผ ํ๋ค.
๋ชฉํ ์์ ์ด๋ฒคํธํธ๋ค๋ฌ ํจ์์์ state๊ฐ ๋ณ๊ฒฝ๋ ์ ์๋๋ก readOnly์ readOnlyChange ํจ์๋ฅผ props๋ก ๋ด๋ ค์ค๋ค.
<Route exact path="/goals">
<BasicNavBar/>
<GoalForm addGoal={addGoal} editTmpGoal={editTmpGoal} />
<Goals goal={goal.items} addGoal={addGoal} deleteGoal={deleteGoal}
editToGoalForm={editToGoalForm} readOnly={readOnly} readOnlyChange={readOnlyChange} />
</Route>
๊ทธ๋ฆฌ๊ณ ๊ฐ๊ฐ props๋ก ๋ฐ์์ค ๋ค์
let readOnly = props.readOnly;
let readOnlyChange = props.readOnlyChange;
๋ชฉํ ์์ ์ด๋ฒคํธํธ๋ค๋ฌ ํจ์์ readOnly๊ฐ ๋ณ๊ฒฝ๋ ์ ์๋๋ก ํด์ฃผ๊ณ console.log(readOnly)๋ก ์ ๋ฐ๋๋์ง ํ์ธํ๋ค.
//๋ชฉํ ์์ ์ด๋ฒคํธํธ๋ค๋ฌ ํจ์
function editEventHandler(e){
const { id } = e.target;
readOnlyChange(readOnly='edit');
console.log(readOnly)
}
state๊ฐ ์ ๋ณ๊ฒฝ๋์์์ ํ์ธํ ์ ์๋ค.
๊ทธ๋ผ ์ด์ ์กฐ๊ฑด๋ฌธ์ ํตํด readOnly state๊ฐ edit์ด๋ฉด GoalEditForm ์ด๋ผ๋ ์ปดํฌ๋ํธ๊ฐ ๋ฑ์ฅํ๋๋ก ํด์ฃผ์.
GoalEditForm ์ปดํฌ๋ํธ ๋ง๋ค๊ธฐ
์์ง GoalEditForm ์ปดํฌ๋ํธ๊ฐ ์๊ธฐ ๋๋ฌธ์ ํ๋ ๋ง๋ค์ด์ค๋ค.
GoalEditForm.js๋ผ๋ ํ์ผ์ ์์ฑํด์ค๋ค.
๊ทธ๋ฆฌ๊ณ GoalForm ์ปดํฌ๋ํธ๋ฅผ ๊ทธ๋๋ก ๊ฐ์ ธ๋ค ๋ถ์ฌ๋ฃ์ด์ค๋ค.
import { Button, Grid, Box, TextField } from "@mui/material";
import React, { useState } from "react";
export default function GoalEditForm(props){
/* props ์ ์ธ ์์ */
const TextField_Ref = props.TextField_Ref;
const addGoal = props.addGoal;
/* props ์ ์ธ ๋ */
/* Hook ์ ์ธ ์์ */
let [goalTodo, goalTodoChange] = useState({item : { title : '' }}, props.addGoal);
/* Hook ์ ์ธ ๋ */
/* ํจ์ ์ ์ธ ์์ */
function onInputChange(e) {
const thisGoal = goalTodo.item;
thisGoal.title = e.target.value;
goalTodoChange({item : thisGoal})
console.log(thisGoal)
}
function onButtonClick(){
addGoal(goalTodo.item);
goalTodoChange({item : {title: ''}});
}
function enterKeyEventHandler(e){
if(e.key === 'Enter'){
onButtonClick();
}
}
/* ํจ์ ์ ์ธ ๋ */
return(
<Box style={{ margin : 16, padding: 16, position:'relative' }}>
<p>์์ </p>
<Grid container>
<Grid xs={11} md={11} item style={{paddingRight: 12}}>
<p className="goalform_title" style={{fontSize: '12px', color: '#aeaeae'}}>์ ๋ชฉ</p>
<TextField fullWidth id="goalform_textfield" variant="standard" onChange={onInputChange} ref={TextField_Ref} />
</Grid>
<Grid xs={1} md={1} item >
<Button fullWidth color="secondary" onClick={onButtonClick}
value={goalTodo.item.title} onKeyPress={enterKeyEventHandler}
style={{position:'relative', top: '-85px', fontSize: '14px', fontWeight: '600', color: '#111'}} >
ํ์ธ
</Button>
</Grid>
</Grid>
</Box>
)
}
๋ฐ์ค ์์ <p>์์ </p> ์ ์ปดํฌ๋ํธ ๋ชจ์์ด ๊ฐ์ ๋์ผ๋ก ๋ณํ๋ฅผ ํ์ธํ๊ธฐ ์ํด์ ๋ฃ์ด๋ณด์๋ค.
๋ค์ App.js๋ก ์ด๋ํ์.
์กฐ๊ฑด๋ฌธ์ผ๋ก ์ปดํฌ๋ํธ ๋ ธ์ถํ๊ธฐ
์์ ์ php ๋ฐฐ์ ์ ๋๋ HTML ํ๊ทธ ์ฌ์ด์ ์คํฌ๋ฆฝํธ๋ฅผ ๋ฃ์ด์ ์ฌ์ฉํ ์ ์๋๊ฒ ์์ฒญ ์ข์๋ณด์๋๋ฐ
๋ฆฌ์กํธ๋ ๋ ธ๋๋ HTML ๋ด๋ถ์์ ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ ์ ์์๋ค.
php๋ง์ ์ฅ์ ์ธ ์ค ์์๋๋ฐ...
๋ด๊ฐ ์กฐ๊ฑด๋ฌธ์ ์จ์ผ ํ๋ ๊ณณ์ Route /goals๋ก ๊ตฌ๋ถ๋ ๊ณณ์ด๋ค.
BasicNavBar ๊น์ง๋ ๊ฑด๋๋ฆฌ์ง ์์๋ ๋๊ณ ์ค์ง GoalForm ๋ถ๋ถ๋ง ๋ฐ๋๋ฉด ๋๋ค.
๋ฆฌ์กํธ์์๋ ๋ณ์ ์ฐ๋ ๊ฒ์ฒ๋ผ ์คํฌ๋ฆฝํธ๋ฅผ ์ค๊ฐ์ ๋ฃ์ผ๋ ค๊ณ ํ ๋๋ ์ค๊ดํธ { } ๋ฅผ ์ด์ฉํ๋ค.
๊ทธ๋ฆฌ๊ณ if else ๋ฌธ์ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ๋ณ๋๋ก function์ ์ฌ์ฉํด์ผ ํ๊ธฐ ๋๋ฌธ์
์ผํญ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๋ฉด ๋ณต์กํ์ง ์๊ฒ ํํํ ์ ์๋ค.
<Route exact path="/goals">
<BasicNavBar/>
{
readOnly === 'read' ? <GoalForm addGoal={addGoal} /> : <GoalEditForm editGoal={editGoal} />
}
<Goals goal={goal.items} addGoal={addGoal} deleteGoal={deleteGoal} editToGoalForm={editToGoalForm} readOnly={readOnly} readOnlyChange={readOnlyChange} />
</Route>
readOnly๊ฐ read ์ํ, ์ฆ ๊ธฐ๋ณธ ์ํ์ด๋ฉด GoalForm์ผ๋ก addGoal์ด ์๋ํ ์ ์๋๋ก ํด์ฃผ๊ณ ,
readOnly๊ฐ read ๊ฐ ์๋๋ฉด GoalEditForm์ผ๋ก ์ฐ๊ฒฐํด์ค๋ค.
๊ทธ๋ฆฌ๊ณ ํด๋ฆญํด๋ณด๋ฉด
๋๋ฒ์งธ๋ฅผ ํด๋ฆญํ์ ๋, readOnly๊ฐ edit์ผ๋ก ๋ฐ๋๊ณ '์์ '์ด๋ผ๊ณ ์ ํ GoalEditForm ์ปดํฌ๋ํธ๊ฐ ๋ํ๋๋ ๊ฒ์ด ๋ณด์ธ๋ค.
๊ทธ๋ผ ์ด์ GoalEditForm์ผ ๋ ์ ๋ชฉ ๋ถ๋ถ์ ๊ฐ์ด ๋ ธ์ถ๋๋๋ก ํด๋ณด์.
์ ๋ชฉ์ title ๋ ธ์ถ๋๋๋ก ํ๊ธฐ
document.querySelector ๋ฅผ ์ฌ์ฉํ ๊ฑด๋ฐ GoalEditForm์ผ๋ก ์ฌ๋ ๋๋ง ๋๋ฉด์ ์๊ฐ์ ์ผ๋ก DOM์ ์ฐพ์ง ๋ชปํ๋ ๊ฒฝ์ฐ๊ฐ ์๋ค.
TextFieldControl์ด๋ผ๋ ํจ์๋ฅผ ํ๋ ๋ง๋ค๊ณ editToGoalForm์ ์ฝ๋ฐฑํจ์๋ก ๋ฃ์ด์ค๋ค.
//๋ชฉํ GoalForm์ผ๋ก ๋ณด๋ด๊ธฐ ํจ์
function editToGoalForm(id){
const thisItems = goal.items; // goal State ์๋ณธ ์นดํผ
const currentEditItems = thisItems.filter(e => e.id === id)
TextFieldControl(currentEditItems);
}
//TextField value ๋ณ๊ฒฝ ํจ์
function TextFieldControl(currentEditItems) {
const TextField = document.querySelector("#goaleditform_textfield");
TextField.value = currentEditItems[0].title;
}
๊ทธ๋ฐ๋ฐ ์ด๋๋ก ํด๋ฆญํด๋ ์ฌ์ ํ value๊ฐ์ ๋ชป ์ก๋๋ค๋ ์๋ฌ๊ฐ ๋ด๋๋ฐ, readOnly๊ฐ edit์ผ๋ก ๋ณ๊ฒฝ๋๋ฉด์ ์ฌ๋ ๋๋ง ๋๋ ์ฌ์ด์ ๋ค์ ํจ์๋ค์ด ์ฃผ๋ฅด๋ฅต ์คํ๋์ด ๋ฒ๋ ค์ DOM ๊ฐ์ ๋ชป ์ก๋ ๊ฒ์ด์๋ค.
๊ทธ๋์ ๋ค์ Goals ์ปดํฌ๋ํธ๋ก ๊ฐ์ editEventHandler๋ฅผ ๋ง์ ธ์ฃผ๊ธฐ๋ก ํ๋ค.
async await๋ฅผ ์ฌ์ฉํด์ readOnlyChange๊ฐ ์คํ๋๊ณ , ๋ค์์ editToGoalForm์ผ๋ก id ๊ฐ์ ๋๊ฒจ์ฃผ๋ ์์ผ๋ก ์์ฐจ์ ์ผ๋ก ์คํ๋๋๋ก ํ๋ค.
//๋ชฉํ ์์ ์ด๋ฒคํธํธ๋ค๋ฌ ํจ์
async function editEventHandler(e){
const { id } = e.target;
await readOnlyChange(readOnly='edit');
console.log(readOnly)
await editToGoalForm(id)
}
๊ทธ๋ฌ๋๋
์ง
์ด์ ๋ค์ ํ ์ผ์ ์ ๋ ๊ฒ title์ด ๋ณ๊ฒฝ๋๋ฉด add์ฒ๋ผ onChange์ ๋ณ๊ฒฝ๊ฐ์ title ์ ๋ด๊ณ
id๊ฐ์ ๊ทธ๋๋ก ๊ฐ์ง๊ณ ์์ ๊ธฐ์กด goal state์ ๊ฐ์ id ๊ฐ์ ์ฐพ์์ title์ ๋ณ๊ฒฝํ๊ฒ ํด์ฃผ์ด์ผ ํ๋ค!
์ ์ ๊ธธ์ด ๋ณด์ธ๋ค..!
ํ์ดํ !
'WEB Dev > ToyProject' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ToyProject-Todomate] ํฌ๋๋ฉ์ดํธ ํด๋ก ํ๋ก์ ํธ 30 (0) | 2022.01.16 |
---|---|
[ToyProject-Todomate] ํฌ๋๋ฉ์ดํธ ํด๋ก ํ๋ก์ ํธ 29 (0) | 2022.01.16 |
[ToyProject-Todomate] ํฌ๋๋ฉ์ดํธ ํด๋ก ํ๋ก์ ํธ 27 (0) | 2022.01.15 |
[ToyProject-Todomate] ํฌ๋๋ฉ์ดํธ ํด๋ก ํ๋ก์ ํธ 26 (0) | 2022.01.13 |
[ToyProject-Todomate] ํฌ๋๋ฉ์ดํธ ํด๋ก ํ๋ก์ ํธ 25 (0) | 2022.01.13 |