ModalReducer.ts
const OPEN_MODAL = "open modal window";
const CLOSE_MODAL = "close modal window";
type Modal = {
show: boolean;
};
export const openModal = () => ({
type: OPEN_MODAL,
});
export const closeModal = () => ({
type: CLOSE_MODAL,
});
const initialState: Modal = {
show: false,
};
type ModalAction = ReturnType<typeof openModal> | ReturnType<typeof closeModal>;
export const ModalReducer = (state = initialState, action: ModalAction) => {
switch (action.type) {
case OPEN_MODAL:
return {
show: true,
};
case CLOSE_MODAL:
return {
show: false,
};
default:
return state;
}
};
modules/index.ts
rootReducer에 ModalReducer을 추가해준다.
export const rootReducer = combineReducers({ TodoReducer, ModalReducer });
localstorage에 저장할 필요가 없기 때문에 persistConfig에는 따로 추가해주지 않는다.
모달을 다루는 버튼이 있는 컴포넌트
reducer을 가져와 dispatch 해준다.
const modalState = useSelector((state: RootState) => state.ModalReducer);
const dispatch = useDispatch();
const toggleStartupMenu = () => {
if (modalState.show) dispatch(closeModal());
else dispatch(openModal());
};
jsx에서 다음과 같이 작성하면 버튼 클릭에 따라 모달을 관리할 수 있다.
{modalState.show ? <StartupMenu /> : <></>}
모달창을 제외한 영역을 설정한 뒤, 그 영역(outside)을 ref.current로 관리한다. 만약 클릭된 부분이 outside라면 모달창을 닫는 함수를 수행한다.
export const Square = () => {
const modalState = useSelector((state: RootState) => state.ModalReducer);
const dispatch = useDispatch();
const outside = useRef<HTMLDivElement>(null);
const closeStartupMenu = () => {
dispatch(closeModal());
};
return (
<section>
{modalState.show ? (
<>
<div
ref={outside}
onClick={(e) => {
if (e.target === outside.current) closeStartupMenu();
}}
style={{
position: "fixed",
width: "100%",
height: "100%",
}}
>
<StartupMenu />
</div>{" "}
</>
) : (
<></>
)}
</section>
);
};
target="_blank"
onClick={(e) => e.preventDefault()}
$ npm i bootstrap-icons
sass 파일
@import "node_modules/bootstrap-icons/font/bootstrap-icons";
사용할 때 class를 className으로 변경해준다.
<i className="bi bi-search"></i>
상태바 스타일링을 했는데 꽤 그럴 듯 하당 키키
상태바 날씨 바로가기
시계 바로가기
검색 시 구글로 검색해버리기
배경화면 업로드