Contents

วิธีการใช้ Infinite Scrolling ใน Vue

การเลื่อนไม่สิ้นสุดหรือการออกแบบ"ไร้หน้า"เป็นวิธีการขั้นสูงที่ช่วยให้สามารถนำเสนอข้อมูลเพิ่มเติมได้อย่างราบรื่นเมื่อผู้ใช้เลื่อนลงหน้าเว็บไปเรื่อยๆ ด้วยการแบ่งหน้าแบบดั้งเดิม วิธีนี้รองรับการสำรวจชุดข้อมูลจำนวนมากโดยไม่หยุดชะงัก มอบประสบการณ์การสืบค้นที่ราบรื่นและไม่สะดุด

การตั้งค่าแอปพลิเคชัน Vue ของคุณ

เพื่อให้ผ่านบทช่วยสอนนี้ได้สำเร็จ คุณต้องมีความเข้าใจเบื้องต้นเกี่ยวกับ Vue 3 และภาษาโปรแกรมพื้นฐานอย่าง JavaScript นอกจากนี้ จำเป็นต้องมีความคุ้นเคยกับการจัดการคำขอ HTTP โดยใช้ Axios

ในการเริ่มต้นกระบวนการควบคุมการใช้งานการเลื่อนแบบไม่มีที่สิ้นสุดภายในแอปพลิเคชัน Vue ให้ดำเนินการคำสั่ง npm ต่อไปนี้ในพื้นที่ทำงานที่คุณต้องการ:

 npm create vue

เมื่อเริ่มกระบวนการกำหนดค่าโครงการ Vue จะสอบถามเกี่ยวกับการเลือกเทมเพลตแอปพลิเคชัน ขอแนะนำว่าอย่าเลือกฟังก์ชันเพิ่มเติม เนื่องจากไม่จำเป็นสำหรับงานปัจจุบันที่ทำอยู่

/th/images/vue-application-setup.jpg

หลังจากสร้างแอปพลิเคชันใหม่แล้ว ให้ไปที่โฟลเดอร์และดำเนินการตามขั้นตอนการติดตั้ง npm ต่อไปนี้เพื่อรับโมดูลที่จำเป็น:

 npm install axios @iconify/vue @vueuse/core

เมื่อดำเนินการตามขั้นตอนการติดตั้ง npm จะส่งผลให้เกิดการรวมแพ็คเกจที่แตกต่างกันสามแพ็คเกจ โดยเฉพาะ Axios สำหรับอำนวยความสะดวกในการทำธุรกรรม HTTP

การใช้ Axios และ “@iconify/vue” แอปพลิเคชันนี้ดึงข้อมูลในขณะที่รวมเอาภาพสัญลักษณ์ผ่านไลบรารีดังกล่าว แพ็คเกจ “@vueuse/core” นำเสนอโมดูลยูทิลิตี้ Vue หลากหลายประเภท ได้แก่ “useInfiniteScroll” ซึ่งอำนวยความสะดวกในการเลื่อนฟังก์ชันแบบไม่จำกัดภายในอินเทอร์เฟซ

กำลังดึงข้อมูลจำลองจาก JSONPlaceholder API

หากต้องการใช้ฟังก์ชันการเลื่อนแบบไม่มีที่สิ้นสุด คุณต้องมีข้อมูล คุณสามารถฮาร์ดโค้ดข้อมูลเหล่านี้หรือรับข้อมูลจากแหล่ง API ปลอมฟรี เช่น JSONPlaceholder

การดึงข้อมูลจาก JSONPlaceholder เลียนแบบสถานการณ์จริง ซึ่งมักจะเป็นกรณีของแพลตฟอร์มบนเว็บเพื่อรับข้อมูลจากฐานข้อมูลแทนที่จะใช้ค่าที่กำหนดไว้อย่างชัดเจน

ในการดึงข้อมูลจาก Application Programming Interface (API) ภายในโครงการ Vue ให้สร้างไดเร็กทอรีใหม่ภายใต้ร่ม"src"และกำหนดให้เป็น"api"ภายในไดเร็กทอรีที่สร้างขึ้นใหม่นี้ ให้เริ่มต้นเอกสาร JavaScript ใหม่และแทรกสคริปต์อัลกอริทึมที่ตามมา:

 //getComments.js

import axios from "axios";

async function getComments(max, omit) {
  try {
    const comments = await axios.get(
      `https://jsonplaceholder.typicode.com/comments?_limit=${max}&_start=${omit}`
    );
    return comments.data.map((comment) => comment.body);
  } catch (error) {
    console.error(error);
  }
}

export default getComments;

ข้อมูลโค้ดที่ระบุมีฟังก์ชันที่ดึงความคิดเห็นจากตำแหน่งข้อมูล JSONPlaceholder API “ https://jsonplaceholder.typicode.com/comments ” การดำเนินการแบบอะซิงโครนัสนี้ตามมาด้วยการส่งออกฟังก์ชัน ซึ่งอนุญาตให้ส่วนอื่นๆ ของแอปพลิเคชันใช้ฟังก์ชันการทำงานได้

เพื่อให้ข้อมูลเชิงลึกเพิ่มเติม ข้อความที่ให้มาเกี่ยวข้องกับตัวอย่างการเขียนโปรแกรมที่ใช้ไลบรารี Axios เพื่อดึงข้อมูลจากแหล่งภายนอก โดยเฉพาะอย่างยิ่ง มันอธิบายการใช้งานฟังก์ชันชื่อ “getComments” ซึ่งยอมรับสองพารามิเตอร์ ได้แก่ “max” และ “omit” พารามิเตอร์เหล่านี้เป็นองค์ประกอบสำคัญของฟังก์ชันการทำงานของฟังก์ชัน ทำให้สามารถดำเนินการตามที่ตั้งใจไว้ภายในโปรแกรมหรือแอปพลิเคชันขนาดใหญ่ที่ฝังฟังก์ชันนั้นไว้

ฟังก์ชัน getComments รวมเมธอด axios.get() ซึ่งใช้เพื่อส่งคำขอ GET ไปยัง URL ที่กำหนดซึ่งมีพารามิเตอร์การค้นหาที่ระบุเป็น max และ omit พารามิเตอร์เหล่านี้รวมเข้ากับ URL ผ่านการใช้เทมเพลตตัวอักษรที่อยู่ใน backticks () ซึ่งจะช่วยอำนวยความสะดวกในการแทรกค่าที่เปลี่ยนแปลงแบบไดนามิกภายใน URL

ในเวลาต่อมา วิธีการนี้จะสร้างการจัดเรียงใหม่ ซึ่งครอบคลุมคลังข้อมูลของการตอบสนองที่ได้รับผ่านทางจุดสิ้นสุด API โดยวิธีการดำเนินการแมป

ในกรณีที่ตรวจพบข้อผิดพลาด ส่วนย่อยของรหัสจะบันทึกปัญหาไปยังคอนโซลเพื่อตรวจสอบเพิ่มเติม ต่อจากนั้น Code Segment จะส่งออกฟังก์ชันนี้ไปยังส่วนต่าง ๆ ของโปรแกรมของคุณเพื่อใช้งานในส่วนอื่น ๆ

การสร้างส่วนประกอบ Infinite Scroll

เมื่อพิจารณาถึงความสามารถของคุณในการจัดการการดำเนินการเชิงตรรกะที่เกี่ยวข้องกับการดึงข้อมูล ตอนนี้คุณสามารถดำเนินการสร้างองค์ประกอบใหม่ที่แสดงข้อมูลที่ได้รับและจัดการคุณลักษณะการเลื่อนแบบถาวร

ในการสร้างคอมโพเนนต์ Vue ใหม่ชื่อ “InfiniteScroll” ภายในโฟลเดอร์ “src/components” ของโปรเจ็กต์ คุณอาจทำตามขั้นตอนต่อไปนี้:1. นำทางไปยังไดเร็กทอรีรากของโปรเจ็กต์ของคุณโดยใช้ file explorer หรืออินเตอร์เฟสบรรทัดคำสั่งที่ต้องการ2. ค้นหาโฟลเดอร์ “src” และขยายหากจำเป็น3. ค้นหาโฟลเดอร์ “components” ที่มีอยู่ภายในไดเร็กทอรี “src” และสร้างใหม่หากไม่มีอยู่4. ภายในโฟลเดอร์ “components” ที่สร้างขึ้นใหม่หรือที่มีอยู่ ให้สร้างโฟลเดอร์อื่นชื่อ “InfiniteScroll”5. เปิดโฟลเดอร์ “InfiniteScroll” โดยใช้โปรแกรมแก้ไขข้อความหรือสภาพแวดล้อมการพัฒนาแบบรวม (IDE) และแทรกข้อมูลโค้ดที่ให้ไว้เป็นเนื้อหา6. บันทึกการเปลี่ยนแปลงที่ทำกับไฟล์โดยคลิกที่ปุ่มที่เหมาะสม

 <!-- InfiniteScroll.vue -->
<script setup>
import { ref } from "vue";
import getComments from "../api/getComments";
import { useInfiniteScroll } from "@vueuse/core";

const listEl = ref(null);

const commentsDisplayed = 20;
const commentsList = ref(await getComments(commentsDisplayed, 0));

const commentsToDisplayOnScroll = async () => {
  const newComments = await getComments(
    commentsDisplayed,
    commentsList.value.length
  );

  commentsList.value.push(...newComments);
};

useInfiniteScroll(
  listEl,
  async () => {
    await commentsToDisplayOnScroll();
  },
  { distance: 10 }
);
</script>

ส่วนย่อยของรหัสดังกล่าวระบุบล็อกสคริปต์ที่เกี่ยวข้องกับคอมโพเนนต์ InfiniteScroll โดยให้รายละเอียดการใช้งานและฟังก์ชันภายในบริบทการพัฒนาเว็บ

ข้อมูลโค้ดนำเข้าสองฟังก์ชัน ref และ useInfiniteScroll จากไลบรารี Vue เช่นเดียวกับ @vueuse/core นอกจากนี้ยังนำเข้าฟังก์ชัน getComments จากไฟล์แยกต่างหากที่ชื่อว่า getComments.js

จากนั้นโค้ดจะสร้างรายการที่ไม่เรียงลำดับโดยใช้ฟังก์ชัน ref โดยอ้างอิงองค์ประกอบ DOM ที่กำหนดฟังก์ชันการเลื่อนแบบไม่มีที่สิ้นสุดผ่านตัวแปร listRef

ตัวแปร commentsDisplayed หมายถึงจำนวนรายการความเห็นที่กำหนดไว้ล่วงหน้าซึ่งแสดงในตอนแรกบนหน้าเว็บ ตามลําดับ คอมโพเนนต์ commentsList ประกอบด้วยชุดคำสั่งของข้อสังเกตที่ได้รับจากฟังก์ชัน getComments

โค้ดที่ให้มาจะแนะนำกลไกการเรียกความคิดเห็น โดยใช้ฟังก์ชันแบบอะซิงโครนัสชื่อ commentsToDisplayOnScroll ซึ่งใช้ฟังก์ชัน getComments'เพื่อรับหมายเหตุเพิ่มเติมและต่อท้ายอาร์เรย์ commentsList ที่มีอยู่แล้วโดยใช้ไวยากรณ์สเปรด (… ` ).

สุดท้าย ข้อมูลโค้ดที่ให้ไว้จะเปิดใช้งานฟังก์ชันการเลื่อนแบบไม่มีที่สิ้นสุดโดยใช้ฟังก์ชัน ` useInfiniteScroll’ด้วยพารามิเตอร์สามตัว:

องค์ประกอบ DOM ซึ่งกำหนดให้เป็น “listEl” ทำหน้าที่เป็นข้อมูลอ้างอิงถึงรายการที่ผู้ใช้แอปพลิเคชันจะนำทางผ่านการเลื่อน

ขณะที่ผู้ใช้เลื่อน ฟังก์ชันแบบอะซิงโครนัสจะถูกกระตุ้นเพื่อดึงข้อมูลและเพิ่มความคิดเห็นใหม่ไปยัง commentsList

สามารถใช้อ็อบเจกต์คอนฟิกูเรชันที่เป็นทางเลือกซึ่งแสดงคุณสมบัติต่างๆ ของมันเพื่อกำหนดว่าการแสดงคำอธิบายที่กำลังจะมีขึ้นจะเริ่มขึ้นเมื่อผู้ใช้เคลื่อนที่ผ่านระยะการกระจัดในแนวนอน 10 พิกเซลเทียบกับจุดสิ้นสุดของม้วนความคิดเห็นปัจจุบัน

การใช้ส่วนประกอบ Infinite Scroll

หลังจากใช้ฟังก์ชันการเลื่อนแบบไม่จำกัดภายในส่วนสคริปต์ของคอมโพเนนต์ InfiniteScroll แล้ว จำเป็นต้องแสดงเนื้อหาที่เกี่ยวข้องภายในพื้นที่เทมเพลตของโครงสร้าง HTML ของคอมโพเนนต์

รวมข้อมูลโค้ดต่อไปนี้ไว้ในคอมโพเนนต์"InfiniteScroll":

 <!-- InfiniteScroll.vue -->
<template>
  <div>
    <ul ref="listEl">
      <li v-for="comment in commentsList">
        {{ comment }}
      </li>
    </ul>
  </div>
</template>

ส่วนรหัสปัจจุบันประกอบด้วยพิมพ์เขียวสำหรับคอมโพเนนต์ Vue.js ซึ่งได้รับมอบหมายให้ทำหน้าที่ในการแสดงภาพอาร์เรย์ของรายการคำอธิบายในลักษณะที่ใช้งานง่าย

องค์ประกอบ ทำหน้าที่รวมกลุ่มของส่วนประกอบ ซึ่งแต่ละองค์ประกอบสร้างขึ้นโดยใช้คำสั่ง v-for สำหรับการสร้างรายการ คำสั่งนี้วนซ้ำในอาร์เรย์ commentsList เพื่อสร้างแต่ละรายการภายในรายการ

ความคิดเห็นจะแสดงในองค์ประกอบรายการ โดยแต่ละการวนซ้ำจะแสดงแทนด้วยการแก้ไขข้อมูลภายในแท็ก HTML ที่สอดคล้องกัน ( {{ ความคิดเห็น }}) นอกจากนี้ การอ้างอิงขององค์ประกอบรายการที่ไม่มีลำดับถูกกำหนดให้กับองค์ประกอบ ul สำหรับการนำฟังก์ชันการเลื่อนที่ไม่สิ้นสุดไปใช้

ในการใช้ฟังก์ชันของคอมโพเนนต์ InfiniteScroll ภายในแอปพลิเคชันของคุณ ขอแนะนำให้คุณรวมมันเข้ากับไฟล์หลัก App.vue ซึ่งช่วยให้สามารถทำงานร่วมกันได้อย่างราบรื่นและมั่นใจได้ว่ากลไกการโหลดแบบใช้การเลื่อนจะถูกนำไปใช้อย่างสม่ำเสมอตลอดทั้งส่วนต่อประสานกับผู้ใช้

 <!-- App.vue -->

<script setup>
import InfiniteScroll from "./components/InfiniteScroll.vue";
import { Icon } from "@iconify/vue";
</script>

<template>
  <Suspense>
    <InfiniteScroll />
    <template #fallback>
      <Icon icon="eos-icons:bubble-loading" width="250" height="250" />
    </template>
  </Suspense>
</template>

โค้ดที่ให้มานำเข้าองค์ประกอบ React สององค์ประกอบ ได้แก่ InfiniteScroll และ Icon ซึ่งใช้ภายในองค์ประกอบ Suspense เพื่อจัดการการแสดงผลเนื้อหาแบบอะซิงโครนัส

คอมโพเนนต์ Suspense เปิดใช้งานการแสดงตัวยึดตำแหน่ง เช่น ไอคอน ในขณะที่รอการแก้ปัญหาของการดำเนินการแบบอะซิงโครนัสภายในคอมโพเนนต์ InfiniteScroll สิ่งนี้ทำได้โดยการใช้ความสามารถของ Vue ในการจัดการงานอะซิงโครนัสที่ค้างอยู่ทั้งหมดให้เสร็จสิ้นก่อนที่จะแสดงผลเอาต์พุตสุดท้าย

ตอนนี้คุณสามารถดูแอปพลิเคชันของคุณได้โดยดำเนินการคำสั่ง"npm run dev"ภายในไดเร็กทอรีของโครงการ ลักษณะที่ปรากฏควรคล้ายกับภาพประกอบด้านล่าง:

/th/images/app-preview.jpg

เมื่อคุณเลื่อนดูเนื้อหาด้านล่าง แอปพลิเคชันจะดึงคำอธิบายเพิ่มเติมแบบไดนามิกตามความคืบหน้าของคุณตามลำดับความชอบที่ได้รับจากมากไปน้อย

การใช้เทคนิคการเลื่อนไม่สิ้นสุดได้รับความโดดเด่นในแอปพลิเคชันบนเว็บที่หลากหลาย โดยเฉพาะอย่างยิ่งที่พบในแพลตฟอร์มโซเชียลมีเดียเช่น X และ TikTok

การใช้วิธีนี้ช่วยรักษาการมีส่วนร่วมของผู้ใช้โดยการดึงข้อมูลเพิ่มเติมอย่างต่อเนื่อง ดังนั้นจึงนำเสนอเนื้อหาอย่างต่อเนื่องสำหรับการอ่าน การศึกษา และการดู โดยรักษาความอยากรู้อยากเห็นและความสนใจของพวกเขาไว้

เรียนรู้การนำส่วนประกอบ Vue กลับมาใช้ใหม่ด้วยสล็อต

คุณได้รับความชำนาญในการใช้วิธีเลื่อนแบบไม่มีที่สิ้นสุดโดยใช้คอมโพเนนต์ useInfiniteScroll ของ VueUse

ในการพัฒนาเว็บไซต์ร่วมสมัย เป็นเรื่องปกติที่จะแสดงส่วนประกอบที่เหมือนกันโดยใช้เนื้อหา HTML ที่แตกต่างกัน ด้วยความเชี่ยวชาญในการใช้องค์ประกอบ Vue ซ้ำ เราสามารถรักษารูปลักษณ์ที่เหมือนกันทั่วทั้งส่วนต่างๆ ของเว็บแอปพลิเคชันได้อย่างมีประสิทธิภาพ