useConfirm
- ์ฌ์ฉ์๊ฐ ๋ฌด์ธ๊ฐ๋ฅผ ํ๊ธฐ์ ์ ํ์ธํ๋ ๊ฑด๋ฐ
์๋ฅผ ๋ค๋ฉด ์ฌ์ฉ์๊ฐ ๋ฒํผ์ ํด๋ฆญํ๋ ์์ ์ ํ๋ฉด ์ด๋ฒคํธ๋ฅผ ์คํํ๊ธฐ ์ ์ ๋ฉ์ธ์ง๋ฅผ ๋ณด์ฌ์ฃผ๊ณ ์ถ์ ๋ ์ฌ์ฉํ๋ค.
useConfirm๋ง ๊ตฌํํ ์ฝ๋
- ํ์ธ์ ๋๋ฅด๋ฉด delete, ์ทจ์๋ฅผ ๋๋ฅด๋ฉด abort๊ฐ ์ฝ์์ ์ถ๋ ฅ๋๋ค.
import "./styles.css";
import React, { useState, useEffect, useRef } from "react";
const useConfirm = (message = "", callback, rejection) => {
if (typeof callback !== "function") {
return;
}
const confirmAction = () => {
if (confirm(message)) {
callback();
} else{
rejection();
}
};
return confirmAction;
};
export default function App() {
const deleteWorld = () => console.log("deleting");
const abort = () => console.log("aborted");
const confirmDelete = useConfirm("are you sure", deleteWorld, abort);
return (
<div className="App">
<button onClick={confirmDelete}>Delete the world</button>
</div>
);
}
preventLeave
- ๋ณ๊ฒฝ์ฌํญ์ด ์ ์ฅ๋์ง ์์ ์ ์์ต๋๋ค. ๊ฐ์ด ๋์ค๋ ๊ฑฐ
import "./styles.css";
import React, { useState, useEffect, useRef } from "react";
const usePreventLeave = () => {
//API๊ฐ ์๋ตํ ๊ฒ์ ๋ฐ๋ผ ์ ์ฅ๋์๋์ง, ์๋์ง ๋ฑ์ ํ์ธ
// ๋ซ์๋ ๋ฉ๋๊น?
const listener = (event) => {
event.preventDefault();
event.returnValue = "";
};
const enablePrevent = () => window.addEventListener("beforeunload", listener);
const disablePrevent = () =>
window.removeEventListener("beforeunload", listener);
return { enablePrevent, disablePrevent };
};
// protect๋ฅผ ๋๋ฅด๊ณ ์ฐฝ์ ๋๋ ค๊ณ ํ๋ฉด ์๋ฆผ์ฐฝ์ด ๋ฌ๋ค.
export default function App() {
const { enablePrevent, disablePrevent } = usePreventLeave();
return (
<div className="App">
<button onClick={enablePrevent}>Protect</button>
<button onClick={disablePrevent}>Unprotect</button>
</div>
);
}
useBeforeLeave
- ์ผ๋จ ์๋์ฝ๋๋ ์นํ์ด์ง๋ฅผ ๋ฒ์ด๋ฌ์ ๋ leaving์ ์ฝ์์ ์ถ๋ ฅํ๋ค.
import "./styles.css";
import React, { useState, useEffect, useRef } from "react";
const useBeforeLeave=(onBefore) =>{
if(typeof onBefore !== "function"){
return;
}
const handle = ()=>{
console.log("leaving");
};
useEffect(()=>{
document.addEventListener("mouseleave", handle);
return () =>{
document.removeEventListener("mouseleave", handle);
}
}, []);
};
export default function App() {
const begForLife = () => console.log("please dont leave");
useBeforeLeave(begForLife);
return(
<div className="App">
<h1>Hello</h1>
</div>
);
}
์ด๋ ๊ฒ clientY๋ก ๋ง์ฐ์ค๊ฐ ์๋ก ๊ฐ ๋๋ง ๋์ํ๊ฒ ํ ์๋ ์๋ค.
import "./styles.css";
import React, { useState, useEffect, useRef } from "react";
const useBeforeLeave=(onBefore) =>{
if(typeof onBefore !== "function"){
return;
}
const handle = event =>{
const {clientY} = event;
if(clientY <= 0) {
onBefore();
}
};
useEffect(()=>{
document.addEventListener("mouseleave", handle);
return () =>{
document.removeEventListener("mouseleave", handle);
}
}, []);
};
export default function App() {
const begForLife = () => console.log("please dont leave");
useBeforeLeave(begForLife);
return(
<div className="App">
<h1>Hello</h1>
</div>
);
}
'WEB > Front-End๐' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[React Hooks] useFullscreen, useNotification, useAxios (0) | 2021.12.20 |
---|---|
[React Hooks] useFadeln, useNetwork, useScroll (0) | 2021.12.19 |
[React Hooks] useEffect, useTitle, useClick (0) | 2021.12.18 |
[React Hooks] useInput, useTabs (0) | 2021.12.13 |
[Typescript] ๋ธ๋ก์ฒด์ธ ๋ง๋ค๊ธฐ - predictable ํจ์๋ฆฌํด, ํจ์์ธ์ (0) | 2021.12.12 |