๋ฌธ์ ํ์ ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ ํ๋ก์ ํธ ๋ด์์ svg ํ์ผ์ ์ปดํฌ๋ํธ๋ก์ ์ฌ์ฉํ๊ธฐ ์ํด ๋ค์๊ณผ ๊ฐ์ด ์ฝ๋๋ฅผ ์์ฑํ์๋ค. import { ReactComponent as ProfileIcon } from '/images/icon-profile.svg'; ํ์ง๋ง ํด๋น ์ฝ๋์์ ๋ค์๊ณผ ๊ฐ์ ์๋ฌ๊ฐ ๋ฐ์ํ์๋ค. "*.svg"' ๋ชจ๋์ ๋ด๋ณด๋ธ ๋ฉค๋ฒ 'ReactComponent'์ด(๊ฐ) ์์ต๋๋ค. ๋ฌธ์ ํด๊ฒฐ ์คํ์ค๋ฒํ๋ก์ฐ์์ ๋์ ๊ฐ์ ๋ฌธ์ ๋ฅผ ๋ฐ๊ฒฌํ์๊ณ ํด๋น ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์๋ค.https://stackoverflow.com/questions/54121536/typescript-module-svg-has-no-exported-member-reactcomponent TypeScript - Module '"*.svg"..
Issue ํ๋ก์ ํธ ์ค, ๋ก์ปฌ PC์์ ๊ฐ์ ธ ์จ ์ด๋ฏธ์ง๋ฅผ preview๋ก ๋ณด์ฌ์ฃผ๋ฉฐ ์ ์ฅํ๋ ๊ธฐ๋ฅ ๊ตฌํ์ด ํ์ํ๋ค. ์ฒ์์๋ ๊ฐ๋จํ ๊ธฐ๋ฅ ๊ตฌํ์ผ ์ค ์์์ง๋ง ์๊ฐ๋ณด๋ค ๋ง์ ์ํ์ฐฉ์ค๋ฅผ ๊ฒช์๊ธฐ์ ํด๋น ๋ด์ฉ์ ํฌ์คํ ํ๊ณ ์ ํ๋ค. Code 1) Input ์คํ์ผ ์ปค์คํฐ๋ง์ด์ง ์ฐ์ , Input ํ๊ทธ ๋ด์ 'type=file' ์์ฑ์ ์ง์ ํด์ฃผ๋ฉด ๋ก์ปฌ PC์์ ์ด๋ฏธ์ง ์์ค๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์ง๋ง ๊ธฐ๋ณธ ์ง์ ์คํ์ผ์ด ์ํ๋ ๋ฐฉํฅ์ด ์๋๊ธฐ์ ๋ค์๊ณผ ๊ฐ์ด JSX๋ฅผ ์์ฑํ์๋ค. ๋ด PC์์ ๋ถ๋ฌ์ค๊ธฐ ์ค์ ๋ก์ปฌ PC์์ ์ด๋ฏธ์ง๋ฅผ ๊ฐ์ ธ์ค๋ ๊ธฐ๋ฅ์ FetchLocalPC ์ปดํฌ๋ํธ์ด์ง๋ง ์คํ์ผ์ ์ปค์คํฐ๋ง์ด์งํ๊ธฐ ์ํด์ FileLabel ์ปดํฌ๋ํธ๋ฅผ ๋ฐ๋ก ๋ง๋ค์ด ๋ ์ปดํฌ๋ํธ์ ๋ค์๊ณผ ๊ฐ์ด ์คํ์ผ์ ์ง์ ํด์ฃผ์๋ค. export const Fi..
Issue ํ๋ก์ ํธ ๋์ค typescript ๊ธฐ๋ฐ์ react-redux ์ ์ญ ์ํ๋ฅผ ์ธํ ํด์ผ ๋๋ ์ํฉ์ด ์์๋ค. redux ๋ด action, ์ก์ ์์ฑ ํจ์, ๋ฆฌ๋์์ ๋ํ ์ ์ ํ ํ์ ์ ์ง์ ํด์ฃผ๊ธฐ ๊น๋ค๋ก์ด ์ํฉ ์์์ typesafe-actions ๋ผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์๊ฒ ๋์๋ค. https://github.com/piotrwitek/typesafe-actions GitHub - piotrwitek/typesafe-actions: Typesafe utilities for "action-creators" in Redux / Flux Architecture Typesafe utilities for "action-creators" in Redux / Flux Architecture - GitHub - pi..
๋ฌธ์ ํ๋ฉด์ ๋๋๋ง ๋ ๊ฐ ๋ฆฌ์คํธ๋ฅผ ๋๋ฅด๋ฉด ํด๋น ๋ฆฌ์คํธ์ ์์ธ ํ์ด์ง๋ก ์ด๋ํ๋ ๊ธฐ๋ฅ์ ๊ตฌํํ๊ธฐ ์ํด ๋ค์๊ณผ ๊ฐ์ด ๊ฐ ๋ฆฌ์คํธ์ ๊ณ ์ ์์ด๋ ๊ฐ์ dataset์ ํ ๋นํด์ฃผ์๊ณ ํด๋น id๊ฐ์ path query parameter์ ํ ๋นํด์ฃผ์๋ค. const LinkPage: FC = ({ itemInfoList }: LinkPageProps) => { const navigate = useNavigate(); const moveToDetailPage = ( e: React.MouseEvent ) => { const id = (e.target as HTMLParagraphElement).dataset.id; navigate(`/detail?id=${id}`); }; ( ... ) return ( {itemInfo..
๋ฌธ์ async/await ๋น๋๊ธฐ ์ฒ๋ฆฌ ํจ์ ๋ด์์ ํน์ ์ ๋ณด๋ค์ด ๋ด๊ธด ์์ดํ ๋ฆฌ์คํธ๋ฅผ ์๋ฒ๋ก๋ถํฐ ์ ๋ฌ ๋ฐ์ ๋ฐํํ๋๋ก ๋ค์๊ณผ ๊ฐ์ด ์ฝ๋๋ฅผ ์์ฑํ์๋ค. export interface ItemType { created_at: number; key: string; expires_at: number; download_count: number; count: number; size: number; summary: string; thumbnailUrl: string; files: File[]; sent?: Sent; } export const getItemData = async (): ItemType[] => { const { data } = await axios.get('https://romantic-hopper..
๋ฌธ์ ์์ ์ปดํฌ๋ํธ ๋ด์์ ํ์ ์ปดํฌ๋ํธ๋ก props๋ฅผ ์ ๋ฌํ๋ ๊ณผ์ ์์ type ์๋ฌ๊ฐ ๋ฐ์ํ์๋ค. export interface InfoType { [key: string]: any; id: number; title: string; client: string; due: string; count: number; amount: number; method: string[]; material: string[]; status: string; } const InfoListForm: FC = ({ method, material, status }) => { ( ... ) return ( {isEmpty ? ( ์กฐ๊ฑด์ ๋ง๋ ๊ฒฌ์ ์์ฒญ์ด ์์ต๋๋ค. ) : ( currentInfoList.map((info: InfoTy..
๋ฌธ์ ์ ์ ๊ฐ ์ ํํ ์์ดํ ์ ์ ๋ณด๋ฅผ ๋ด๊ณ ์๋ ๋ฆฌ์คํธ๋ฅผ ์ํํ์ฌ ํด๋น ์์ดํ ์ด ์กด์ฌํ๋์ง์ ์ฌ๋ถ๋ฅผ ํ์ธํ๊ธฐ ์ํด์ ๋ค์๊ณผ ๊ฐ์ด ๋ฌธ์์ด๋ก ๊ฐ์ฒด์ ํ๋กํผํฐ์ ์ ๊ทผํ๋ ์ฝ๋๋ฅผ ์์ฑํ์๋ค. infoList.forEach((info: InfoType) => { let isSorted = false; for (let i = 0; i < currentSelectedSortNum; i++) { if (info[currentSortName].includes(currentSort[i])) { isSorted = true; break; } } ( ... ) }); ํ์ง๋ง ์ ๋๋ก ๊ธฐ๋ฅ์ด ๋์๋์ง ์์๊ณ ์ค๋ฅ๋ฅผ ํ์ธํ๊ธฐ ์ํด ์ฝ์๋ฅผ ๋ณด๋, ๋ค์๊ณผ ๊ฐ์ ๋ฉ์ธ์ง๊ฐ ๋ ์์๋ค. Element implicitly has an 'any..