π μλ‘
μ€λμ 리μ‘νΈμμ λμ λΌμ°ν μ μ¬μ©νμ¬ νμ΄μ§ λͺ¨λλ₯Ό μ΄λ»κ² νμ©νλμ§ μμ±ν©λλ€. κ²μν νλ©΄μ λ§λ€μ΄ 보면μ λ±λ‘, μμ , μμΈμ νλ©΄μ λ¨ νλμ νμ΄μ§μμ κ΄λ¦¬νλ κ²μ΄ λͺ©νμμ΅λλ€. μ΄λ₯Ό 리μ‘νΈλ‘ κ°λ°νλ©΄μ νμ΄μ§ κ°μ μ΄λ λ° λ°μ΄ν°μ νμ©μ μ΄λ»κ² ν΄μΌ ν¨κ³Όμ μΌλ‘ ꡬνν μ μμκΉ? κ³ λ―Όνλ€κ° λμ λΌμ°ν νμ©μ μκ² λμμ΅λλ€.
π νμ΄μ§ λͺ¨λμ μ μ
λ¨Όμ , AppTypes νμΌμμ νμ΄μ§μ λͺ¨λλ₯Ό κ΄λ¦¬ν©λλ€.
const AppTypes = {
PageMode: {
view: 'view',
add: 'add',
edit: 'edit',
},
...
}
νμ΄μ§μ λͺ¨λλ view, add, edit μΈ κ°μ§λ‘ ꡬλΆλ©λλ€. μ μ½λμ²λΌ App μμ νμ©λλ κ° λͺ¨λ νμ μ λ³λμ νμΌλ‘ λΆλ¦¬νμ¬ κ΄λ¦¬νλ©΄ νλ‘μ νΈμ κ΅¬μ‘°κ° λμ± λͺ νν΄μ§κ³ μ μ§ λ³΄μκ° μ¬μμ§λλ€.
π 리μ‘νΈ λΌμ°ν°μ νμ©
리μ‘νΈμμ νμ΄μ§κ°μ μ΄λμ κ΄λ¦¬νλ κ°μ₯ ν¨κ³Όμ μΈ λ°©λ² μ€ νλλ 리μ‘νΈ λΌμ°ν°λ₯Ό νμ©νλ κ²μ λλ€. νΉν λμ λΌμ°ν μ λμΌν UI ꡬ쑰λ₯Ό κ°μ§λ©΄μ λ€μν λ°μ΄ν°λ₯Ό 보μ¬μ£Όλ νμ΄μ§λ₯Ό ꡬνν λ λ§€μ° μ μ©ν©λλ€. νμ΄μ§ λͺ¨λλ₯Ό νμ©ν΄ λΌμ°ν°μμλ λ€μκ³Ό κ°μ΄ κ²½λ‘μ μ»΄ν¬λνΈλ₯Ό μ°κ²°ν΄ μ£Όμλλ°μ..
import { Navigate, Route, Routes } from 'react-router-dom'
const App = () => {
return (
<Routes>
<Route path="/board/list" element={<LayoutWithComponent layout={EmptyLayout} component={Board} />} />
<Route path="/board/view/:id" element={<LayoutWithComponent layout={EmptyLayout} component={BoardView} />} />
<Route path="/board/:mode" element={<LayoutWithComponent layout={EmptyLayout} component={BoardView} />} />
...
</Routes>
)
}
/board/:mode κ²½λ‘μ κ°μ΄ λμ λΌμ°νΈ λ°©μμΌλ‘ κ²μνμ λ€μν λͺ¨λλ₯Ό ν¨μ¨μ μΌλ‘ μ¬μ©νκ³ μμ΅λλ€.
μ΄λ κ² μ¬μ¬μ©μ±μ λμ΄λ©΄ κ°λ° κ³Όμ μμμ 볡μ‘λλ₯Ό μ€μΌμ μμ΅λλ€.
λμ λΌμ°ν μΌλ‘ νμ΄μ§λ₯Ό λκΈ°λ μ΄λ²€νΈ νΈλ€λ¬ μ½λ μμμ λλ€.
const handleAddClick = useCallback(() => {
navigateTo(`/board/${AppTypes.PageMode.add}`)
}, [navigateTo])
const handleRowClick = useCallback((id) => {
navigateTo(`/board/view/${id}`)
}, [navigateTo])
λ€μν μν©μ λ°λΌ μ μ°νκ² URLμ ꡬμ±νμ¬ ν΄λΉ URL μ λ§λ νμ΄μ§λ‘ λΌμ°ν ν μ μμ΅λλ€.
π νμ΄μ§ λͺ¨λ κ΄λ¦¬
View μμλ κ²μκΈμ μμΈ λ΄μ©μ 보μ¬μ£Όλ©°, κ°κ°μ λͺ¨λμ λ°λΌ μ μ ν μ‘μ λ²νΌλ€μ μ 곡ν©λλ€. useParamsλ₯Ό μ¬μ©νμ¬ λΌμ°νΈμμ νμν λ§€κ°λ³μλ₯Ό κ°μ Έμ μνλ₯Ό μ§μ νμμ΅λλ€.
const BorderView = () => {
const { mode, id } = useParams() // mode: AppTypes.PageMode
const [currentMode, setCurrentMode] = useState(mode || AppTypes.PageMode.view)
...
}
μ΄λ κ² ν κ²½μ° μ‘°κ±΄λΆ λ λλ§μ νμ©νμ¬ νμ¬ λͺ¨λμ λ°λΌ λ€λ₯Έ UI μμλ₯Ό 보μ¬μ€ μ μμ΅λλ€.
{currentMode === AppTypes.PageMode.view && (
<>
<button type="button" className="list-btn" onClick={handleListClick}>λͺ©λ‘μΌλ‘</button>
<button type="button" className="edit-btn" onClick={handleEditClick}>νΈμ§</button>
</>
)}
{currentMode !== AppTypes.PageMode.view && (
...
)}
μ΄ μΈμλ κ° λͺ¨λμ λ°λΌ λ€λ₯Έ μ΄λ²€νΈ νΈλ€λ¬λ₯Ό μ€μ νκ±°λ λ°μ΄ν°λ₯Ό μμ²νλ λ±μ λμμ λΆκΈ°μ²λ¦¬ν μ μμ΅λλ€.
const onSubmit = useCallback(async (data) => {
const payload = {
...data
}
try {
if (currentMode === AppTypes.PageMode.add) {
await BoardService.create(payload)
navigateTo('/board')
}
if (currentMode === AppTypes.PageMode.edit) {
await BoardService.update(id, payload)
navigateBack()
}
} catch (err) {
handleError(err.response)
}
}, [currentMode, id, navigateTo, navigateBack, handleError])
π νμ΄μ§ λͺ¨λ λ³κ²½νκΈ°
useState μ μ μΈν setCurrentMode ν¨μλ₯Ό ν΅ν΄ νμ΄μ§μ λμ λͺ¨λλ₯Ό λ³κ²½νμ¬ μ΄λ₯Ό ν΅ν΄ μ¬μ©μμ μ‘μ (μ: νΈμ§ λ²νΌ ν΄λ¦)μ λ°λΌ λμ λͺ¨λλ₯Ό λ³κ²½νκ³ , κ·Έμ λ°λ₯Έ UIλ₯Ό κ°±μ ν μ μμ΅λλ€.
const handleEditClick = useCallback((e) => {
e.preventDefault()
setCurrentMode(AppTypes.PageMode.edit)
}, [])
π¬ κ²°λ‘
리μνΈ λΌμ°ν°μ λμ λΌμ°ν μ νμ©νλ©΄, μ¬μ©μμ μμ²μ λ°λΌ νμ΄μ§μ λ΄μ©κ³Ό μνλ₯Ό μ μ°νκ² λ³κ²½ν μ μμ΅λλ€. νμ΄μ§ λͺ¨λμ κ΄λ¦¬μ λΌμ°ν μ μ΅μ ννλ λ°©λ²μ μ΄ν΄λ΄€λλ°, 리μνΈ νλ‘μ νΈμμ μ΄ κΈ°λ²μ μ μ©νλ©΄ μ¬μ©μ κ²½νμ λ¬Όλ‘ , κ°λ°μμ μμ ν¨μ¨λ μλΉν μ¦μ§λ κ²μ΄λΌ μκ°ν©λλ€. π
'π» νλ‘κ·Έλλ° > π React' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
React Hook Form μμ useRef μ¬μ©νκΈ° (0) | 2023.09.17 |
---|---|
React Router μμ Navigate ν¨μλ₯Ό νμ₯νμ¬ μ¬μ©νκΈ° (0) | 2023.08.17 |
리μ‘νΈ μ¬μ©μ μ΄ν΄ (0) | 2022.11.18 |
React νλ‘μ νΈμ sass μ°κ²°μ Node Sass version 6.0.1 is incompatible with ^4.0.0 || ^5.0.0. μλ¬ ν΄κ²° (0) | 2021.07.18 |
React Router, a νκ·Έ (0) | 2021.07.17 |