Cách tạo Đồng hồ đếm ngược với React Hooks

Giới thiệu

Trong này, bạn sẽ tạo đồng hồ đếm ngược bằng cách sử dụng React hooks để cập nhật trạng thái và quản lý các hiệu ứng phụ trong một thành phần React.

Với React hooks, bạn có thể tạo mã sạch hơn, logic có thể tái sử dụng giữa các thành phần và cập nhật trạng thái mà không cần lớp.

Bộ hẹn giờ đếm ngược là một thành phần giao diện người dùng phổ biến. Họ có thể thông báo cho người dùng biết họ đã làm việc gì đó bao lâu hoặc bao lâu cho đến khi một sự kiện nào đó xảy ra. Sự kiện bạn sẽ đếm ngược trong hướng dẫn này là Hacktoberfest của DigitalOcean.

Đến cuối hướng dẫn này, bạn sẽ có một đồng hồ đếm ngược chức năng và có thể sử dụng lại bằng cách sử dụng React's useState()useEffect() móc câu.

Ảnh chụp màn hình của bộ đếm thời gian hoàn thành đếm ngược đến Hacktoberfest

Điều kiện tiên quyết

Trước khi bắt đầu hướng dẫn này, bạn sẽ cần những thứ sau:

Hướng dẫn này đã được xác minh với v16.13.1, npm v8.2.0 và react v17.0.2.

Bước 1 – Tạo một dự án trống

Trong bước này, bạn sẽ tạo một dự án mới bằng Tạo ứng dụng React. Sau đó, bạn sẽ xóa dự án mẫu và các tệp liên quan được khi bạn khởi động dự án.

Để bắt đầu, hãy thực hiện một dự án mới. Trong thiết bị đầu cuối của bạn, hãy chạy tập lệnh sau để cài đặt một dự án mới bằng cách sử dụng create-react-app:

  • npx create-react-app react-hooks-timer

Sau khi dự án kết thúc, hãy thay đổi vào thư mục:

In a new terminal tab or window, start the project using the Create React App start script. The browser will auto-refresh on changes, so leave this script running while you work:

You will get a local running server. If the project did not open in a browser window, you can open it with http://localhost:3000/. Nếu bạn đang chạy điều này từ một máy chủ từ xa, địa chỉ sẽ là http://your_server_ip:3000.

Trình duyệt của bạn sẽ tải bằng một ứng dụng React được tạo bởi Create React App:

Dự án mẫu React

Bạn sẽ xây dựng một tập hợp các thành phần tùy chỉnh mới, vì vậy bạn sẽ cần bắt đầu bằng cách xóa một số mã soạn sẵn để bạn có thể có một dự án trống.

Để bắt đầu, hãy mở src/App.js trong một trình soạn thảo văn bản. Đây là thành phần gốc được đưa vào trang. Tất cả các thành phần sẽ bắt đầu từ đây. Bạn có thể tìm thêm thông tin về App.js tại Cách thiết lập một dự án React với Tạo ứng dụng React.

Mở src/App.js bằng lệnh sau:

You will see a file like this:

react-hooks-timer/src/App.js

import React from 'react';
import logo from './logo.svg';
import './App.css';

function App() {
  return (
    <div className="App">
      <header className="App-header">
        <img src={logo} className="App-logo" alt="logo" />
        <p>
          Edit <code>src/App.js</code> and save to reload.
        </p>
        <a
          className="App-link"
          href="https://reactjs.org"
          target="_blank"
          rel="noopener noreferrer"
        >
          Learn React
        </a>
      </header>
    </div>
  );
}

export default App;

Sau đó, thay thế mọi thứ trong return câu lệnh để trả về một tập hợp <div> các thẻ. Điều này sẽ cung cấp cho bạn một trang hợp lệ mà không trả lại gì. Mã cuối cùng sẽ giống như sau:

react-hooks-timer / src / App.js

import React from 'react';
import logo from './logo.svg';
import './App.css';

function App() {
  return (
    <div>
    </div>
  )
}

export default App;

Tiếp theo, loại bỏ logo. Xóa dòng import logo from './logo.svg';.

Lưu và thoát khỏi trình soạn thảo văn bản.

Cuối cùng, xóa logo vì bạn sẽ không sử dụng nó trong ứng dụng này. Bạn nên xóa các tệp không sử dụng khi làm việc để tránh nhầm lẫn.

Trong cửa sổ dòng lệnh nhập lệnh sau:

Now that the project is set up, you can create your first component.

Step 2 — Calculating How Much Time is Left

In this step, you will create a function that calculates the time remaining between the current date and the first day of Hacktoberfest.

First, set up a function called calculateTimeLeft:

react-hooks-timer / src / App.js

// ...

const calculateTimeLeft = () => {

};

// ...

Tiếp theo, bên trong hàm, bạn sẽ sử dụng JavaScript Date đối tượng để tìm hiện tại year.

Tạo một biến có tên là year được đặt thành JavaScript date phương pháp Date.getFullYear().

Thêm mã sau vào bên trong calculateTimeLeft chức năng:

Xem tiếp:   Cách tải và Cài đặt lại Realtek HD Audio Manager trong Windows

react-hooks-timer / src / App.js

// ...

const calculateTimeLeft = () => {
  let year = new Date().getFullYear();
}

// ...

Ghi chú: Bạn có thể sử dụng JavaScript Date đối tượng để làm việc với ngày và giờ.

Các Date.getFullYear() phương thức sẽ lấy năm hiện tại.

Bây giờ bạn có thể sử dụng biến này để tính toán sự khác biệt giữa ngày hiện tại và ngày đầu tiên của Hacktoberfest.

Bên trong calculateTimeLeft , hãy thêm một biến mới được gọi là difference. Đặt nó bằng một cái mới Date đối tượng có mã sau:

react-hooks-timer / src / App.js

// ...

const calculateTimeLeft = () => {
  let year = new Date().getFullYear();

  const difference = +new Date(`10/01/${year}`) - +new Date();
}

// ...

Các + trước cái mới Date đối tượng là cách viết tắt để ra lệnh cho JavaScript truyền đối tượng dưới dạng số nguyên, cung cấp cho bạn dấu thời gian Unix của đối tượng được biểu thị dưới dạng micro giây kể từ kỷ nguyên.

Ghi chú: Đối với hướng dẫn này, hãy đảm bảo ngày bạn đếm ngược được đặt trong tương lai, nếu không bạn sẽ gặp lỗi.

Để giữ cho mã có thể sử dụng lại được, bạn sử dụng một mẫu JavaScript Literal và thêm vào year biến cùng với tháng và ngày của Hacktoberfest. Hacktoberfest bắt đầu vào ngày 1 tháng 10 hàng năm. Khi bạn sử dụng year thay cho một năm được mã hóa cứng, bạn sẽ luôn có năm hiện tại.

Bây giờ bạn đã tính được tổng số mili giây cho đến khi đồng hồ đếm ngược hết hạn, bạn cần chuyển đổi số mili giây thành một thứ gì đó thân thiện hơn và con người dễ đọc hơn.

Bước 3 - Định dạng thành Ngày, Giờ, Phút và Giây

Trong bước này, bạn sẽ tạo một đối tượng trống có tên là timeLeft, sử dụng một if để kiểm tra xem còn thời gian hay không và tính tổng số giờ, phút và giây bằng cách sử dụng toán học và môđun (%) nhà điều hành. Cuối cùng, bạn sẽ trả lại timeLeft.

Đầu tiên, tạo đối tượng trống có tên timeLeft sau đó sẽ được điền ngày, giờ, phút và giây trong if bản tường trình.

Thêm mã sau vào bên trong calculateTimeLeft chức năng:

react-hooks-timer / src / App.js

// ...

const calculateTimeLeft = () => {
  let year = new Date().getFullYear();
  let difference = +new Date(`10/01/${year}`) - +new Date();

  let timeLeft = {};
}

// ...

Bây giờ hãy tạo một if tuyên bố sẽ so sánh difference để xem liệu nó có lớn hơn 0.

Thêm mã này vào bên trong calculateTimeLeft chức năng:

react-hooks-timer / src / App.js

// ...

const calculateTimeLeft = () => {
  let year = new Date().getFullYear();
  let difference = +new Date(`10/01/${year}`) - +new Date();

  let timeLeft = {};

  if (difference > 0) {
    timeLeft = {
      days: Math.floor(difference / (1000 * 60 * 60 * 24)),
      hours: Math.floor((difference / (1000 * 60 * 60)) % 24),
      minutes: Math.floor((difference / 1000 / 60) % 60),
      seconds: Math.floor((difference / 1000) % 60)
    };
  }
}

// ...

Trong mã này, bạn làm tròn các số từ ngày, giờ, phút và giây xuống và giảm phần còn lại để nhận được một giá trị số nguyên. Sau đó, bạn có thể so sánh difference để xem liệu nó có lớn hơn 0.

Cuối cùng, bạn cần trở lại timeLeft để bạn có thể sử dụng giá trị ở nơi khác trong thành phần.

Thêm mã này vào bên trong calculateTimeLeft chức năng:

react-hooks-timer / src / App.js

// ...

const calculateTimeLeft = () => {
  let year = new Date().getFullYear();
  let difference = +new Date(`10/01/${year}`) - +new Date();

  let timeLeft = {};

  if (difference > 0) {
    timeLeft = {
      days: Math.floor(difference / (1000 * 60 * 60 * 24)),
      hours: Math.floor((difference / (1000 * 60 * 60)) % 24),
      minutes: Math.floor((difference / 1000 / 60) % 60),
      seconds: Math.floor((difference / 1000) % 60)
    };
  }

  return timeLeft;
}

// ...

Bây giờ bạn đã tạo một chức năng tính toán thời gian còn lại cho đến Hacktoberfest, bạn có thể thêm vào trạng thái ứng dụng sẽ kiểm soát và cập nhật bộ đếm thời gian của bạn.

Xem tiếp:   Cách sử dụng Terraform với nhóm của bạn

Bước 4 - Cập nhật Trạng thái ứng dụng của bạn với useStateuseEffect

Với React Hooks, bạn có thể thêm khả năng quản lý trạng thái vào các thành phần chức năng hiện có mà không cần chuyển đổi chúng thành một lớp.

Trong bước này, bạn sẽ nhập useStateuseEffect móc từ React để quản lý trạng thái trong thành phần này.

Ở trên cùng của App.js tập tin, thêm useStateuseEffect trong câu lệnh nhập của bạn:

react-hooks-timer / src / App.js

import React, { useEffect, useState } from "react";

// ...

Mã này cho React biết rằng bạn muốn sử dụng các hook cụ thể này và chức năng của chúng có sẵn từ React.

Để làm cho đồng hồ đếm ngược hoạt động, bạn sẽ cần thiết lập phương pháp thời gian còn lại mà chúng tôi đã mã hóa trước đó để cập nhật trạng thái:

Thêm mã này sau calculateTimeLeft chức năng:

react-hooks-timer / src / App.js

// ...

const [timeLeft, setTimeLeft] = useState(calculateTimeLeft());

// ...

Cú pháp JavaScript này được gọi là cấu trúc mảng.

Các useState phương thức chấp nhận một tham số để thiết lập trạng thái ban đầu và trả về một mảng chứa trạng thái hiện tại và một hàm để thiết lập trạng thái.

timeLeft sẽ mang theo đối tượng khoảng thời gian còn lại của chúng ta và cung cấp cho chúng ta một phương pháp để thiết lập trạng thái. Khi tải thành phần, timeLeft giá trị được đặt thành giá trị bên trái thời gian hiện tại.

Tiếp theo, bạn sẽ sử dụng useEffect móc để đối phó với các tác dụng phụ của thành phần.

Ghi chú: MỘT tác dụng phụ là bất cứ điều gì ảnh hưởng đến một cái gì đó bên ngoài phạm vi của hàm đang được thực thi.

Trong giải pháp này, bạn sẽ sử dụng setTimeout phương pháp bên trong của useEffect cái móc. setTimeout và tương tự setInterval phương thức là các mẫu React phổ biến khi được sử dụng bên trong useEffect cái móc.

Hầu hết các hành vi không đồng bộ như setTimeout phương thức trong React được định nghĩa với sự kết hợp của useEffectuseState móc câu.

Ghi chú: Bạn có thể đọc thêm về thời điểm và cách sử dụng các phương pháp như setTimeoutsetInterval trong phần này của Tài liệu React.

Thêm mã này sau useState() chức năng:

react-hooks-timer / src / App.js

// ...

const [timeLeft, setTimeLeft] = useState(calculateTimeLeft());

useEffect(() => {
  const timer = setTimeout(() => {
    setTimeLeft(calculateTimeLeft());
  }, 1000);
});

// ...

Các useEffect là những gì cập nhật lượng thời gian còn lại. Theo mặc định, React sẽ gọi lại hiệu ứng sau mỗi lần hiển thị.

Mỗi khi biến timeLeft được cập nhật ở trạng thái, useEffect đám cháy. Mỗi lần kích hoạt, chúng tôi đặt bộ hẹn giờ trong 1 giây (hoặc 1.000 mili giây), bộ hẹn giờ sẽ cập nhật thời gian còn lại sau khi thời gian đó trôi qua.

Chu kỳ sẽ tiếp tục mỗi giây sau đó.

Để giúp loại bỏ khả năng hết thời gian chờ xếp chồng và gây ra lỗi, hãy thêm clearTimeout phương pháp bên trong useEffect móc cũng vậy.

Thêm một clearTimeout và truyền vào bộ định thời biến dưới dạng một tham số:

react-hooks-timer / src / App.js

// ...

useEffect(() => {
  const timer = setTimeout(() => {
    setTimeLeft(calculateTimeLeft());
  }, 1000);

  return () => clearTimeout(timer);
});

// ...

Các return chức năng chạy mỗi khi useEffect chạy timer ngoại trừ lần chạy đầu tiên của thành phần và sẽ xóa hết thời gian chờ nếu thành phần đó được ngắt kết nối.

Bây giờ trạng thái của bạn được đặt thành calculateTimeLeft() và đang cập nhật bên trong móc hiệu ứng của bạn, nó có thể được sử dụng để xây dựng thành phần hiển thị của bạn.

Bước 5 - Sử dụng Object.keys

Trong bước này, bạn sẽ sử dụng Object.keys lặp lại timeLeft đối tượng và xây dựng một thành phần hiển thị. Bạn sẽ sử dụng thành phần hiển thị để hiển thị thời gian còn lại trước khi Hacktoberfest bắt đầu.

Xem tiếp:   Hướng dẫn tiết kiệm pin cho Iphone bạn không thể bỏ qua

Đầu tiên, hãy tạo một biến mới trong useEffect móc được gọi là timerComponents:

react-hooks-timer / src / App.js

// ...

const timerComponents = [];

// ...

Sau khi lặp lại các phím trong timeLeft, bạn sẽ sử dụng biến này để đẩy một thành phần JSX mới với thời gian còn lại.

Tiếp theo, sử dụng Object.keys lặp lại timeLeft đối tượng bạn trả lại từ của bạn calculateTimeLeft chức năng.

Thêm mã này vào timerComponents Biến đổi:

react-hooks-timer / src / App.js

// ...

const timerComponents = [];

Object.keys(timeLeft).forEach((interval) => {
  if (!timeLeft[interval]) {
    return;
  }

  timerComponents.push(
    <span>
      {timeLeft[interval]} {interval}{" "}
    </span>
  );
});

// ...

Ở đây mã lặp qua các thuộc tính của timeLeft sự vật. Nếu khoảng thời gian hẹn giờ có giá trị lớn hơn 0, nó sẽ thêm một phần tử vào timerComponents mảng.

Ghi chú: Bổ sung {" "} trong mã được sử dụng để các khoảng hiển thị thời gian còn lại không chạy vào nhau khi hiển thị trên màn hình.

Các {} cho phép bạn sử dụng JavaScript bên trong JSX của bạn và "" thêm không gian.

Bây giờ bạn đã sẵn sàng để thêm JSX mới trong các thành phần Ứng dụng return để hiển thị thời gian còn lại cho đến Hacktoberfest.

Bước 6 - Hiển thị thời gian còn lại

Trong bước này, bạn sẽ thêm các thành phần JSX vào thành phần ứng dụng return bản tường trình. Bạn sẽ sử dụng toán tử bậc ba để kiểm tra xem còn thời gian hay đã đến lúc cho Hacktoberfest,

Để sử dụng timerComponents , bạn cần kiểm tra độ dài của nó và trả lại hoặc cho người dùng biết rằng bộ hẹn giờ đã trôi qua.

Thêm mã này vào bên trong return bản tường trình:

react-hooks-timer / src / App.js

// ...

return (
  <div>
    {timerComponents.length ? timerComponents : <span>Time's up!</span>}
  </div>
);

// ...

Trong các thành phần của React JSX, bạn sử dụng toán tử bậc ba thay cho JavaScript if bản tường trình. Điều này là do chỉ các biểu thức được phép bên trong JSX.

Các timerComponents.length dòng mã kiểm tra xem có bất kỳ thứ gì bên trong timerComponents mảng và kết xuất nó nếu có, nếu không, nó hiển thị Time's up!.

Tiếp theo, bạn sẽ thêm hai thành phần JSX nữa vào return để cho người dùng biết những gì họ đang đếm ngược:

react-hooks-timer / src / App.js

// ...

return (
  <div>
    <h1>Hacktoberfest 2020 Countdown</h1>
    <h2>With React Hooks!</h2>
    {timerComponents.length ? timerComponents : <span>Time's up!</span>}
  </div>
);

// ...

Để sử dụng năm hiện tại thay vì mã hóa cứng 2020, bạn có thể tạo một biến trạng thái mới và đặt trạng thái ban đầu thành new Date().getFullYear();.

Sau lần đầu tiên useState() biến, thêm mã này:

react-hooks-timer / src / App.js

// ...

const [timeLeft, setTimeLeft] = useState(calculateTimeLeft());
const [year] = useState(new Date().getFullYear());

// ...

Phương pháp này sẽ lấy năm hiện tại như bạn đã sử dụng trong calculateTimeLeft chức năng.

Sau đó, bạn có thể xóa mã cứng 2020 từ của bạn h1 và thay thế nó bằng year:

react-hooks-timer / src / App.js

// ...

return (
  <div>
    <h1>Hacktoberfest {year} Countdown</h1>
    <h2>With React Hooks!</h2>
    {timerComponents.length ? timerComponents : <span>Time's up!</span>}
  </div>
);

// ...

Điều này sẽ hiển thị biến trạng thái của bạn, biến này sẽ luôn có năm hiện tại. Dự án đã hoàn thành của bạn sẽ trông như thế này:

Đã hoàn thành bộ đếm thời gian đếm ngược đến Hacktoberfest

Kiểm tra kho lưu trữ GitHub này để xem mã đầy đủ.

Sự kết luận

Trong hướng dẫn này, bạn đã xây dựng một thành phần giao diện người dùng đếm ngược bằng cách sử dụng useStateuseEffect móc để quản lý và cập nhật trạng thái ứng dụng của bạn.

Từ đây, bạn có thể tiếp tục việc học của mình với việc tạo kiểu các thành phần React để tạo giao diện người dùng đếm ngược hấp dẫn hơn.

Bạn cũng có thể theo dõi toàn bộ loạt bài Cách viết mã trong React.js trên DigitalOcean để tìm hiểu thêm về cách phát triển với React.

.

Check Also

Cách cung cấp các ứng dụng Flask với Gunicorn và Nginx trên Ubuntu

Giới thiệu Trong hướng dẫn này, bạn sẽ xây dựng một ứng dụng Python bằng …