2022. 1. 15. 20:38ใWEB Dev/ToyProject
๐ท CloneTodo โ - Todomate Clone Project | Team CloneMate
CloneTodo : ๋ง์ ์ฌ๋๋ค์ด ์ฌ๋ํ๋ ํฌ๋๋ฉ์ดํธ๋ฅผ ํด๋ก ํ์ฌ ์น ์๋น์ค๋ฅผ ๋ฐฐํฌํด๋ณด๋ ํ๋ก์ ํธ
์ด์ ๋ชฉํ ์ถ๋ ฅ ํ๋ฉด์ ์ ๋ฆฌ๊ฐ ๋์๊ณ ์ด์ ์์ฑ๋ ๋ชฉํ๋ฅผ ํด๋ฆญํ๋ฉด Input์ ๊ฐ์ด ์ ๋ฌ๋๊ณ ๊ทธ ๊ฐ์ ์์ ํ๋ฉด ํด๋น ๋ชฉํ๊ฐ ์์ ๋ ์ ์๋๋ก ํด์ผํ๋ค.
์ด๋ป๊ฒ ํ๋ฉด Input ํ๊ทธ์ ๊ฐ์ ์ ๋ฌํ ์ ์์๊น ๊ณ ๋ฏผํ๋ค๋ณด๋ ์ด์ ์ PHP๋ก ํ์๊ฐ์ ์ ๋ง๋ค์๋ ํ๋ฉด์ด ๋ ์ฌ๋๋ค.
ํ์๊ฐ์ ํ ํ์์ ๋ณด์์ ์ ๋ค์ด๊ฐ๋ฉด ํ์ ์์ด๋๋ฅผ ์ด์ฉํด ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ ๋ณด๋ฅผ ์ฐพ์ value์ ๋ฟ๋ ค์คฌ์๋ค.
์ด๊ฒ๋ ๊ทธ๊ฒ๊ณผ ๊ฐ์ง ์์๊น..
Input ํ๊ทธ์ title ๊ฐ ๋ฟ๋ฆฌ๊ธฐ
์ฐ์ ํด๋ฆญํ๋ฉด editId๋ฅผ ์ธ์๋ก ๋ฐ๋ Input์ ๋ฟ๋ฆฌ๋ ํจ์๋ฅผ ํ๋ ๋ง๋ค์ด๋ณด์.
์ด๋ฒคํธ ํธ๋ค๋ฌ ํจ์์ editToGoalForm ์ด๋ผ๋ ์ด๋ฆ์ ํจ์๋ฅผ ์ฐ๊ฒฐํ๋ค.
ํด๋น ํจ์๋ state๋ฅผ ์ด์ฉํด์ผ ํ๋๊น App.js ์ ์์ผ๋ฉด ๋๊ฒ ๋ค.
//๋ชฉํ GoalForm์ผ๋ก ๋ณด๋ด๊ธฐ ํจ์
function editToGoalForm(id){
const thisItems = goal.items; // goal State ์๋ณธ ์นดํผ
}
์ธ์๋ก ๋ค์ด์จ id๋ฅผ ์ด์ฉํด ํด๋น state๋ฅผ ์ฐพ์์ผ ํ๋ค.
ํ์ฌ state์ ์๋ณธ์ ์นดํผํ๊ธฐ ์ํด thisItems ๋ณ์์ ํ ๋นํด์ค๋ค. ๋ ๋ฐฐ์ด์ด๊ธฐ ๋๋ฌธ์ ๋ฐฐ์ด์ ์ํํ๋ฉด์ id๊ฐ์ด ์ฃผ์ด์ง ์ธ์์ ๊ฐ์ ๊ฒ์ด ์๋์ง ์ฐพ์๋ณด์.
thisItems๋ฅผ ์ฝ์๋ก ์ฐ์ด๋ณด๋ฉด ์๋์ ๊ฐ๋ค.
๋ฐฐ์ด์ ์ํํ๊ธฐ ์ํด ์ฌ๋ฌ ๋ฐ๋ณต๋ฌธ์ ์ธ ์ ์์ง๋ง ์กฐ๊ฑด์ ์ธ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ deleteGoal ์ฒ๋ผ filter ํจ์๋ฅผ ์จ๋ด์ผ๊ฒ ๋ค.
//๋ชฉํ GoalForm์ผ๋ก ๋ณด๋ด๊ธฐ ํจ์
function editToGoalForm(id){
const thisItems = goal.items; // goal State ์๋ณธ ์นดํผ
const editItems = thisItems.filter(e => e.id === id)
console.log(editItems)
}
์ด๋ ๊ฒ ํด์ ์ฐ์ด๋ณด๋ฉด ์๋์ ๊ฐ์ด ๋์จ๋ค.
๊ทธ๋ผ ์ด์ ์ด ์๋กญ๊ฒ ๋ง๋ editItems๋ผ๋ ๋ฐฐ์ด์ Input์ ์ ๋ฌํด์ค์ผ ํ๋ค.
์์ง๋ ์ ๋ฌ์ ๋ชปํ๋ค.
๋ง๋ editItems๋ฅผ GoalForm์ ์ ๋ฌํด์ฃผ๊ณ ์ถ์๋ฐ...
Goals์๋ค ๋ ์ ๋ฌํ๊ณ GoalForm์ผ๋ก ๋ ๊ฐ์ผํ ๊น?
๊ทธ๋ฅ App.js์ ์๋ Goals ์ปดํฌ๋ํธ ์์ ๋ฃ์ด๋ ๋์ผํ๊ฒ ์๋ํ ๊ฒ ๊ฐ์๋ฐ.. ํจ์๋ฅผ ๋ณด๋ด๊ธฐ๋ ๋ ํธํ๊ณ .
<Route exact path="/goals">
<BasicNavBar/>
<GoalForm addGoal={addGoal} editTmpGoal={editTmpGoal} />
<Goals goal={goal.items} addGoal={addGoal} deleteGoal={deleteGoal}
editToGoalForm={editToGoalForm} />
</Route>
Goals ์ปดํฌ๋ํธ์์ GoalsForm ์ปดํฌ๋ํธ๋ฅผ ๋นผ๊ณ App.js ์ ๋ผ์ฐํฐ ๋ด์ ๋ฐฐ์น๋ฅผ ์ด๋ ๊ฒ ๋ฐ๊พธ์๋ค.
์ฌ์ค ์๋ฐ์คํฌ๋ฆฝํธ๋ก ๋ง๋ค๋ผ๊ณ ํ๋ฉด ๊ธ๋ฐฉ ๋ง๋ค๊ฒ ๋๋ฐ ๋ฆฌ์กํธ๋ก ํ๋๊น ์ปดํฌ๋ํธ์ ์์๋ ๋ง์ถฐ์ผํ๊ณ , props๋ ๋ด๋ ค์ผ ํ๊ณ ... ๊ณ ๋ฏผ์ด ์ด๋ง์ ๋ง์ด ์๋๋ค.
๊ฒฐ๊ตญ์๋ ์ ๋ฆฌ์กํธ๋ฅผ ์ฐ๊ฒ ๋๋์ง ์๊ฒ ๋๋ค๋๋ฐ..
์ง๊ธ ํด์ผํ ์ผ์ ๋ชฉํ ํด๋ฆญํ๋ฉด! textfield์ ๊ฐ์ด ๋ค์ด๊ฐ๊ฒ ํ๋ ๊ฒ์ด๋ค.
๋น์ฐํ DOM์ผ๋ก ์ฒ๋ฆฌํด์ผ ํ๊ธฐ ๋๋ฌธ์ textfield๋ฅผ ์ฟผ๋ฆฌ์ ๋ ํฐ๊ฐ์๊ฑธ๋ก ์ ํํด์ผํ๋? ํ๋๋
๋ ํ ์ด ์๋ค.
ํ ..
๊ทธ๋ฆฌ๊ณ ์์ ์ํ๊ฐ ๋์์ ๋, textfield์ value๊ฐ ์์ฑ๋์ด์ผ ํ๋๋ฐ
๊ทธ๊ฒ๋ณด๋ค๋ ์ปดํฌ๋ํธ๊ฐ ๋ ๊ฐ ์ด๊ณ , ์ ๋ฒ์ ํ ๊ฒ ์ฒ๋ผ readOnly ๊ฐ false์ผ ๋, ์์ ์ฌํญ์ ๋ฐ์ํ ์ ์๋ ์ปดํฌ๋ํธ๊ฐ ๊ธฐ์กด GoalForm ์ปดํฌ๋ํธ ์์ ๋ฎ์ด๋๊ฒ ๋ซ์ง ์์๊น?
์ฐ์ useRef ๋จผ์ ์จ๋ด์ผ๊ฒ ๋ค.
useRef ์ฌ์ฉํ๊ธฐ
useRef ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด์ค์ผ ํ๋ค.
const goalField = useRef;
๊ทธ๋ฆฌ๊ณ ๋ณ๊ฒฝ์ ์ํ๋ ํ๊ทธ์ ์์ฑ์ผ๋ก ref ๊ฐ์ ๋ฃ์ด์ค๋ค.
๐ท CloneTodo โ - Todomate Clone Project | Team CloneMate
CloneTodo : ๋ง์ ์ฌ๋๋ค์ด ์ฌ๋ํ๋ ํฌ๋๋ฉ์ดํธ๋ฅผ ํด๋ก ํ์ฌ ์น ์๋น์ค๋ฅผ ๋ฐฐํฌํด๋ณด๋ ํ๋ก์ ํธ
์ด์ ๋ชฉํ ์ถ๋ ฅ ํ๋ฉด์ ์ ๋ฆฌ๊ฐ ๋์๊ณ ์ด์ ์์ฑ๋ ๋ชฉํ๋ฅผ ํด๋ฆญํ๋ฉด Input์ ๊ฐ์ด ์ ๋ฌ๋๊ณ ๊ทธ ๊ฐ์ ์์ ํ๋ฉด ํด๋น ๋ชฉํ๊ฐ ์์ ๋ ์ ์๋๋ก ํด์ผํ๋ค.
์ด๋ป๊ฒ ํ๋ฉด Input ํ๊ทธ์ ๊ฐ์ ์ ๋ฌํ ์ ์์๊น ๊ณ ๋ฏผํ๋ค๋ณด๋ ์ด์ ์ PHP๋ก ํ์๊ฐ์ ์ ๋ง๋ค์๋ ํ๋ฉด์ด ๋ ์ฌ๋๋ค.
ํ์๊ฐ์ ํ ํ์์ ๋ณด์์ ์ ๋ค์ด๊ฐ๋ฉด ํ์ ์์ด๋๋ฅผ ์ด์ฉํด ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ ๋ณด๋ฅผ ์ฐพ์ value์ ๋ฟ๋ ค์คฌ์๋ค.
์ด๊ฒ๋ ๊ทธ๊ฒ๊ณผ ๊ฐ์ง ์์๊น..
Input ํ๊ทธ์ title ๊ฐ ๋ฟ๋ฆฌ๊ธฐ
์ฐ์ ํด๋ฆญํ๋ฉด editId๋ฅผ ์ธ์๋ก ๋ฐ๋ Input์ ๋ฟ๋ฆฌ๋ ํจ์๋ฅผ ํ๋ ๋ง๋ค์ด๋ณด์.
์ด๋ฒคํธ ํธ๋ค๋ฌ ํจ์์ editToGoalForm ์ด๋ผ๋ ์ด๋ฆ์ ํจ์๋ฅผ ์ฐ๊ฒฐํ๋ค.
ํด๋น ํจ์๋ state๋ฅผ ์ด์ฉํด์ผ ํ๋๊น App.js ์ ์์ผ๋ฉด ๋๊ฒ ๋ค.
//๋ชฉํ GoalForm์ผ๋ก ๋ณด๋ด๊ธฐ ํจ์
function editToGoalForm(id){
const thisItems = goal.items; // goal State ์๋ณธ ์นดํผ
}
์ธ์๋ก ๋ค์ด์จ id๋ฅผ ์ด์ฉํด ํด๋น state๋ฅผ ์ฐพ์์ผ ํ๋ค.
ํ์ฌ state์ ์๋ณธ์ ์นดํผํ๊ธฐ ์ํด thisItems ๋ณ์์ ํ ๋นํด์ค๋ค. ๋ ๋ฐฐ์ด์ด๊ธฐ ๋๋ฌธ์ ๋ฐฐ์ด์ ์ํํ๋ฉด์ id๊ฐ์ด ์ฃผ์ด์ง ์ธ์์ ๊ฐ์ ๊ฒ์ด ์๋์ง ์ฐพ์๋ณด์.
thisItems๋ฅผ ์ฝ์๋ก ์ฐ์ด๋ณด๋ฉด ์๋์ ๊ฐ๋ค.
๋ฐฐ์ด์ ์ํํ๊ธฐ ์ํด ์ฌ๋ฌ ๋ฐ๋ณต๋ฌธ์ ์ธ ์ ์์ง๋ง ์กฐ๊ฑด์ ์ธ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ deleteGoal ์ฒ๋ผ filter ํจ์๋ฅผ ์จ๋ด์ผ๊ฒ ๋ค.
//๋ชฉํ GoalForm์ผ๋ก ๋ณด๋ด๊ธฐ ํจ์
function editToGoalForm(id){
const thisItems = goal.items; // goal State ์๋ณธ ์นดํผ
const editItems = thisItems.filter(e => e.id === id)
console.log(editItems)
}
์ด๋ ๊ฒ ํด์ ์ฐ์ด๋ณด๋ฉด ์๋์ ๊ฐ์ด ๋์จ๋ค.
๊ทธ๋ผ ์ด์ ์ด ์๋กญ๊ฒ ๋ง๋ editItems๋ผ๋ ๋ฐฐ์ด์ Input์ ์ ๋ฌํด์ค์ผ ํ๋ค.
์์ง๋ ์ ๋ฌ์ ๋ชปํ๋ค.
๋ง๋ editItems๋ฅผ GoalForm์ ์ ๋ฌํด์ฃผ๊ณ ์ถ์๋ฐ...
Goals์๋ค ๋ ์ ๋ฌํ๊ณ GoalForm์ผ๋ก ๋ ๊ฐ์ผํ ๊น?
๊ทธ๋ฅ App.js์ ์๋ Goals ์ปดํฌ๋ํธ ์์ ๋ฃ์ด๋ ๋์ผํ๊ฒ ์๋ํ ๊ฒ ๊ฐ์๋ฐ.. ํจ์๋ฅผ ๋ณด๋ด๊ธฐ๋ ๋ ํธํ๊ณ .
<Route exact path="/goals">
<BasicNavBar/>
<GoalForm addGoal={addGoal} editTmpGoal={editTmpGoal} />
<Goals goal={goal.items} addGoal={addGoal} deleteGoal={deleteGoal}
editToGoalForm={editToGoalForm} />
</Route>
Goals ์ปดํฌ๋ํธ์์ GoalsForm ์ปดํฌ๋ํธ๋ฅผ ๋นผ๊ณ App.js ์ ๋ผ์ฐํฐ ๋ด์ ๋ฐฐ์น๋ฅผ ์ด๋ ๊ฒ ๋ฐ๊พธ์๋ค.
์ฌ์ค ์๋ฐ์คํฌ๋ฆฝํธ๋ก ๋ง๋ค๋ผ๊ณ ํ๋ฉด ๊ธ๋ฐฉ ๋ง๋ค๊ฒ ๋๋ฐ ๋ฆฌ์กํธ๋ก ํ๋๊น ์ปดํฌ๋ํธ์ ์์๋ ๋ง์ถฐ์ผํ๊ณ , props๋ ๋ด๋ ค์ผ ํ๊ณ ... ๊ณ ๋ฏผ์ด ์ด๋ง์ ๋ง์ด ์๋๋ค.
๊ฒฐ๊ตญ์๋ ์ ๋ฆฌ์กํธ๋ฅผ ์ฐ๊ฒ ๋๋์ง ์๊ฒ ๋๋ค๋๋ฐ..
์ง๊ธ ํด์ผํ ์ผ์ ๋ชฉํ ํด๋ฆญํ๋ฉด! textfield์ ๊ฐ์ด ๋ค์ด๊ฐ๊ฒ ํ๋ ๊ฒ์ด๋ค.
๋น์ฐํ DOM์ผ๋ก ์ฒ๋ฆฌํด์ผ ํ๊ธฐ ๋๋ฌธ์ textfield๋ฅผ ์ฟผ๋ฆฌ์ ๋ ํฐ๊ฐ์๊ฑธ๋ก ์ ํํด์ผํ๋? ํ๋๋
๋ ํ ์ด ์๋ค.
ํ ..
๊ทธ๋ฆฌ๊ณ ์์ ์ํ๊ฐ ๋์์ ๋, textfield์ value๊ฐ ์์ฑ๋์ด์ผ ํ๋๋ฐ
๊ทธ๊ฒ๋ณด๋ค๋ ์ปดํฌ๋ํธ๊ฐ ๋ ๊ฐ ์ด๊ณ , ์ ๋ฒ์ ํ ๊ฒ ์ฒ๋ผ readOnly ๊ฐ false์ผ ๋, ์์ ์ฌํญ์ ๋ฐ์ํ ์ ์๋ ์ปดํฌ๋ํธ๊ฐ ๊ธฐ์กด GoalForm ์ปดํฌ๋ํธ ์์ ๋ฎ์ด๋๊ฒ ๋ซ์ง ์์๊น?
์ฐ์ useRef ๋จผ์ ์จ๋ด์ผ๊ฒ ๋ค.
useRef ์ฌ์ฉํ๊ธฐ
useRef ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด์ค์ผ ํ๋ค.
App.js ์ ๋ง๋ค์ด๋ณด์.
const goalform_textfield = useRef;
๊ทธ๋ฆฌ๊ณ ๋ณ๊ฒฝ์ ์ํ๋ ํ๊ทธ์ ์์ฑ์ผ๋ก ref ๊ฐ์ ๋ฃ์ด์ค์ผ ํ๋ค. ๊ทธ๋ฌ๊ธฐ ์ํด์๋ ์ปดํฌ๋ํธ์ props๋ก ref๋ก ๋ง๋ ๊ฐ์ฒด๋ฅผ ๋ด๋ ค์ค์ผํ๋ค. ๋๋ TextField์ ๊ฐ(value)๊ฐ ๋ณ๊ฒฝ๋์ผ ํ๋๋ฐ, ํด๋ฆญ ์ด๋ฒคํธ๋ Goals์ ์๊ธฐ ๋๋ฌธ์ GoalForm๊ณผ Goals ๋ชจ๋ ref props๋ฅผ ๋ด๋ ค์ค๋ค. ref ๋ผ๋ ์์ฑ์ ๋์ค์ ์ธ๊ฑฐ๊ธฐ ๋๋ฌธ์ TextField_Ref์ด๋ผ๊ณ ๋ด๋ ค์ค๋ค.
<GoalForm addGoal={addGoal} editTmpGoal={editTmpGoal} TextField_Ref={TextField_Ref} />
<Goals goal={goal.items} addGoal={addGoal} deleteGoal={deleteGoal}
editToGoalForm={editToGoalForm} TextField_Ref={TextField_Ref} />
๊ทธ๋ฆฌ๊ณ GoalForm ์ปดํฌ๋ํธ์ TextField์ props๋ก ๋ฐ์์จ ref๋ฅผ ๋ฃ์ด์ฃผ์.
<TextField fullWidth id="goalform_textfield" variant="standard"
onChange={onInputChange} ref={ TextField_Ref } />
๊ทธ๋ฆฌ๊ณ ์ ์์ ์ผ๋ก ์๋ํ๋์ง ๋ณด๊ธฐ ์ํด์ editToGoalForm ํจ์์ goalField.current.focus()๋ฅผ ์ฌ์ฉํด๋ณด์๋ค.
.focus๋ ๊ทธ ๋ถ๋ถ์ ํฌ์ปค์ค๋ฅผ ์ฃผ๋ ๋ฉ์๋๋ค.
ํ .. ์๋ฌด๋ฐ ๋ฐ์์ด ์์๋ค. Ref ํ ์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด ํ๋ฆฐ๊ฒ ์๋๊น?
Ref๋ฅผ ์ค์ผํ๋ ๊ณณ์ GoalForm์ด๊ณ , ์ค์ ์ด๋ฒคํธ๊ฐ ์์๋๋ ๊ณณ์ Goals ์ด๋ค.
์๋ Goals ์์ GoalForm์ด ์์์ผ๋ ๋๊ฐ๋ฅผ ๋๋ํ ๋ณ๋ ฌ๋ฐฐ์นํ๋๋ฐ..
๊ทธ๋ฆผ์ผ๋ก ํํํ์๋ฉด ์ด๋ ๋ค.
์ด๋ ๊ฒ ํ๋ฉด Goals์ GoalForm์ด Ref๋ฅผ ๊ณต์ ํ ์ ์์ ๊ฑฐ๋ผ๊ณ ์๊ฐํ๋๋ฐ.. ref๋ก ์ง์ ํ ํ๊ทธ๊ฐ GoalForm์ ์๊ธฐ ๋๋ฌธ์ Goals์์ ์ฐ์ง ๋ชปํ๋๊ฒ ์๋๊น? ์๊ฐ์ด ๋ค์๋ค.
๊ทธ๋์ ํ๋ B๋ก ๋ง๋ค์ด ๋ณผ ์์ ..
์ด๊ฒ๋ง ํด๊ฒฐํ๋ฉด ๋ค์ ์ง๋๊ฐ ์ข ์ ๋๊ฐ๊ฑฐ๊ฐ์๋ฐ ๊ฑฐ์ ์ผ์ฃผ์ผ ๋์ ํด๋ฆญ->TextField์ ๊ฐ ์ฌ๋ฆฌ๊ธฐ ๋ฅผ ํค๋ฉ๊ณ ์๋ค ใ ใ
'WEB Dev > ToyProject' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ToyProject-Todomate] ํฌ๋๋ฉ์ดํธ ํด๋ก ํ๋ก์ ํธ 29 (0) | 2022.01.16 |
---|---|
[ToyProject-Todomate] ํฌ๋๋ฉ์ดํธ ํด๋ก ํ๋ก์ ํธ 28 (0) | 2022.01.16 |
[ToyProject-Todomate] ํฌ๋๋ฉ์ดํธ ํด๋ก ํ๋ก์ ํธ 26 (0) | 2022.01.13 |
[ToyProject-Todomate] ํฌ๋๋ฉ์ดํธ ํด๋ก ํ๋ก์ ํธ 25 (0) | 2022.01.13 |
[ToyProject-Todomate] ํฌ๋๋ฉ์ดํธ ํด๋ก ํ๋ก์ ํธ 24 (0) | 2022.01.11 |