قم بالتمرير إلى Top in Vue with Reusable Components PlatoBlockchain Data Intelligence. البحث العمودي. عاي.

قم بالتمرير إلى Top in Vue with Reusable Components

في تحسين تجربة المستخدم على أي موقع ويب به الكثير من المحتوى على صفحات الويب الخاصة به ، من الشائع لمطوري الواجهة الأمامية تنفيذ وظيفة التمرير لأعلى من خلال زر ، لجعل الأمور أكثر متعة وملاءمة للمستخدمين.

بينما يمكن للمستخدمين استخدام الأمر + السهم لأعلى على لوحة المفاتيح ، من المهم أيضًا مراعاة ذلك أكثر من نصف المستخدمين لديك ربما يستخدمون الأجهزة المحمولة ولن يستخدموا لوحة مفاتيح متصلة بهواتفهم أثناء التمرير عبر موقع الويب الخاص بك. تتطلب الشاشات الأصغر في كثير من الأحيان مزيدًا من التمرير ، مما يجعل التنقل من الأسفل إلى الأعلى شاقًا.

في هذا الدليل ، سنقوم بتنفيذ زر التمرير لأعلى باستخدام Vue 3 - خطوة بخطوة. إلى جانب المكون القابل لإعادة الاستخدام ، سنبني تطبيقًا إخباريًا يوفر الأخبار العاجلة من مصادر مختلفة باستخدام واجهة برمجة تطبيقات الأخبار.

كود المصدر: كالعادة ، يمكنك العبث بشفرة المصدر المستضافة على GitHub جيثب:.

إعداد مشروع

إن بدء استخدام إطار عمل Vue.JS بسيط مثل تضمين ملف JavaScript في ملف HTML. ولكن بالنسبة للتطبيق الواقعي والواسع النطاق ، فإن ملف vue-cli هي أفضل طريقة للبدء! سنستخدم ملف vue-cli في برنامجنا التعليمي اليوم.

دعونا ننشئ المشروع ونسميه vue-scroll-to-topباستخدام الأمر أدناه:

$ vue create vue-scroll-to-top

يؤدي هذا إلى إنشاء نموذج لبدء بناء مشروعنا. يمكنك بدء التطبيق بالانتقال إلى المشروع:

$ cd vue-scroll-to-top

و serve مع الغزل أو NPM:

$ yarn serve

أو:

$ npm run serve

On localhost، في الميناء 8080 - سيتم تقديم طلبك:

قم بالتمرير إلى Top in Vue with Reusable Components PlatoBlockchain Data Intelligence. البحث العمودي. عاي.

بناء المكونات

مع إنشاء القالب - يمكننا البدء في إنشاء مكون التمرير لأعلى القابل لإعادة الاستخدام ، والذي يتم تعميمه على أي تطبيق ترغب في إنشائه. قبل تحديد المكون ، دعنا نجهز ملف App.vue المبدئ الذي أنشأناه باستخدام Vue CLI.

تنظيف مشروع Vue

تحت src/App.vue، سنقوم بتسجيل المكون الذي سيصبح قريبًا باسم AppButton:

<template>
	<section class="app-container">
		<AppButton />
	</section>
</template>

<script>
import AppButton from "./components/AppButton.vue";

export default {
	name: "App",

	components: {
		AppButton
	},

	setup() {
		return {};
	}
};
</script>

<style>
@import url("https://fonts.googleapis.com/css2?family=Nunito&display=swap");
* {
	margin: 0;
	padding: 0;
	box-sizing: border-box;
	font: inherit;
}
html {
	font-family: "Nunito", sans-serif;
}
body {
	font-size: 15px;
	color: #000000;
	background: #fff;
}
h1,
h2,
h3,
h4,
h5,
h6 {
	color: #000000;
}
img {
	max-width: 100%;
}
ul {
	list-style: none;
}
a {
	text-decoration: none;
	display: inline-block;
}
.app-container {
	max-width: 82rem;
	margin: auto;
	padding: 3rem 1rem;
}
</style>

بناء زر واجهة المستخدم

بالصفحة التي ستعرض الزر (والأخبار) - يمكننا البدء في بناء المكونات. لنبدأ بالزر!

في مجلة components مجلد ، قم بإنشاء ملف AppButton.vue ملف. في الزر ، سنقوم بتضمين رمز يشير إلى ملف سهم للاعلى لنقل الوظيفة بصريًا. بالنسبة للأيقونة نفسها ، سنستخدم مكتبة أيقونات تسمى الخط رائع التي تحتوي على أكثر من 19.000 رمزًا في 6 أنماط وعلامات تجارية ، على الرغم من أنه يمكن استبدالها بعلامة إقحام بسيطة (^) ، أو رمز مخصص أو رمز من مكتبات أخرى إذا كنت لا تريد تقديم تبعية أخرى.

باستخدام مدير التبعية المفضل لديك ، قم بتثبيت الحزمة الأساسية التي تحتوي على جميع الأدوات المساعدة لجعل الرموز تعمل:

$ yarn add @fortawesome/fontawesome-svg-core
# Or
$ npm i --save @fortawesome/fontawesome-svg-core

بعد ذلك ، سنقوم بتثبيت ملف أيقونات SVG صلبة مجانية (أحد "المجموعات" أو الأنماط المتعددة المتاحة) ، باستخدام الأمر التالي:

تحقق من دليلنا العملي العملي لتعلم Git ، مع أفضل الممارسات ، والمعايير المقبولة في الصناعة ، وورقة الغش المضمنة. توقف عن أوامر Googling Git وفي الواقع تعلم ذلك!

$ yarn add @fortawesome/free-solid-svg-icons
# Or
$ npm i --save @fortawesome/free-solid-svg-icons

وأخيرًا ، سنقوم بتثبيت ملف مكون Font Awesome Vue لـ Vue 3 ، باستخدام الأمر التالي:

$ yarn add @fortawesome/[email protected]
# Or
$ npm i --save @fortawesome/[email protected]

قبل أن نتمكن من عرض الرمز الخاص بنا في زرنا ، نحتاج إلى استيراد تبعيات Font Awesome المثبتة في مشروعنا ، بما في ذلك اسم الرمز المحدد الذي نريد استخدامه. دعنا نقوم بتحديث ملف main.js ملف:

import { createApp } from 'vue'
import App from './App.vue'


import { library } from '@fortawesome/fontawesome-svg-core'

import { FontAwesomeIcon } from '@fortawesome/vue-fontawesome'

import { faArrowUp } from '@fortawesome/free-solid-svg-icons'

library.add(faArrowUp)

createApp(App).component('font-awesome-icon', FontAwesomeIcon).mount('#app')

يمكننا الآن استدعاء رمز السهم لأعلى ، مثل faArrowUp، في AppButton.vue لعرضه في واجهة المستخدم! يمكننا أيضًا تصميم الزر من ملف المكون:

<template>
  <button class="app-button">
    <font-awesome-icon icon="fa-solid fa-arrow-up" />
  </button>
</template>

<style scoped>
.app-button {
  border-radius: 50%;
  height: 50px;
  width: 50px;
  padding: 4px;
  box-shadow: 2px 2px #e9e9e9;
  cursor: pointer;
  position: fixed;
  right: 40px;
  bottom: 40px;
}
</style>

في DOM ، يجب أن يبدو زر التمرير لأعلى الخاص بنا على هذا النحو ، عند فتح التطبيق الخاص بك localhost:8080:

صورة

بناء واجهة مستخدم موجز الأخبار

لإنشاء بيئة قد يرغب المستخدم فيها في استخدام الزر ، بدلاً من التمرير يدويًا - دعنا نجلب الكثير من محتوى الأخبار من News API المجانية. لإجراء طلبات الجلب ، سنستفيد من axios الحزمة.

إذا لم يكن مثبتًا لديك بالفعل ، فيمكنك القيام بذلك عبر Yarn أو NPM:

$ yarn add axios
# Or
$ npm install axios

لاستخدام News API ، ستحتاج إلى تسجيل ملف حساب - للحصول على مفتاح API مجاني لبيئات التطوير. بالنسبة لهذا العرض التوضيحي ، سنبقي الأمور بسيطة ، بمجرد جلب جميع المقالات حول Bitcoin ، على سبيل المثال. في ال components مجلد ، فلنقم بإنشاء ملف جديد يسمى NewsList.vue. في NewsList.vue، سنقوم ببناء قائمة بمقالات أخبار Bitcoin التي سنحصل عليها كرد من API.

NewsList.vue يجب أن تتضمن الآن الرموز التالية:

<template>
  <section>
    <ul class="news-list">
      <li class="news-card" v-for="newsItem in newsList" :key="newsItem.id">
        <p><span class="heading">Title</span>: {{ newsItem.title }}</p>
        <p><span class="heading">Author</span>: {{ newsItem.author }}</p>
        <p>
          <span class="heading">Description</span>: {{ newsItem.description }}
        </p>
        <p><span class="heading">Source</span>: {{ newsItem.source.name }}</p>
      </li>
    </ul>
  </section>
</template>

<script>
import axios from "axios";
import { onMounted, ref } from "vue";

export default {
  name: "NewsList",
  setup() {
    const newsList = ref([]);

    const fetchNews = () => {
      axios
        .get(
          "https://newsapi.org/v2/everything?q=bitcoin&apiKey=94585b39692e4ea6b372bea15abf7dcc"
        )
        .then((response) => (newsList.value = response.data.articles));
    };

    onMounted(() => {
      fetchNews();
    });

    return { newsList };
  },
};
</script>

<style scoped>
ul.news-list {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 3rem;
}
ul li.news-card {
  padding: 10px;
  display: flex;
  border-radius: 8px;
  flex-direction: column;
  row-gap: 5px;
  box-shadow: 0px 4px 12px -1px rgba(120,116,120,0.79);
}
li p span.heading {
  font-weight: 600;
  font-size: 18;
}
</style>

بعد ذلك ، نتأكد من التحديث App.vue، بحيث يمكن عرض قائمة المقالات الإخبارية:

<template>
  <section class="app-container">
    <AppButton />
    <NewsList />
  </section>
</template>

<script>
import AppButton from "./components/AppButton.vue";
import NewsList from "./components/NewsList.vue";
export default {
  name: "App",
  components: {
    AppButton,
    NewsList,
  },
  setup() {
    return{}
  }
};
</script>

<style>
@import url("https://fonts.googleapis.com/css2?family=Nunito&display=swap");
* {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
  font: inherit;
}
html {
  font-family: "Nunito", sans-serif;
}
body {
  font-size: 15px;
  color: #000000;
  background: #fff;
}
h1,
h2,
h3,
h4,
h5,
h6 {
  color: #000000;
}
img {
  max-width: 100%;
}
ul {
  list-style: none;
}
a {
  text-decoration: none;
  display: inline-block;
}
.app-container {
  max-width: 82rem;
  margin: auto;
  padding: 3rem 1rem;
}
</style>

عادةً - تريد ترقيم النتائج بدلاً من تكديسها. ومع ذلك ، فإننا نقوم على وجه التحديد بإنشاء حالة يكون فيها التمرير لأعلى مفيدًا.

إظهار / إخفاء التمرير إلى الزر العلوي باستخدام Scroll Listener

كجزء من تجربة تفاعلية للمستخدم ، دعنا نتأكد من أن زر التمرير لأعلى يظهر فقط عندما يبدأ المستخدم في التمرير لأسفل الصفحة.

لتحقيق ذلك ، يتعين علينا الاستماع إلى حدث التمرير في النقطة التي يقوم فيها المستخدم بالتمرير لأسفل الصفحة.

أولاً ، دعنا نستهدف عنصر الزر بتعيين مرجع له. ثم نستفيد من ملف beforeUnmount() خطافات دورة الحياة لإضافة الزر وإزالته من DOM ، بمساعدة مستمع التمرير - عند التمرير لأسفل الصفحة أو إلى أعلى الصفحة. يمكننا أيضًا التحقق مما إذا كان المستخدم موجودًا في الجزء العلوي من الصفحة إذا كان window.scrollY أكبر من 0. باستخدام هذا ، يمكننا تبديل رؤية الزر ، عند الحاجة.

دعونا تحديث AppButton.vue مكوّن لعرض الزر أو إخفائه بناءً على مدى انتقال المستخدم:

<template>
  <button ref="appButton" class="app-button">
    <font-awesome-icon icon="fa-solid fa-arrow-up" />
  </button>
</template>

<script>
import { onMounted, ref, onBeforeMount } from "vue";
export default {
  name: "AppButton",
  setup() {
    const appButton = ref();
    const userScroll = () => {
      if (window.scrollY > 0) {
        appButton.value.classList.add("showButton");
        console.log('scrolled');
      } else {
        appButton.value.classList.remove("showButton");
        console.log('top');
      }
    };
    onMounted(() => {
      window.addEventListener("scroll", userScroll);
    });
    onBeforeMount(() => {
      window.removeEventListener("scroll", userScroll);
    });
    return { appButton };
  },
};
</script>

<style scoped>
.app-button {
  border-radius: 50%;
  height: 50px;
  width: 50px;
  padding: 4px;
  box-shadow: 2px 2px #e9e9e9;
  cursor: pointer;
  position: fixed;
  bottom: 40px;
  display: none;
  right: 40px;
}

.showButton {
  display: block;
}
</style>

تنفيذ حدث التمرير

ما تبقى لنا في هذه المرحلة هو جعل الزر يتم تمريره بالفعل إلى أعلى الصفحة عندما ينقر المستخدم عليه. لتحقيق ذلك ، دعنا ننشئ ملف scrollToTop() الطريقة في AppButton.vue. هذه طريقة كنا نستدعيها عندما window.scrollY = 0. الآن ، عندما scrollToTop() يتم استدعاء الطريقة ، يتم تمرير صفحتنا بسلاسة إلى الجزء العلوي ، ويختفي زر التمرير العلوي العلوي أيضًا:


const scrollToTop = () => {
  window.scrollTo({ top: 0, behavior: "smooth" });
};

عندما يتم إضافة هذا المقتطف من التعليمات البرمجية إلى AppButton.vue، ستجد أننا نجحنا في تنفيذ وظيفة التمرير لأعلى في تطبيق Vue الذي يمكننا توصيله بأي مشروع نحتاج إليه.

وفي الختام

تهانينا على المتابعة حتى النهاية! 🔥

في هذا البرنامج التعليمي ، نظرنا في كيفية إنشاء وظيفة التمرير لأعلى في تطبيق Vue. هذا مكون عام قابل لإعادة الاستخدام ويمكن تقديمه بسهولة في مشاريع أخرى أيضًا.

الموارد ذات الصلة

الطابع الزمني:

اكثر من ستاكابوز