Marais.lee
Welcome to Marais's IT Home
Marais.lee
전체 방문자
오늘
어제
  • 분류 전체보기 (87)
    • co-task 프로젝트 (7)
    • Study (28)
      • 자바스크립트 (5)
      • 모던 리액트 Deep Dive (7)
      • 용어 (1)
      • 컴퓨터과학 (2)
      • 코테 (12)
      • 네트워크 (0)
    • 개발 환경 (3)
    • Next.js (pages router) (9)
    • Next.js (app router + 14v) (4)
    • TypeScript (11)
    • 라이브러리 (8)
    • 후기 및 고민 (10)
    • 맥북관련 셋팅 및 오류 (4)
    • Obsidian | 옵시디언 (1)
반응형

인기 글

최근 글

블로그 메뉴

  • 홈
  • 태그
  • 방명록
250x250
hELLO · Designed By 정상우.
Marais.lee

Welcome to Marais's IT Home

TypeScript, Next.js, React.js 이미지 미리보기 | Image Preview
TypeScript

TypeScript, Next.js, React.js 이미지 미리보기 | Image Preview

2024. 3. 18. 23:00
728x90

프론트엔드라면 프로젝트마다 적어도 한번씩은 image preview 작업을 할 것이다. 그래서 필수 코드를 정리해보았다.

 

아래 코드는 프로필 이미지를 편집하는 모달이다.

스택은 macro.twin, next.js(pages router)이고 css가 생략되어 있을 수 있다. 

TypeScript 에러

 

 

위의 빨간 줄을 없애기 위해 아래처럼 방어코드를 작성해주었다. 

const [imagePreview, setImagePreview] = useState("/images/defaultUser.svg");
	const addPreviewImage = async (e: React.ChangeEvent<HTMLInputElement>) => {
		if (e.target.files !== null) {
			const file = e.target.files[0];
			if (file) {
				const reader = new FileReader();
				reader.readAsDataURL(file);
				await new Promise((resolve) => {
					reader.onload = () => {
						setImagePreview(reader.result as string);
						resolve(null);
					};
				});
			}
		}
	};
    
    return (
    	<h1>Profile information</h1>
				<div>
					<div tw="w-full text-left mb-2">Photo</div>
					<div tw="w-full flex gap-5 justify-center items-center">
						<div tw="relative w-[80px] h-[80px] border border-[#70686880] rounded-full overflow-hidden">
							<input
								style={{ display: "none" }}
								id="imageInput"
								name="image"
								type="file"
								accept=".png, .jpeg, .jpg"
								onChange={(e) => addPreviewImage(e)}
							/>
							<Image
								priority
								src={imagePreview}
								alt="profile_image"
								fill
								sizes="70px"
							/>
						</div>
						<div tw="flex flex-col text-left">
							<div tw="flex gap-4">
								<button tw="text-mint">
									<label htmlFor="imageInput">Update</label>
								</button>
								<button tw="text-red-600">Remove</button>
							</div>
							<p>
								Recommended: Squre JPG, PNG, at least 1,000
								pixels <br /> per side.
							</p>
						</div>
					</div>
				</div>
    )
728x90
반응형
저작자표시 비영리 변경금지 (새창열림)

'TypeScript' 카테고리의 다른 글

ERROR | 'string' 형식의 식을 인덱스 형식에 사용할 수 없으므로 요소에 암시적으로 'any' 형식이 있습니다.  (0) 2024.06.14
유틸리티 타입 Pick<T, K> 프젝에 적용하기 | TypeScript  (0) 2024.03.19
제네릭 | 한 입 크기로 잘라먹는 타입스크립트  (1) 2024.03.12
TypeError: Cannot read properties of undefined (reading 'length') 의 원인과 해결 방안  (0) 2024.03.09
    'TypeScript' 카테고리의 다른 글
    • ERROR | 'string' 형식의 식을 인덱스 형식에 사용할 수 없으므로 요소에 암시적으로 'any' 형식이 있습니다.
    • 유틸리티 타입 Pick<T, K> 프젝에 적용하기 | TypeScript
    • 제네릭 | 한 입 크기로 잘라먹는 타입스크립트
    • TypeError: Cannot read properties of undefined (reading 'length') 의 원인과 해결 방안
    Marais.lee
    Marais.lee
    구글링으로 한국어로 된 글을 찾지 못했거나 이해하는데 어려움이 있었던 이슈를 공유합니다.

    티스토리툴바