Toast ํ์ ์ ๋ฌด์ธ๊ฐ ์ก์ ์ ์์ํ์ ๋, ์ข ๋ฃ๋์์ ๋, ์ํ๊ฐ ๋ฐ๋์์ ๋ ๋ฑ๋ฑ์ ๊ฒฝ์ฐ ์๋ ค์ฃผ๋ ํ์ ์ ๋๋ค.
๋ฐ๋ก ๋ซ๊ธฐ ๋ฒํผ์ ๋์ง ์๊ณ ์ผ์ ์๊ฐ์ด ์ง๋๋ฉด ์๋์ผ๋ก ์ฌ๋ผ์ง๋๋ค.
JavasScriptํ๊ฒฝ์์ setTimeout์ ํตํด ๊ฐ๋จํ๊ฒ ๊ตฌํ์ด ๊ฐ๋ฅํฉ๋๋ค.
// App.js
import { useState, useEffect } from "react";
import "./styles.css";
export default function App() {
return (
<div className="App">
<div className="btnWrap">
<button onClick={handleToast}>CLICK</button>
</div>
</div>
);
}
// Toast.js
export default function Toast({ msg = "๋ฉ์ธ์ง ์์" }) {
return <div className="toast">{msg}</div>;
}
// styles.css
.App {
font-family: sans-serif;
text-align: center;
}
.btnWrap {
padding-top: 50px;
}
button {
background: lightseagreen;
color: #fff;
padding: 10px 15px;
border-radius: 4px;
border: 0 none;
font-weight: bold;
cursor: pointer;
}
button:hover {
background: darkcyan;
}
.toast {
position: absolute;
top: 50%;
left: 50%;
padding: 11px;
min-width: 200px;
transform: translate(-50%, -50%);
z-index: 3;
background: rgba(0, 0, 0, 0.7);
color: #fff;
border-radius: 4px;
border: 1px solid #000;
}
Toast์ msg๋ฅผ props๊ฐ์ผ๋ก ๋ฐ์ ์ฌ์ฉํ๊ธฐ๋ก ํฉ๋๋ค.
๋ง์ฝ ๋๊ฒจ๋ฐ๋ msg๊ฐ์ด ์๋ค๋ฉด "๋ฉ์ธ์ง ์์"์ ๊ธฐ๋ณธ์ผ๋ก ์ถ๋ ฅํ๋๋ก ํฉ๋๋ค.
Toast๋ฅผ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
1. Toast state๋ฅผ false๋ฅผ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ๋๋ค.
2. ๋ฒํผ ํด๋ฆญ์ Toast state๋ฅผ true๋ก ๋ณ๊ฒฝํ๋ค.
3. useEffect์์ Toast ๊ฐ์ ๋ฆฌ์ค๋ํ๊ณ , Toast๊ฐ true์ธ ๊ฒฝ์ฐ 1000msํ ๋ค์ false๋ก ๋ณ๊ฒฝํ๋ค.
// App.js
export default function App() {
const [ToastStatus, setToastStatus] = useState(false);
const handleToast = () => {
setToastStatus(true);
};
useEffect(() => {
if (ToastStatus) {
setTimeout(() => setToastStatus(false), 1000);
}
}, [ToastStatus]);
return (
<div className="App">
<div className="btnWrap">
<button onClick={handleToast}>CLICK</button>
</div>
{ToastStatus && <Toast msg="I am Toast ๐" />}
</div>
);
}
์์ฃผ ๊ฐ๋จํฉ๋๋ค.
์ฌ๋ฌ๊ฐ๋ฅผ ์จ์ผ ํ๋ ๊ฒฝ์ฐ์๋ ์ํ ๋ฉ์์ง๋ฅผ ๊ฐ์ฒด๋ก ๋ฐ๋ก ๊ด๋ฆฌํ๋ฉด์ state๋ก ๊ฐ์ด ๊ด๋ฆฌํด ์ค ์๋ ์์ต๋๋ค.
import { useState, useEffect } from "react";
import "./styles.css";
import Toast from "./Toast";
// ๋ฉ์ธ์ง๋ชฉ๋ก
const msgList = {
complete: "ํ์ธ๋์์ต๋๋ค.",
amend: "์์ ๋์์ต๋๋ค.",
cancel: "์ทจ์๋์์ต๋๋ค."
};
export default function App() {
const [ToastStatus, setToastStatus] = useState(false);
const [ToastMsg, setToastMsg] = useState(""); // ํ ์คํธ์ ํ์ํ ๋ฉ์ธ์ง
const handleToast = (type) => {
setToastStatus(true);
setToastMsg(msgList[type]);
};
useEffect(() => {
if (ToastStatus) {
setTimeout(() => {
setToastStatus(false);
setToastMsg("");
}, 1000);
}
}, [ToastStatus]);
return (
<div className="App">
<div className="btnWrap">
<button onClick={() => handleToast("complete")}>ํ์ธ</button>
<button onClick={() => handleToast("amend")}>์์ </button>
<button onClick={() => handleToast("cancel")}>์ทจ์</button>
</div>
{ToastStatus && (
<>
<Toast msg={ToastMsg} />
</>
)}
</div>
);
}
์ด๋ ๊ฒ ์ฒ๋ฆฌํด ์ฃผ๋ฉด ํ๋์ ํ ์คํธํ์ ์ผ๋ก ๋ค์ํ๊ฒ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ด๋ ๊ฒ ํ๋ฉด ๋๋๊ฒ ๊ฐ์ง๋ง ํ ๊ฐ์ง ๋ฌธ์ ์ ์ด ์์ต๋๋ค.
๋ฒํผ์ 1000ms ์ด๋ด์ ํด๋ฆญํ ๋ ๋ฌธ๊ตฌ๋ง ์ค์๊ฐ์ผ๋ก ๋ฐ๋๊ฒ ๋ฉ๋๋ค.
์ด๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด์๋ ํ ์คํธ ํ์ ์ ์ก์ ์ด ๋๋๋ฉด ๋์์ด ๊ฐ๋ฅํ๊ฒ ํด ์ฃผ๋ฉด ๋ฉ๋๋ค.
export default function App() {
{...}
const handleToast = (type) => {
if (!ToastStatus) { // ToastStatus๊ฐ false์ผ๋๋ง!
setToastStatus(true);
setToastMsg(msgList[type]);
}
};
{...}
return (
...
);
}
์ด๋ ๊ฒ ๊ฐ๋จํ๊ฒ ์กฐ๊ฑด๋ง ์ถ๊ฐํด์ฃผ๋ฉด ๋ฉ๋๋ค.
๊ทธ๋ผ ToastStatus๊ฐ true์์ false๋ก ๋ฐ๋๊ธฐ ์ ๊น์ง๋ ์๋ก์ด ์ํ๊ฐ ์ ๋ฐ์ดํธ๋์ง ์์ต๋๋ค.
'๊ฐ๋ฐ ๐พ > ReactJS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[React, css] textarea ์ฌ์ฉ์ ์ฌ๋ฌ๊ฐ์ง ์ฒ๋ฆฌ (0) | 2021.12.26 |
---|---|
props๋ก ์ ๋ฌ๋๋ ํ ์คํธ ๋ผ์ธ ์ค๋ฐ๊ฟ ์ฒ๋ฆฌ๋ 2๊ฐ์ง ๋ฐฉ๋ฒ ! (2) | 2021.08.26 |
์ด๊ฐ๋จ useContext + useReducer (0) | 2021.07.02 |
React ์์ useRef ์ฌ์ฉํ๊ธฐ (0) | 2021.06.30 |
React ์์ ์ ๋๋ฉ์ด์ , ์ธํฐ๋ ์ ๊ตฌ์ถํ๊ธฐ (emotion / tweenmax) (0) | 2021.06.23 |