728x90

1. Nav 컴퍼넌트 styled-component 관련 에러
@react-refresh:160  Warning: Received `true` for a non-boolean attribute `active`.

If you want to write it to the DOM, pass a string instead: active="true" or active={value.toString()}.


Nav 컴퍼넌트에서 styled-components 사용방식이 틀려서 난 에러이다.
props부분에 $를 붙여주면 해결된다. ( 몇 달전에 사용법이 바꼈는데, 기존 방식 써서 뜬 에러)

	font-size: ${({ $active }) => ($active ? '1.3rem' : '1rem')};
	// 기존 font-size: ${({ active }) => (active ? '1.3rem' : '1rem')};


2. redux 직렬화.
리덕스(+툴킷)에서는 직렬화 할 수 없는 값을 저장하려고 하면 에러가 뜸.
이를 해결하기 위해서 특정 케이스에 무시하는 방법도 있찌만, 기본적으로 직렬화 할 수 없는 값 저장시 오류가 생길 수 있으므로 안하는게 좋음.. 

 

3. antd upload

mocky라고 쉽게 api만들 수 있는 웹사이트가 있는데 이를 활용해서 antd가 이미지 미리보기가 구현되어있다. 근데
5개중 2~3개는 실패한다,, 통제할 수 없는 에러라 생각해서 사용하지 않기로 햇다.

4. null+ "

 

암묵적 타입 변환으로 null을 ""으로 바꾸고 싶었는데 "null"로 바뀜

console.log(imgFile);
	console.log(businessImg, '비지니스');
	console.log(!!businessImg, '비지니스');
	console.log('테스트', businessImg ? businessImg : ownerRegiImg);
	console.log('테스트2', ownerRegiImg);

조건문으로 처리함

 

5.  props 로 true false가 들어오는걸  jsx영역에 attribute로 줄 때,

적다보니 1번이랑 같은 문제라서 $를 붙임.. 근데 그냥 pending+"" 로 문자를 암묵적 타입변환해도 되고, error 메시지의 추천방법은 참일떄만 값을 보내기다

 

6.  배열 비교시 에러

   console.log(roomImgFiles, resistImgs, room.imgs, resistImgs == room.imgs);
        console.log(
            roomCategoryValue === room.roomCategory,
            roomCountValue === room.roomAvailability + '',
            roomPriceValue === room.roomPrice + '',
            resistImgs === room.imgs,
            !roomImgFiles,
            checkedList === room.service,
        );

배열을 비교할 떄 ,배열은 다른 것과 다르게 빈값일 때  true가   나옴,, 그리고  배열끼리 비교할 때 주소값이 다르면 같은 값이라도 다르게 나옴..

--> 해결법 어차피 파일 수정시 이미지 유지되는지 비교하는거라서 배열의 길이를 비교하여 구분함

 

7. 날짜 객체비교

const endDate = new Date('2023-10-18');

    const today = new Date();
    today.setHours(9, 0, 0, 0);
    console.log(endDate);
    console.log(today);
    console.log(today === endDate, '오늘 false나와야함');

참조값이라서 다르게 나옴. 근데 >= 은 제대로 먹음 크기비교라서

728x90

모달에 스타일을  주려고 하는데, 초기에는 max-width와 min-width를  활용해서 
최대 크기는  80vw 최소 크기는 400 px로 설정하려고 했다. ( 모달 크기도 화면의 크기에 따라서 조정하고 싶었습니다)
따라서 기존에 작성된 코드에서 width를 매개변수로 전달 받아서 스타일을 주려고 했는데,  모달에 최대사이즈와 최소사이즈를 주는 법을 찾지 못하였습니다.



문제해결 방법 1
우선 Modal antd 홈페이지에서 api를 살펴보았습니다.  (https://ant.design/components/modal)
하지만  width 키워드는 존재했지만, max-width와 min-width는 찾지 못하였습니다.
이를 해결하기 위해서 stackoverflow에도 검색을 하였는데,  className을 활용해라는 막연한 답변만 존재하고 실용가능한 답이 없었습니다.

문제해결 방법 2

두 번째는  키워드에서 style이라는 키워드가 있기에 이를 활용해서 해결해보려고 했습니다.
이중에서 style이라는 키워드가 있어서 이를 활용해서 css를 주려고 했습니다.
하지만 이 키워드에서 width 관련 스타일(max.min)은 적용되지 않았습니다.
(바깥 영역에 빨간색은 보이는 100vh가 제대로 적용되지 않음.

문제해결 방법 3
그 다음엔  해결하기 위해서 className을 줘서   해결하려고 했습니다.
이 방법 또한  실패했습니다. 파란색 영역은 적용되는데 크기는 적용되지 않음.

.CommonModal {
	/* 여기에 원하는 스타일을 작성합니다 */
	display: flex;
	justify-content: center;
	/* min-width: 400px !important;
	max-width: 100vw !important; */
	width: 5000px;
	align-items: center;
	background-color: blue;
	/* 추가적인 스타일을 적용하고 싶다면 이곳에 작성합니다 */
}



이를 해결하기 위해서 개발자 도구를 통해서 className을 찾은 다음에 직접적으로 스타일을 주려고 했는데 크기를 결정하는 컴퍼넌트의 class 이름이 ant-modal css-dev-only-do-not-override로 수정하지 말라고 적혀있더군요..

따라서 컴퍼넌트를 전달할 떄 , 직접 주는 width 값을 변경하기로 결정하였습니다.
useEffect를 통해서 사이즈가 변경될 때 적용을 시키려고 하다가 이럴 경우 렌더링이 많이 일어 날 거 같아서,,
그냥 모바일 크기 vs 웹 크기에서 모달 크기를 결정해놓고 size를 주었습니다.

	const modalOpen = () => {
		const modalSize = window.innerWidth >= 1000 ? 600 : 450;

		dispatch(openModal({ modalComponent: 'auth', modalSize: modalSize }));
	};



728x90

antd라이브러리로 모달 구현하기

전역 변수로 관리하기 위해서 먼저 redux-toolkit와 react redux를 설치합니다.

npm i @reduxjs/toolkit react-redux

이후 store와 Provider를 등록합니다 (BrowserRouter는 페이지 이동을 하기 위해 작성한 react-router 관련 코드입니다.)

import { store } from './store/redux';
import { Provider } from 'react-redux';


root.render(
	
		<Provider store={store}>
			<BrowserRouter>
				<App />
			</BrowserRouter>
		</Provider>
	
);


이후  모달의 기능을 구현할 slice를 등록합니다.

import { createSlice } from '@reduxjs/toolkit';
import { ReactNode } from 'react';
import { RootState } from '.';

export interface ModalState {
	isModalOpen: boolean;
	modalComponent: ReactNode | null;
}

const initialState: ModalState = {
	isModalOpen: false,
	modalComponent: null,
};

export const modalSlice = createSlice({
	name: 'modal',
	initialState,
	reducers: {
		openModal: (state, action) => {
			state.isModalOpen = true;
			state.modalComponent = action.payload;
		},
		closeModal: (state) => {
			state.isModalOpen = false;
			state.modalComponent = null;
		},
	},
});

export const { openModal, closeModal } = modalSlice.actions;

export const isModalOpen = (state: RootState) => state.modal.isModalOpen;
export const modalComponent = (state: RootState) => state.modal.modalComponent;

export default modalSlice.reducer;


타입스크립트가 적용된 modalSlice입니다. 

혹시 redux-toolkit에 대해서 간단하게 학습하고 싶다면 

npx create-react-app my-app --template redux-typescript

을 통해서 간단한 counter를 활용한 예시코드를 확인할 수 있습니다. (my-app 대신 자기가 만들고 싶은 프로젝트 이름)

api 요청 없는 전역변수이기에 extrareducer와 thunk는 사용하지 않았습니다.

이후 동일한 폴더내 있는 index.ts에 configureStore를 만들었습니다. 이를 통해서 index.tsx 에 등록한 store에 modalReducer를 등록했습니다.

import { configureStore } from '@reduxjs/toolkit';
import modalReducer from './modalSlice';

export const store = configureStore({
	reducer: {
		modal: modalReducer,
	},
});

export type AppDispatch = typeof store.dispatch;
export type RootState = ReturnType<typeof store.getState>;


usesDispatch와 useSelector 관련 코드는  hooks 폴더에서 작성 했습니다.

import { TypedUseSelectorHook, useDispatch, useSelector } from 'react-redux';
import type { RootState, AppDispatch } from '../store/redux';

// Use throughout your app instead of plain `useDispatch` and `useSelector`
export const useAppDispatch = () => useDispatch<AppDispatch>();
export const useAppSelector: TypedUseSelectorHook<RootState> = useSelector;

최종적으로 modalSlice에서 export했던   모달상태(isModalOpen)과 모달 내에 작성할 컴퍼넌트(modalComponent)를 모달에 등록합니다.

import { Modal } from 'antd';
import { useAppDispatch, useAppSelector } from '../../hooks/useReduxToolkit';
import { closeModal, isModalOpen, modalComponent } from '../../store/redux/modalSlice';

const CommonModal = () => {
	const modalState = useAppSelector(isModalOpen);
	const modalComp = useAppSelector(modalComponent);

	const dispatch = useAppDispatch();
	const onCloseModal = () => dispatch(closeModal());
	return (
		<div>
			<Modal open={modalState} footer={null} onCancel={onCloseModal} keyboard centered maskClosable>
				{modalComp}
			</Modal>
		</div>
	);
};

export default CommonModal;


이후에  모달을 사용할 컴퍼넌트에서 useAppDispatch와 openModal 함수를 통해서  모달을 열면 됩니다.

import { useAppDispatch } from '../hooks/useReduxToolkit';
import { openModal } from '../store/redux/modalSlice';
import Login from '../components/auth/Login';

const Header = () => {
	const dispatch = useAppDispatch();

	const modalOpen = () => {
		dispatch(openModal(<Login />));
	};
	return (
		<HeaderContainer>
			<div>logo</div>
			<div onClick={modalOpen}>로그인</div>
		</HeaderContainer>
	);
};

export default Header;

이렇게 하면 전역변수로 관리했기 때문에, 모달이 state 변경에 의해서 주변 컴퍼넌트를 리랜더링 시키지 않습니다.


아직 모달에 스타일 적용은 하지 않았습니다

 

 

++++
뒤늦게 알았는데 이럴 경우 병렬화 에러가 떴습니다. 해결방법은  https://ungumungum.tistory.com/25

+ Recent posts