Introduction
Trong bài viết này chúng ta sẽ học cách sử dụng React datepicker trong ứng dụng React. Tìm hiểu từ cơ bản đến 1 trường hợp củ thề là hotel booking component sử dụng React-Datepicker.
React-datepicker là một thư viện phổ biến nhất cho các dự án React, thư viện này hiện có khoảng trên 700.000 lượt donwload.
Prequisities
Trong hướng dẫn này bạn sẽ cần biết Javascript & React cơ bản. Bước đầu tiên của bước cấu hình là cài đặt create-react-app globally.
npm i -g create-react-app
Sau đó create-react-app đã được cài đặt, chúng ta sẽ cần tạo mới ứng dụng với thư viện. Bạn có thể sử dụng cmd sau:
npx create-react-app datepicker-app
Sau đó, sau khi tạo ứng dụng thành công, hãy vào thư mục dự án, cài đặt gói yêu cầu và bắt đầu dự án.
// go to the project folder
cd datepicker-app
// install the required package
npm i --save react-datepicker
npm i --save moment
// start the project
npm start
Basic Implementation: Default
Trước khi bắt đầu chúng ta cần đặt CSS file trong ứng dụng. Chèn mã sau vào ứng dụng của bạn. Về cơ bản bạn có thể đặt bất kỳ đâu trong ứng dụng. Trong ứng dụng này chúng ta sẽ đặt trong file app.js
// import required react-datepicker styling file
import "react-datepicker/dist/react-datepicker.css";
Sau đó chúng ta import DatePicker component từ react-datepicker. Các sự kiện mà chúng ta sẽ cần là selected & onchange
selected lấy giá trị ngày tháng để biểu thị giá trị component. Trong khi onchange hoạt động là 1 hàm xử lý thay đổi selected giá trị.
onChange function lấy giá trị và chúng ta cần lầm là thay đổi giá trị của selected date được chọn. Cập nhật file App.js như sau:
// import React and DatePicker
import React, { useState } from "react";
import DatePicker from "react-datepicker";
// import required css from library
import "react-datepicker/dist/react-datepicker.css";
// main implementation. using selected and onChange as main props to get and change the selected date value
const App = () => {
const [startDate, setStartDate] = useState(new Date());
return (
<DatePicker
selected={startDate}
onChange={date => setStartDate(date)}
/>
);
};
export default App;
Basic Implementation: Time Picker
Chúng ta có thể sử dụng component time-picker bởi showTimeSelect props. Times sẽ hiển thị khoảng 30 phút theo mặc
định. Chúng ta có thể chúng ta có thể dịnh dạng ngày sẽ hiển thị như thế nào theo dateFormat props. Trong trường hợp này chúng ta muốn hiển thị
trong component. Hảy sử dụng dateFormat="Pp". Chúng ta sẽ thay đổi App.js
// import React and DatePicker
import React, { useState } from "react";
import DatePicker from "react-datepicker";
// import required css from library
import "react-datepicker/dist/react-datepicker.css";
// time-picker component. using showTimeSelect as a main props and works with basic functionality on react-datepicker that explained above
const App = () => {
const [startDate, setStartDate] = useState(new Date());
return (
<DatePicker
selected={date}
onChange={handleDateChange}
showTimeSelect
dateFormat="Pp"
/>
);
};
export default App;
Month & Year Picker
Ngoài date & time, khả năng chọn a month & year is một điều quan trọng cần có ở đây. component này cũng có tính năng chọn month & year.
Chỉ cần đảm bảo rằng chúng ta sử dụng đúng định dạng dateFormat ddeerr tối ưu các tính năng thay đổi App.js như sau:
// import React and DatePicker
import React, { useState } from "react";
import DatePicker from "react-datepicker";
// import required css from library
import "react-datepicker/dist/react-datepicker.css";
// time-picker component. using showTimeSelect as a main props and works with basic functionality on react-datepicker that explained above
const App = () => {
const [startDate, setStartDate] = useState(new Date());
return (
<>
// month picker implementation. using showMonthYearPicker as a main props
<DatePicker
selected={date}
onChange={handleDateChange}
showMonthYearPicker
dateFormat="MM/yyyy"
/>
// month picker implementation. using showYearPicker as a main props
<DatePicker
selected={date}
onChange={handleDateChange}
showYearPicker
dateFormat="yyyy"
/>
</>
);
};
Advanced Example: Booking Hotel Date-Picker
Chúng ta sẽ tạo một bộ chọn ngày đặt booking hotel date-picker component using react-datepicker. Mục tiêu là xây dựng 2
react-datepicker components làm cho cả 2 được kết nối làm ngày nhận trả phòng, sau đó hiển thị các ngày đã chọn.
Đầu tiên tất cả những gì chúng ta cần làm là tạo component for check-in and check-out. Chúng ta sẽ sử dụng minDate props để đặt giới hạn ngày tối thiểu cho người dùng.
Đặt mã này bên trong tệp App.js của bạn tại phần trả lại:
// import React
import React, { useState } from "react";
...
...
return (
<div className="input-container">
<div>
<label>Check-in</label>
<DatePicker
selected={checkInDate}
minDate={new Date()}
onChange={handleCheckInDate}
/>
</div>
<div>
<label>Check-out</label>
<DatePicker
selected={checkOutDate}
minDate={checkInDate}
onChange={handleCheckOutDate}
/>
</div>
</div>
)
...
Cách đoạn mã trên xác định minDate. Đối với check-in component nó chỉ đơn giản là sử dụng dữ liệu hiện tại làm minDate, Người dùng không thể chọn được ngày trước ngày hôm nay. Và đối với thành phần thanh toán, chúng ta có thể xử dụng.
checkInDate value, có nghĩa là người dùng không thể chọn 1 ngày trươc ngày nhận phòng.
Bước tiếp theo sẽ là xác định cách chúng ta sẽ lưu giá trị vào trạng thái của mình và cách hoạt động của mỗi hàm thay đổi.
Đối với điều này, ý tưởng chính là chỉ cần tạo một trạng thái cho mỗi checkInDate and checkOutDate iá trị và lưu ngày ở đóập.
Sự khác biệt duy nhất là minDate của check-out component sẽ phụ thuộc vào checkInDate value, chúng ta cần phải thiết lại checkOutDate bất cứ khi nào checkIndate thay đổi. Vậy bạn cần update App.js
// import React
import React, { useState } from "react";
...
const App = () => {
// define check-in and check-out state
const [checkInDate, setCheckInDate] = useState(null);
const [checkOutDate, setCheckOutDate] = useState(null);
// define handler change function on check-in date
const handleCheckInDate = (date) => {
setCheckInDate(date);
setCheckOutDate(null);
};
// define handler change function on check-out date
const handleCheckOutDate = (date) => {
setCheckOutDate(date);
};
...
Phần cuối cùng là chúng ta cần hiển thị tóm tắt của đặt phòng. Nó sẽ chỉ được hiển thị khi cả ngày check-in and check-out date có giá trị. Đối vơi trường hợp này chúng ta sử moment.js để định dạng date. Cập nhật file App.js
// import React
import React, { useState } from "react";
...
return(
...
// summary secton
{checkInDate && checkOutDate && (
<div className="summary">
<p>
You book a hotel from {moment(checkInDate).format("LL")} to{" "}
{moment(checkOutDate).format("LL")}.
</p>
</div>
)}
...
)
...
Code hoàn chỉnh file App.js
import React, { useState } from "react";
import DatePicker from "react-datepicker";
import moment from "moment";
import "./App.css";
import "react-datepicker/dist/react-datepicker.css";
function App() {
const [checkInDate, setCheckInDate] = useState(null);
const [checkOutDate, setCheckOutDate] = useState(null);
const handleCheckInDate = (date) => {
setCheckInDate(date);
setCheckOutDate(null);
};
const handleCheckOutDate = (date) => {
setCheckOutDate(date);
};
return (
<div className="App">
<div className="input-container">
<div>
<label>Check-in</label>
<DatePicker
selected={checkInDate}
minDate={new Date()}
onChange={handleCheckInDate}
/>
</div>
<div>
<label>Check-out</label>
<DatePicker
selected={checkOutDate}
minDate={checkInDate}
onChange={handleCheckOutDate}
/>
</div>
</div>
{checkInDate && checkOutDate && (
<div className="summary">
<p>
You book a hotel from {moment(checkInDate).format("LL")} to{" "}
{moment(checkOutDate).format("LL")}.
</p>
</div>
)}
</div>
);
}
export default App;
File styles App.css
.App {
text-align: center;
height: 100vh;
flex: 1;
justify-content: center;
align-items: center;
padding: 40px;
}
.input-container {
display: flex;
flex-direction: row;
justify-content: center;
align-items: center;
}
.input-container .react-datepicker-wrapper {
margin: 12px 0;
width: 100%;
}
.input-container .react-datepicker-wrapper input {
padding: 4px 12px;
}
.summary {
font-size: 18px;
}
Conclusion
Bây giờ chúng ta biết cách sử dụng react-datepicker trong ứng dụng của mình. Sau khi làm theo hướng dẫn của bài viết này chúng ta có thể tái sử dựng cho các dự án tiếp theo.
References
https://www.npmjs.com/package/react-datepicker
https://codesource.io/complete-react-datepicker-tutorial-with-examples/