- vừa được xem lúc

[FE] [Nuxt3] [Tip] [Network] Làm chức năng hiển thị tình trạng kết nối mạng

0 0 23

Người đăng: Tuấn Kiệt

Theo Viblo Asia

Intro

(Chức năng hiện thông báo khi đổi mạng)

Nếu các bạn xài mạng xã hội thì cũng hay gặp trường hợp mạng bị mất và xuất hiện dòng chữ thông báo về tình trạng mạng của mình ,Mục đích bài viết này chúng ta sẽ cùng nhau xem làm thử bảng thông báo như nào nhé

Lưu ý :

  • Để tránh trường hợp báo window not define đối với dự án SSR thì bạn nên thêm thẻ <ClientOnly> bọc lại nhé nhé
  • Kiểm tra trình duyệt hỗ trợ trước khi integrate vào dự án nhé 😄

Lý thuyết

Ở đây chúng ta sẽ sử dụng thuộc tính navigator của window , nó cho phép chúng ta biết được chi tiết về network của client ví dụ như tình trạng mạng, loại mạng sử dụng (2g,3g,4g..) , tốc độ tải . Các bạn có thể đọc thêm tại navigator **ở đây **

Code

Mình sẽ sử dụng Nuxt 3 để code cho phần này

Chúng ta tiến hành dựng sườn cho phần toast thông báo

// components/toasNetwork.vue <div class="toast"> <div class="content"> <div class="icon"> <i class="uil uil-wifi"/> </div> <div class="details" > <span>You're online now</span> <p>Hurray! Internet is connected.</p> </div> </div> </div>

Phần Style: Code style cho component , cũng như thêm hiệu ứng

@import url('https://fonts.googleapis.com/css2?family=Poppins:wght@200;300;400;500;600;700&display=swap');
@import url('https://unicons.iconscout.com/release/v3.0.6/css/line.css'); * { margin: 0; padding: 0; box-sizing: border-box; font-family: 'Poppins', sans-serif;
} body { overflow: hidden; background: #f2f2f2;
} .page { position: relative; min-height: 100vh; min-width: 100vw; background-image: url(https://i.ibb.co/4fMB4tr/background-demo.png); background-size: 100% auto; background-repeat: no-repeat; background-position: center -3px;
} .wrapper { position: absolute; top: 20px; left: 20px;
} @keyframes show_toast { 0% { transform: translateX(-100%); } 40% { transform: translateX(10%); } 80%, 100% { transform: translateX(20px); }
} .wrapper.hide { animation: hide_toast 1s ease forwards;
} .wrapper.show { animation: show_toast 1s ease forwards;
} @keyframes hide_toast { 0% { transform: translateX(20px); } 40% { transform: translateX(10%); } 80%, 100% { opacity: 0; pointer-events: none; transform: translateX(-100%); }
} .wrapper .toast { background: #fff; padding: 20px 15px 20px 20px; border-radius: 10px; border-left: 5px solid #2ecc71; box-shadow: 1px 7px 14px -5px rgba(0, 0, 0, 0.15); width: 430px; display: flex; align-items: center; justify-content: space-between;
} .wrapper .toast.offline { border-color: #ccc;
} .toast .content { display: flex; align-items: center;
} .content .icon { font-size: 25px; color: #fff; height: 50px; width: 50px; text-align: center; line-height: 50px; border-radius: 50%; background: #2ecc71;
} .toast.offline .content .icon { background: #ccc;
} .content .details { margin-left: 15px;
} .details span { font-size: 20px; font-weight: 500;
} .details p { color: #878787;
} .toast .close-icon { color: #878787; font-size: 23px; cursor: pointer; height: 40px; width: 40px; text-align: center; line-height: 40px; border-radius: 50%; background: #f2f2f2; transition: all 0.3s ease;
} .close-icon:hover { background: #efefef;
}

Composable : Ở đây mình sẽ tách phần logic qua Composable là useNetWork.ts để sau này có thể tái sử dụng , đây là 1 chức năng hay của Nuxt 3 mình rất thích

// Composables for Network
// composables/useNetWork.ts export default function useNetwork(timeDuration = 2000) { const navigator = window.navigator; const isOnline = ref(navigator.onLine); const isShow = ref(false); //Tiến hành xe window.addEventListener('online', () => { isOnline.value = true; }); window.addEventListener('offline', () => { isOnline.value = false; }); const hideToast = (time = 2000) => { setTimeout(() => { isShow.value = false; }, time); }; // Khi chúng ta bắt được sự kiện thay đổi mạng (isOnline) ở phía trên chúng ta sẽ tiến hành hiện popup và tắt popup theo thời gian mong muốn với timeDuration watch(isOnline, () => { //Chỗ này mình mong muốn là sẽ phải tắt thuộc tính show trước khi mở lại toast tránh trường hợp người dùng đang được mở popup sẽ ko có animation  isShow.value = false; nextTick(() => { isShow.value = true; hideToast(timeDuration); }); }); // Ở đây mình sử dụng readonly để tránh trường hợp edit được 2 trạng thái này bên ngoài , chỗ này các bạn có thể bỏ không nếu muốn  return { isOnline: readonly(isOnline), isShow: readonly(isShow) };
} 

Sau khi thêm phần logic xong thì quay lại phần template để gắn phần logic vào thôi


// components/toasNetwork.vue
<template> <div class="page"> <div :class="['wrapper', isShow ? 'show' : 'hide']"> <ClientOnly> <div :class="[{ offline: !isOnline }, 'toast']"> <div class="content"> <div class="icon"> <i :class="['uil', isOnline ? 'uil-wifi' : ' uil-wifi-slash']" ></i> </div> <div class="details" v-if="isOnline"> <span>You're online now</span> <p>Hurray! Internet is connected.</p> </div> <div class="details" v-else> <span>You're offline now</span> <p>Opps! Internet is disconnected.</p> </div> </div> </div> </ClientOnly> </div> </div>
</template> <script lang="ts" setup>
const { isOnline, isShow } = useNetwork(3000);
</script>

Vậy là xong rồi tận hưởng thành quả thôi 😄 .

Hẹn gặp lại vào các bài viết tiếp theo see ya !!

Nguồn :

HTML/CSS : https://gosnippets.com/full-screen/toast-notification-to-detect-internet-connection-in-html-css-javascript

Learnvue : https://www.youtube.com/watch?v=4M6D9_ALczY&t=209s&ab_channel=LearnVue

Bình luận

Bài viết tương tự

- vừa được xem lúc

Thủ thuật nhỏ để căn chỉnh image với object-fit

Chào các bạn,. Có lẽ trong hành trình code của các bạn thì không ít lần gặp vấn đề méo ảnh do fix cứng cả width, height của ảnh nhỉ? Hoặc kể cả khi bạn set value cho 1 thuộc tính weigth hoặc height còn thuộc tính còn lại để auto thì nhiều lúc ảnh cũng không được hiển thị toàn vẹn cho lắm.

0 0 48

- vừa được xem lúc

Tìm hiểu về CSS framework - Bulma

Mở đầu:. Mấy bữa nay đang lướt web thấy có giới thiệu framework bulma này, được mọi người giới thiệu gọn nhẹ và dễ sử dụng, nên mình mới tìm hiểu thử và hôm nay xin viết 1 bài viết giới thiệu sơ qua với các bạn.

0 0 36

- vừa được xem lúc

Một số mẹo vặt "hay ho" của ES6 có thể bạn chưa biết - Phần 4

Xin chào, ở 3 bài trước của series "Một số mẹo vặt "hay ho" của ES6", mình đã chia sẻ 1 số tips/tricks nhỏ với ES6, hy vọng ít nhiều nó sẽ có ích với các bạn khi áp dụng vào thực tế. Hôm nay, xin mời các bạn theo dõi phần 4 của series này.

0 0 46

- vừa được xem lúc

Tìm hiểu về Jest Mocks Test phía frontend

Giới thiệu. Chắc hẳn không ai phủ nhận rằng UnitTest là 1 phần quan trọng trong giai đoạn phát triển phần mềm, đảm bảo cho code được coverage tránh các bug không mong muốn.

0 0 36

- vừa được xem lúc

Convert từ SVG sang Icon Font như thế nào?

Chào các bạn. Như câu hỏi trên title của bài viết, hôm nay mình sẽ hướng dẫn các bạn cách convert 1 file svg 1 cách khá đơn giản và vô cùng tiện lợi cho các bạn. https://icomoon.io/app/#/select.

0 0 53

- vừa được xem lúc

Một vài thủ thuật làm việc với các dạng layout - Phần 4

. Chào mọi người, cũng đã lâu rồi mình không thấy nhau. Để tiếp tục với series's về các dạng layout hôm nay mình sẽ chia sẻ thêm một trick thú vị nữa về step layout.

0 0 46