๐ฑ๐ค ์๋ฌธ : https://betterprogramming.pub/react-use-redux-to-control-modal-visibility-states-8953e44b71fd
๋ถ์ : ๋ชจ๋ฌ ์ด๊ธฐ ๋ฐ ๋ซ๊ธฐ ์ํ๋ฅผ ์ฝ๊ฒ ๊ด๋ฆฌํ๋ ๋ฒ
๋ชจ๋ฌ์ ์์ฉ ํ๋ก๊ทธ๋จ์ ๊ธฐ๋ณธ ์ฐฝ ์์ ์์นํ๋ฉฐ ํ์ฌ ์ํธ ์์ฉ ํ๋ฆ์ ๋ฐฉํดํ์ง ์์ผ๋ฉด์ ์ฌ์ฉ์๊ฐ ์์ฌ ๊ฒฐ์ ์ ๋ด๋ฆฌ๋ ๋ฐ ๋์์ด ๋๋ UI ์์์ด๋ค. ๋ํ ์ฌ์ฉ์์ ์์ ์ ๋ํ ํผ๋๋ฐฑ์ ์ ๊ณตํ๊ธฐ๋ ํ๊ณ ์ฑ์ ํ์ฌ ๊ฒฝ๋ก๋ ํ์ด์ง๋ฅผ ๋ณ๊ฒฝํ์ง ์์ ์ฑ ์ผ๋ถ ์ฝํ ์ธ ๋ฅผ ์ ๊ณตํ๋ ์ญํ ์ ํ๋ค.
๋ฆฌ์กํธ์์ ๋ฆฌ๋์ค๋ฅผ ์ฌ์ฉํ์ฌ ๋ชจ๋ฌ์ ํ์ ์ฌ๋ถ๋ฅผ ์ ์ดํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์์๋ณด์. ๋จผ์ ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ฅผ ์ดํด๋ณธ ๋ค์ ์๊ฐ๋ ๋ง์ด ์ ์ฝ๋๊ณ ์ปดํฌ๋ํธ์ ์ฝ๋ ๊ธธ์ด๋ฅผ ํฌ๊ฒ ์ค์ผ ์ ์๋ ๋ฆฌ๋์ค ์ฌ์ฉ๋ฒ์ ์์๋ณด์.
๐ฏ ์ ํ๋ฆฌ์ผ์ด์
์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฌ์ฉ์๊ฐ Yes ๋๋ No๋ฅผ ํด๋ฆญํ ์ ์๋ ๋ชจ๋ฌ์ ์ฌ๋ ๊ฐ๋จํ ๋ฒํผ์ด๋ค.
// main-component-v1.js
const MainComponent = () => {
const [ isOpen, setIsOpen ] = useState(false)
const [ modalStatus, setModalStatus ] = useState('')
const closeModal = () => setIsOpen(false)
const showModal = () => setIsOpen(true)
const onYesPressed = () => {
setModalStatus("User pressed yes")
closeModal()
}
const onNoPressed = () => {
setModalStatus("User pressed no")
closeModal()
}
return (
<>
<div style={buttonContainerStyle}>
<button style={openModalButtonStyle} onClick={showModal}>Open</button>
{ modalStatus ?? <span>{ modalStatus }</span> }
</div>
<YesNoModal
isOpen={isOpen}
onRequestClose={closeModal}
onYesPressed={onYesPressed}
onNoPressed={onNoPressed}
/>
</>
);
};
์ด ๋ฐฉ์์ ๊ฒฝ์ฐ MainComponent์ ์ง์ ์ ์๋ isOpen ์์ฑ์ ์ฌ์ฉํด ๋ชจ๋ฌ ํ์ ์ฌ๋ถ๋ฅผ ์ ์ดํ๊ณ ์๋ค. IsOpen ์์ฑ์ด true์ด๋ฉด ๋ชจ๋ฌ์ด ํ์๋๊ณ ๊ทธ๋ ์ง ์์ผ๋ฉด ์จ๊ฒจ์ง๋ค.
ํ๋์ ์ปดํฌ๋ํธ์์๋ง ์ด ๋ชจ๋ฌ์ ์ฌ์ฉํ๋ฉด ์ด ๋ฐฉ์์๋ ์ ํ ๋ฌธ์ ๊ฐ ์๋ค. ํ์ง๋ง, ์ด ๋ชจ๋ฌ์ ๋ค๋ฅธ ์ปดํฌ๋ํธ์์ ์ฌ์ฉํ๋ ค๊ณ ํ๋ฉด ์ด ๋ฐฉ์์ ๋ง์ ์ฝ๋ ์ค๋ณต์ ์ด๋ํ ์ ์๋ค.
์ด ๋ชจ๋ฌ์ ์ฌ์ฉํ ๋๋ง๋ค ๋ชจ๋ฌ์ ์ด๋ฆฐ ์ํ๋ฅผ ์ ์ดํ๋ ๋ชจ๋ ์ฝ๋๊ฐ ์ค๋ณต๋ ๊ฒ์ด๋ค. ์ด ๋ชจ๋ฌ์ ์ฌ์ฉํ๋ ๋ชจ๋ ์ปดํฌ๋ํธ๋ค์ ๊ฐ๊ฐ IsOpen ์์ฑ์ ์ ์ํด ์ํ๋ฅผ ์ ์ดํด์ผ ํ ๊ฒ์ด๋ค.
์ด ๋ชจ๋ฌ์ ์ํ๋ฅผ ๋ณ๊ฒฝํ๊ธฐ ์ํด, ๋ ์ํ ์ ์ด๋ฅผ ์ค์ ์ง์คํํ๊ธฐ ์ํด ์ด๋ค ์ก์ ์ ํธ์ถํ ์ ์๋ค๋ฉด ์ด๋จ๊น? ๋ฆฌ๋์ค๋ฅผ ์ฌ์ฉํด๋ณด์!
๐ฏ ๋ฆฌ๋์ค๊ฐ ์๋ํ๋ ๋ฐฉ์
์ ์ฒด์ ์ผ๋ก(globally) ์ํ๋ฅผ ๊ด๋ฆฌํ๋ ์ผ์ ๋งค์ฐ ๋ณต์กํ ์ ์๋ค. ๋ฆฌ๋์ค๋ ์ฐ๋ฆฌ๊ฐ ์ํ ๊ด๋ฆฌ๋ฅผ ๋ ์ํ ์ ์๋๋ก ๋์์ค๋ค. ๊ฐ๋จํ ๋งํด, ๋ฆฌ๋์ค๋ ๋ฆฌ์กํธ ์ฑ์ ์ํ/๋ ผ๋ฆฌ๋ฅผ ์ค์ ์ง์คํํ ์ ์๋ ๋๊ตฌ์ด๋ค. ๋ฆฌ๋์ค๋ฅผ ์ฌ์ฉํ๋ฉด ๋ชจ๋ฌ ์ํ ์ ์ด๋ฅผ ์ด ๊ถํ์ด ํ์ํ ๋ชจ๋ ์ปดํฌ๋ํธ์ ์์(delegate) ํ์ง ์์๋ ๋๋ค.
๋ฆฌ๋์ค ์ ์ฉ ์์ ๋ก ๋ค์ด๊ฐ๊ธฐ ์ ์ ๋ฆฌ๋์ค์ ์ธ ๊ฐ์ง ์ฃผ์ ์์์ธ Action, Reducer, Store์ ๋ํด ๊ฐ๋จํ ์์๋ณด์.
Action์ ์ปดํฌ๋ํธ๊ฐ ๋๋จธ์ง ์์ฉ ํ๋ก๊ทธ๋จ์๊ฒ ์ผ๋ถ ์ํ๋ฅผ ์ ๋ฐ์ดํธํ๊ณ ์ถ๋ค๊ณ ์๋ฆฌ๊ธฐ ์ํด ํธ์ถํ๋ ์ด๋ฒคํธ์ด๋ค. ์ฐ๋ฆฌ์ ๊ฒฝ์ฐ YesNoModal์ ์ด๊ฑฐ๋ ๋ซ์์ผ ํ๋ค๊ณ ๋งํ๋ Action์ ํธ์ถํ ๊ฒ์ด๋ค.
Reducer๋ ์ด๊ธฐ ์ํ์ Action์ ๋ฐ์ ์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ก์ง์ ์ํํ๊ณ , ์๋ก์ด ์ํ๋ฅผ ๋ฆฌํดํ๋ ์์ํ ํจ์์ด๋ค.
๋ง์ง๋ง์ผ๋ก, Store๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ฒด ๊ธ๋ก๋ฒ ์ํ๋ฅผ ์ ์ฅํ๋ ๋ฉ์ปค๋์ฆ์ด๋ค. ์ฐ๋ฆฌ๋ Action์ ํธ์ถํด ์ด ๊ธ๋ก๋ฒ ์ํ๋ฅผ ์ ๋ฐ์ดํธํ๊ณ Reducer์์ ์ด๋ค์ ์ฒ๋ฆฌํ ๊ฒ์ด๋ค.
๋ฆฌ๋์ค๊ฐ ์ด๋ป๊ฒ ์๋ํ๋์ง ๋ช ์ค์ ํ ์คํธ๋ก ์ค๋ช ํ๊ธฐ๋ ์ด๋ ต์ง๋ง, ์ฝ๋๋ฅผ ๋ณด๋ฉด ํจ์ฌ ๋ ๋ถ๋ช ํด์ง ๊ฒ์ด๋ค.
๐ฏ ๋ฆฌ๋์ค ์ค์น
๋ฆฌ๋์ค๋ฅผ ์ค์นํ๋ฉด์ ์์ํด๋ณด์.
npm install redux -s
๋ฆฌ๋์ค ์์ฒด ์ธ์๋ React-redux ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ค์นํ๋ค. React-redux๋ ๋ฆฌ์กํธ์ ๊ณต์ ๋ฐ์ธ๋ฉ์ผ๋ก ๊ธ๋ก๋ฒ ์ํ๊ฐ ์ธ์ ๋ณ๊ฒฝ๋์๋์ง ์ปดํฌ๋ํธ์๊ฒ ์๋ ค์ฃผ๊ณ ํด๋น ๋ณ๊ฒฝ์ ๋ฐ๋ผ ์ฌ๋ ๋๋งํ ์ ์๋๋ก ๋์์ ์ค๋ค.
npm install redux-react -s
๐ฏ modalsReducer.js
modalsReducer๋ ์ปดํฌ๋ํธ์ ์ํด ํธ๋ฆฌ๊ฑฐ ๋ Action์ ๊ธฐ๋ฐ์ผ๋ก ํ๋ ๋ก์ง์ ์ํํ๋ ๊ณณ์ด๋ค. ์ด ์์์์ ๋ชจ๋ฌ์ด ํ๋๋ฐ์ ์์ง๋ง ์ด Reducer๋ฅผ ์ฌ์ฉํด ๋ ๋ง์ ๋ชจ๋ฌ๋ค์ ๊ด๋ฆฌํ ์๋ ์๋ค.
// modalsReducers.js
const initialState = {
showYesNoModal: false
}
export function modalsStore(state = initialState, action) {
const actions = {
"ShowYesNoModal" : {
...state,
showYesNoModal: true
},
"HideYesNoModal" : {
...state,
showYesNoModal: false
}
}
return actions[action.type] || state
}
Reducer๋ ์ด๊ธฐ ์ํ ๊ฐ์ฒด์ ์ํ๋ฅผ ์ ๋ฐ์ดํธํด์ผ ํ ๋ ํธ์ถ๋๋ ํจ์๋ก ๊ตฌ์ฑ๋๋ค. modalsStore ํจ์๋ ๋งค๊ฐ ๋ณ์๋ก ์ํ์ Action์ ๋ฐ๋๋ค. ์ด Action์ ํ์ฌ ์ํ์์ ์ด๋ค ๋ณํ๋ฅผ ๋ง๋ค์ด์ผ ํ๋์ง ๋งํด์ค๋ค.
๋ง์ฝ Action์ ํ์ ์ด ShowYesNoModal๋ผ๋ฉด, showYesNoModal ๊ฐ์ true๋ก ์ธํ ํ๋ ์๋ก์ด ์ํ(๋ชจ๋ฌ์ด ํ์๋ ์ํ)๋ฅผ ๋ฆฌํดํ๋ค. ๋ชจ๋ฌ์ด ํ ๋ฒ ์ด๋ฆฌ๋ฉด, showYesNoModal์ ๊ฐ์ด false์ธ ์๋ก์ด ์ํ๋ฅผ ๋ฆฌํดํ๋ฉฐ HideYesNoModal ํ์ ์ ๊ฐ์ง Action์ ๋์คํจ์น(dispatch)ํด ๋ชจ๋ฌ์ ๋ซ์ ์ ์๋ค.
์ด Reducer๋ฅผ ์ฐ๋ฆฌ์ ์ปดํฌ๋ํธ์ ์ฐ๊ฒฐ์ํค๊ธฐ ์ํด, index.js ํ์ผ์ ์์ ํด์ค๋ค.
// index.js
import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
import { Provider } from 'react-redux';
import { modalsStore } from './store/modals.store';
import { combineReducers } from 'redux';
import { createStore } from 'redux';
var rootReducer = combineReducers({ modalsStore })
const store = createStore(rootReducer);
ReactDOM.render(
<Provider store={store}>
<React.StrictMode>
<App />
</React.StrictMode>,
</Provider>,
document.getElementById('root')
);
๊ธฐ๋ณธ์ ์ผ๋ก, ์ฐ๋ฆฌ๋ ์ฑ์ Provider ์ปดํฌ๋ํธ๋ก ๊ฐ์ธ๋ฉด์ Store๋ฅผ ๋ง๋ค๊ณ ์ปดํฌ๋ํธ์ ์ฐ๊ฒฐํ๋ค. ๊ทธ๋ ๊ฒ ํ๋ฉด ์ปดํฌ๋ํธ๋ Action์ ๋์คํจ์นํ ์ ์๊ณ ์ํ ๋ณํ๋ฅผ ๊ฐ์งํ ์ ์๋ค. ์ฐ๋ฆฌ๋ ์ฌ๋ฌ ๊ฐ์ Reducer๋ค์ ๊ฒฐํฉํ ์๋ ์๋ค. ์ด ์์์์ ์ฐ๋ฆฐ modalReducer๋ง ๋ค๋ฃจ์ง๋ง, notificationReducer, alertReducer ๋ฑ ๋ค์ํ Reducer๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
MainComponent๋ฅผ ์ฐ๊ฒฐํด YesNoModal์ ํ์ํ๊ธฐ ์ํด Action์ ๋์คํจ์นํด๋ณด์.
// MainComponentRedux.js
import YesNoModal from './YesNoModal'
import React, { useState } from 'react';
import { connect } from 'react-redux'
import { openModalButtonStyle, buttonContainerStyle } from './MainComponent.styles'
const MainComponent = ({ showYesNoModal }) => {
const [ modalStatus, setModalStatus ] = useState('')
const onYesPressed = () => {
setModalStatus("User pressed yes")
}
const onNoPressed = () => {
setModalStatus("User pressed no")
}
return (
<>
<div style={buttonContainerStyle}>
<button style={openModalButtonStyle} onClick={showYesNoModal}>Open</button>
{ modalStatus ?? <span>{ modalStatus }</span> }
</div>
<YesNoModal
id="modal-id"
onYesPressed={onYesPressed}
onNoPressed={onNoPressed}
/>
</>
);
};
const mapDispatchToProps = (dispatch) => ({
showYesNoModal: () => dispatch({ type: "ShowYesNoModal" })
})
export default connect(null, mapDispatchToProps)(MainComponent);
์ด๋ ๊ฒ ํ๋ฉด MainComponent์์ ๋ชจ๋ฌ ์คํ ์ํ๊ฐ ๋ ์ด์ ํ์ ์๋ค. MainComponent๊ฐ ๋์ด์ ๋ชจ๋ฌ์ ์ํ๋ฅผ ๊ด๋ฆฌํ์ง ์์๋ ๋๋ค๋ ์๋ฏธ์ด๋ค. ๋์ , ์์ฑ์ผ๋ก showYesNoModal ํจ์๋ฅผ ๋ฐ์๊ณ ์ด ๊ฒ์ด ๋ชจ๋ฌ์ด ์ด๋ ค์ผ ํ ๋ ํธ์ถ๋ ๊ฒ์ด๋ค.
ํ์ง๋ง ์ด showYesNoModal์ด ์ด๋์ ์ฌ๊น? ์ด ํจ์๋ ์ฝ๋์ ๋ง์ง๋ง ์ค์์ ์ปดํฌ๋ํธ์ mapDispatchtoProps๋ฅผ ์ฐ๊ฒฐํ ๋ ์์ฑ์ผ๋ก ์ ๋ฌ๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก ์ฐ๋ฆฌ๋ ShowYesNoModal ํ์ ์ Action์ ์ ์กํ๊ณ ์์ผ๋ฉฐ ์ด๋ Reducer์ ์ํด ์บก์ฒ๋๊ณ ์ํ ๋ณํ๋ฅผ ํธ๋ฆฌ๊ฑฐํ๋ค.
์ด์ ์ฐ๋ฆฌ๋ ๋ชจ๋ฌ์ ํ์ํ๊ธฐ ์ํด YesNoModal์์์ ์ํ ๋ณํ๋ฅผ ๊ฐ์งํด์ผ ํ๋ค.
// YesNoModal.js
import React from 'react';
import Modal from 'react-modal';
import { connect } from 'react-redux'
const YesNoModal = ({ closeModal, showModal, onYesPressed, onNoPressed }) => {
const handleYesPressed = () => {
onYesPressed()
closeModal()
}
const handleNoPressed = () => {
onNoPressed()
closeModal()
}
return (
<Modal
isOpen={showModal}
onRequestClose={closeModal}
style={customStyles}
>
<div>Are you sure?</div>
<div>
<button style={buttonStyle} onClick={handleYesPressed}>Yes</button>
<button style={buttonStyle} onClick={handleNoPressed}>No</button>
</div>
</Modal>
);
};
const mapStateToProps = (state) => {
return {
showModal: state.modalsStore.showYesNoModal
}
}
const mapDispatchToProps = (dispatch) => ({
closeModal: () => dispatch({ type: "HideYesNoModal" })
})
export default connect(mapStateToProps, mapDispatchToProps)(YesNoModal);
์ํ๋ฅผ ์์ฑ์ ๋งคํ์ํฌ ๋(33๋ฒ์งธ ์ค), ๊ธฐ๋ณธ์ ์ผ๋ก ๊ธ๋ก๋ฒ Store์ ๋ชจ๋ ์ํ ๋ณํ๋ฅผ ์ฝ์ ์ ์๋ค. mapStateToProps ํจ์๋ ๊ธ๋ก๋ฒ ์ํ ๊ฐ์ฒด๋ฅผ ๋ฐ๊ณ ์ด๊ฒ์ ๋ชจ๋ฌ์ ํ์ ์ฌ๋ถ๋ฅผ ๊ด๋ฆฌํ๋ ์์ฑ์ ๊ฐ์ง ๋ ๋ค๋ฅธ ๊ฐ์ฒด์ ๋งคํ์ํจ๋ค.
showModal ์์ฑ ์ด์ธ์๋, ์ปดํฌ๋ํธ๋ closeModal์ด๋ผ ๋ถ๋ฆฌ๋ ํจ์๋ฅผ ๋ฐ๋๋ค. ํ ๋ฒ ํธ์ถ๋๋ฉด, ๋ชจ๋ฌ์ ํ์ ์ฌ๋ถ ์์ฑ์ false๋ก ์ธํ ํ๋ฉฐ, Reducer์ ์ํด ์บก์ณ๋๊ณ ์ํ๋ฅผ ์ ๋ฐ์ดํธํ๋ HideYesNoModal ํ์ ์ ๊ฐ์ง Action์ ๋์คํจ์นํ ๊ฒ์ด๋ค.
์ด ๊ฒ์ด ๋ฐ๋ก ๋ฆฌ๋์ค์ ์ํด ๊ด๋ฆฌ๋๋ ๊ธ๋ก๋ฒ ์ํ๋ค์ ์ฌ์ฉํด ๋ชจ๋ฌ์ ์ ์ดํ๋ ๋ฐฉ๋ฒ์ด๋ค. ์ด ์์ ์์, "๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ์ป๊ธฐ ์ํด ๋ ๋ง์ ์ฝ๋๋ฅผ ์์ฑํด์ผ ํ๋๋ฐ ์ ๋ฆฌ๋์ค๋ฅผ ์ฌ์ฉํด์ผ ํ ๊น?"๋ผ๋ ์๋ฌธ์ด ์๊ธธ ๊ฒ์ด๋ค.
์์ ์์์์ ์ฐ๋ฆฌ๋ ๋จ ํ๋์ ๋ชจ๋ฌ๋ง์ ์ฌ์ฉํ๋ค. ๋ง์ฝ ์ฐ๋ฆฌ๊ฐ ๋ ๋ง์ ๋ค๋ฅธ ๋ชจ๋ฌ๋ค์ ์ฌ์ฉํ๋ฉด ์ด๋จ๊น? ์ปดํฌ๋ํธ์์ ์ง์ ํ์ํ ๋๋ง๋ค ๋ชจ๋ฌ ์ํ๋ฅผ ๊ด๋ฆฌํ ๊ฒ์ธ๊ฐ? ์๋ง ์๋ ๊ฒ์ด๋ค!
ํ ๋ฒ ์ฒซ ๋ฒ์งธ Reducer๋ฅผ ์์ฑํ๊ณ app์ ์ฐ๊ฒฐํด ๋์ผ๋ฉด, ์๋ก์ด Reducer๋ฅผ ๊ตฌํํ๋ ๊ฒ์ ์๋นํ ๊ฐ๋จํ ๊ฒ์ด๋ค. ๊ทธ๊ฒ๋ค์ index.js ํ์ผ์ ์ํฌํธํ๊ณ Store๋ฅผ ๋ง๋ค ๋ ๊ฒฐํฉํ๊ธฐ๋ง ํ๋ฉด ๋๋ค.
๋ด ์์ ํ๋ก์ ํธ ์ค ํ๋์์ ์ค์ ๋ก ๊ตฌํํ๋ Reducer๋ฅผ ๊ณต์ ํ๊ณ ์ ํ๋ค. ์ด ๊ธ์์ ๋ ผ์ํ ๋ด์ฉ๊ณผ ์ ํํ ๊ฐ์ ๊ฒ์ด๋ค.
// real-life-example.js
import { modalConstants } from '../constants';
const initialState = {
showUserRegisterModal: false,
showSchoolDetailsModal: false,
showAdvancedQueryModal: false,
};
export function modals(state = initialState, action) {
const actions = {
[modalConstants.SHOW_USER_REGISTER_MODAL]: {
...state,
showUserRegisterModal: true,
message: action.message,
redirectAfterRegister: action.redirectAfterRegister,
actionToExecuteAfterRegister: action.actionToExecuteAfterRegister,
},
[modalConstants.CLOSE_USER_REGISTER_MODAL]: {
...state,
showUserRegisterModal: false,
},
[modalConstants.SHOW_ADVANCED_QUERY_MODAL]: {
...state,
showAdvancedQueryModal: true,
},
[modalConstants.CLOSE_ADVANCED_QUERY_MODAL]: {
...state,
showAdvancedQueryModal: false,
},
[modalConstants.SHOW_SCHOOL_MODAL]: {
...state,
showSchoolDetailsModal: true,
school: action.school,
},
[modalConstants.CLOSE_SCHOOL_MODAL]: {
...state,
showSchoolDetailsModal: false,
},
[modalConstants.SHOW_LOGIN_MODAL]: {
...state,
message: action.message,
showLoginModal: true,
},
[modalConstants.CLOSE_LOGIN_MODAL]: {
...state,
showLoginModal: false,
},
[modalConstants.SHOW_SEARCHES_MODAL]: {
...state,
showSearchesModal: true,
searches: action.searches,
},
[modalConstants.CLOSE_SHOW_SEARCHES_MODAL]: {
...state,
showSearchesModal: false,
},
[modalConstants.SHOW_FAVORITE_SCHOOLS_MODAL]: {
...state,
showFavoriteSchoolsModal: true,
schools: action.schools,
},
[modalConstants.CLOSE_FAVORITE_SCHOOLS_MODAL]: {
...state,
showFavoriteSchoolsModal: false,
},
[modalConstants.SHOW_SCHOOLS_TO_VISIT_MODAL]: {
...state,
showShoolsToVisitModal: true,
schools: action.schools,
},
[modalConstants.CLOSE_SCHOOLS_TO_VISIT_MODAL]: {
...state,
showShoolsToVisitModal: false,
},
[modalConstants.SHOW_RECOVER_PASSWORD_MODAL]: {
...state,
showRecoverPasswordModal: true,
},
[modalConstants.CLOSE_RECOVER_PASSWORD_MODAL]: {
...state,
showRecoverPasswordModal: false,
},
};
return actions[action.type] || state;
}
์ด ์์ ์ ์ด์ ์ ๋ชจ๋ฌ์ ๋ค๋ฃจ๋ ๊ฒ์ด์์ง๋ง, ์ด ์ ๊ทผ๋ฒ์ ๊ฒฝ๊ณ , ์๋ฆผ, ์ธ์ฆ ๋ฑ๊ณผ ๊ฐ์ด ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฒด์์ ์ํ ์ ์ด๋ฅผ ๊ณต์ ํด์ผ ํ๋ ์์ ๋ค๋ก ํ์ฅํ ์ ์๋ค.
์ค๋์ ์ฌ๊ธฐ๊น์ง. ๊ธ์ด ์ด๋ค ์์ผ๋ก๋ ๋์์ด ๋์๊ธฐ๋ฅผ ๋ฐ๋๋ค.
๋ชธ์กฐ์ฌํ์๊ณ ํ๋ณตํ ์ฝ๋ฉ ๋๊ธธ!
์์ค ์ฝ๋๋ ๊นํ๋ธ์์ ๋ณผ ์ ์๋ค.
๐ฑ๐ค ์ฐธ๊ณ : -
'๋ฒ์ญ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
ํ๋ก ํธ์๋ ์ฒดํฌ๋ฆฌ์คํธ [๋ฒ์ญ] (0) | 2024.03.22 |
---|---|
๋ฆฌ์กํธ๋ก ์ฑํ ํ๋ก ํธ์๋ ๊ตฌ์ถํ๊ธฐ [๋ฒ์ญ] (2) | 2022.05.31 |