Làm animate siêu đơn giản với hook khi react component mount và unmount
Có rất nhiều lúc chúng ta muốn thêm/xóa một element trên trình duyệt, nó rất chi là trực quan dễ dàng với jQuery, tuy nhiên vì không còn đụng chạm trực tiếp vào DOM, việc đơn giản đó lại hơi kỳ công
// những ngày xa xưa ấy còn đâu
$("#my-element").fadeIn("slow");
Tại sao lại khó khăn ấy nhỉ? Hãy mường tượng nó qua một ví dụ
/* styles.css */
@keyframes fadeIn {
0% {
opacity: 0;
}
100% {
opacity: 1;
}
}
// index.js
const App = ({ show = true }) => (
show
? <div style={{ animation: `fadeIn 1s` }}>HELLO</div>
: null
)
Đó là tất cả những gì chúng ta cần làm để animate lúc component đang mount với fadeIn
, tuy nhiên lại không có cách nào để animate unmount, vì chúng ta đã xóa cái DOM ngay khi show
chuyển thành false
. Element đã ra đi ngay lập tức.
Tuyển dụng lập trình viên React
Vậy chúng ta cần làm gì
show
thay đổi, báo react khoan hãy unmount, delay nó lại một chút- Chạy animate
- Animate vừa chạy xong, unmount
Đây là cách làm đơn giản nhất chỉ bằng CSS và hook, tất nhiên nếu đụng tới những tính huống phức tạp hơn, khuyến khích bạn sử dụng react-spring
// index.js
import React, { useState } from "react";
import ReactDOM from "react-dom";
import "./styles.css";
import Fade from "./Fade";
const App = () => {
const [show, setShow] = useState(false);
return (
<div>
<button onClick={() => setShow(show => !show)}>
{show ? "hide" : "show"}
</button>
<Fade show={show}>
<div> HELLO </div>
</Fade>
</div>
);
};
const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);
// Fade.js
import React, { useEffect, useState } from "react";
const Fade = ({ show, children }) => {
const [shouldRender, setRender] = useState(show);
useEffect(() => {
if (show) setRender(true);
}, [show]);
const onAnimationEnd = () => {
if (!show) setRender(false);
};
return (
shouldRender && (
<div
style={{ animation: `${show ? "fadeIn" : "fadeOut"} 1s` }}
onAnimationEnd={onAnimationEnd}
>
{children}
</div>
)
);
};
export default Fade;
/* styles.css */
@keyframes fadeIn {
0% {
opacity: 0;
}
100% {
opacity: 1;
}
}
@keyframes fadeOut {
0% {
opacity: 1;
}
100% {
opacity: 0;
}
}
Xem demo tại đây
Có thể bạn quan tâm:
- Làm quen với React Hook bằng ví dụ
- Làm sao để fetch dữ liệu bằng React Hook
- 3 bước tối ưu hiệu năng React App bằng các API mới của React
Xem thêm các việc làm về React trên TopDev
TopDev via Vuilaptrinh
- B BenQ RD Series – Dòng Màn Hình Lập Trình 4k+ Đầu Tiên Trên Thế Giới
- i iOS 18 có gì mới? Có nên cập nhật iOS 18 cho iPhone của bạn?
- G Gamma AI là gì? Cách tạo slide chuyên nghiệp chỉ trong vài phút
- P Power BI là gì? Vì sao doanh nghiệp nên sử dụng PBI?
- K KICC HCMC x TOPDEV – Bước đệm nâng tầm sự nghiệp cho nhân tài IT Việt Nam
- T Trello là gì? Cách sử dụng Trello để quản lý công việc
- T TOP 10 SỰ KIỆN CÔNG NGHỆ THƯỜNG NIÊN KHÔNG NÊN BỎ LỠ
- T Tìm hiểu Laptop AI – So sánh Laptop AI với Laptop thường
- M MySQL vs MS SQL Server: Phân biệt hai RDBMS phổ biến nhất
- S SearchGPT là gì? Công cụ tìm kiếm mới có thể đánh bại Google?