React

Prevent Leaving Page

폼 입력 페이지 이탈 방지에 대한 내용입니다.

Overview

해당 기능은 공통업무 기능입니다. 다음과 같이 미리 준비된 Boilerplate confy-app 형태로 제공됩니다.

주요 구성 요소

  • react-router-prompt 라이브러리를 사용하여 페이지 이동을 감지합니다.
  • confy-ui 라이브러리를 사용하여 경고 팝업을 표시합니다.
─ src
└── shared
└── hooks/
└── navigationGuardHook.tsx
import { Button, Dialog, Flex } from '@confy-ui/react/themes'
import ReactRouterPrompt from 'react-router-prompt'
/**
* 네비게이션 가드 컴포넌트
* @param props.confirm - 대화상자에 표시할 확인 메시지. 지정하지 않으면 기본 메시지가 사용됩니다.
* @param props.enabled - 네비게이션 가드 활성화 여부. true일 때만 동작합니다.
*/
export function NavigationGuardHook(props: {
confirm: string
enabled: boolean
}) {
return (
<>
<ReactRouterPrompt when={props.enabled}>
{({
isActive,
onConfirm,
onCancel
}: {
isActive: boolean // 대화상자 표시 여부
onConfirm: () => void // 확인 버튼 클릭 시 호출될 함수
onCancel: () => void // 취소 버튼 클릭 시 호출될 함수
}) => (
<Dialog.Root open={isActive}>
...
</Dialog.Root>
)}
</ReactRouterPrompt>
</>
)
}

Usage

사용법 예시

src/pages/member/pages/login.tsx

사용법 예시

  • 텍스트 입력 페이지 작성에서 폼 오류 발생하면 화면 이동 하면 경고를 표시합니다.
import { NavigationGuardHook } from '@/components/navigationGuardHook'
...
export default function LoginPage() {
const { login, loginError, isLoggingIn, logout } = useAuth()
const username = useUserinfoStore((state) => state.username)
const form = useForm<LoginFormValues>({
resolver: zodResolver(loginSchema),
defaultValues: {
email: '',
password: ''
},
mode: 'onBlur'
})
...
return (
<>
<NavigationGuardHook enabled={Object.keys(form.formState.errors).length > 0} confirm='화면 이동 경고' />
<Form {...form}>
<form onSubmit={form.handleSubmit(onSubmit)} className=''>
<Grid gap='5' columns='360px 360px'>
<Card variant='classic' size='4' key={0}>
<Box height='40px' mb='4'>
<Heading as='h3' size='6' mt='-1'>
Sign in
</Heading>
</Box>
...
</Card>
...
</Grid>
</form>
</Form>
</>
)
}
// 페이지 변경과 enable 조건을 감지하면 해당 컴포넌트가 작동합니다.
<NavigationGuardHook enabled={Object.keys(form.formState.errors).length > 0} confirm='화면 이동 경고' />

참고