Derulați până sus în Vue cu componente reutilizabile PlatoBlockchain Data Intelligence. Căutare verticală. Ai.

Derulați până sus în Vue cu componente reutilizabile

În îmbunătățirea experienței utilizatorului pe orice site web cu mult conținut pe paginile sale web, este obișnuit ca dezvoltatorii de front-end să implementeze o funcționalitate de defilare în sus prin intermediul unui buton, pentru a face lucrurile mai plăcute și mai convenabile pentru utilizatori.

În timp ce utilizatorii pot folosi comanda + săgeata sus de pe o tastatură, este, de asemenea, important să țineți cont de faptul că potențial mai mult de jumătate dintre utilizatorii dvs ar putea folosi dispozitive mobile și nu va folosi o tastatură conectată la telefonul lor în timp ce navighează prin site-ul dvs. web. Ecranele mai mici necesită adesea, de asemenea, o derulare mai mare, făcând navigarea de jos în sus laborioasă.

În acest ghid, vom implementa un buton de derulare în sus folosind Vue 3 – pas cu pas. Pe lângă componenta reutilizabilă, vom construi o aplicație de știri care oferă știri de ultimă oră din diverse surse cu News API.

Cod sursa: Ca de obicei, puteți modifica codul sursă găzduit pe GitHub.

Configurare proiect

Începerea cu framework-ul Vue.JS este simplă ca includerea unui fișier JavaScript într-un fișier HTML. Dar pentru o aplicație reală și pe scară largă, vue-cli este cel mai bun mod de a începe! Vom folosi vue-cli în tutorialul nostru de astăzi.

Să creăm proiectul și să-i denumim vue-scroll-to-top, folosind comanda de mai jos:

$ vue create vue-scroll-to-top

Acest lucru creează un șablon pentru a începe construirea proiectului nostru. Puteți începe aplicația trecând în proiect:

$ cd vue-scroll-to-top

Și serve cu fire sau NPM:

$ yarn serve

Sau:

$ npm run serve

On localhost, în port 8080 – cererea dumneavoastră va fi comunicată:

Derulați până sus în Vue cu componente reutilizabile PlatoBlockchain Data Intelligence. Căutare verticală. Ai.

Construirea Componentelor

Odată cu șablonul rotit – putem începe să construim componenta reutilizabilă de defilare în sus, care se generalizează la orice aplicație pe care doriți să o construiți. Înainte de a defini componenta, să pregătim și să curățăm App.vue starter pe care l-am creat cu Vue CLI.

Curățarea proiectului Vue

În src/App.vue, vom înregistra componenta care va fi în curând ca 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>

Crearea interfeței de utilizare pentru buton

Cu pagina care va afișa butonul (și știrile) – putem începe construirea componentelor. Să începem cu butonul!

În components folder, creați un AppButton.vue fişier. În buton, vom include o pictogramă care semnifică Săgeata în sus pentru a transmite vizual funcționalitatea. Pentru pictograma în sine, vom folosi o bibliotecă de pictograme numită Font Awesome care are peste 19.000 de pictograme peste 6 stiluri și mărci, deși aceasta poate fi înlocuită cu un simplu semn caret (^), o pictogramă personalizată sau o pictogramă din alte biblioteci dacă nu doriți să introduceți o altă dependență.

Folosind managerul de dependențe preferat, instalați pachetul de bază care conține toate utilitățile pentru a face pictogramele să funcționeze:

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

În continuare, vom instala pictograme SVG solide gratuite (unul dintre multiplele „seturi” sau stiluri disponibile), folosind următoarea comandă:

Consultați ghidul nostru practic și practic pentru a învăța Git, cu cele mai bune practici, standarde acceptate de industrie și fisa de cheat incluse. Opriți căutarea pe Google a comenzilor Git și de fapt învăţa aceasta!

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

Și, în sfârșit, vom instala Font Awesome Vue Component pentru Vue 3, folosind următoarea comandă:

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

Înainte de a ne reda pictograma în butonul nostru, trebuie să importam dependențele instalate Font Awesome în proiectul nostru, inclusiv numele pictogramei pe care vrem să îl folosim. Să actualizăm main.js fișier:

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')

Acum putem apela pictograma săgeată în sus, ca faArrowUp, În AppButton.vue pentru a-l reda în UI! De asemenea, putem stila butonul din fișierul component:

<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>

Pe DOM, butonul nostru de derulare în sus ar trebui să arate astfel, atunci când deschideți aplicația localhost:8080:

imagine

Crearea interfeței de utilizare a fluxurilor de știri

Pentru a crea un mediu în care un utilizator ar putea dori să folosească butonul, în loc să deruleze manual – haideți să aducem o mulțime de conținut de știri din API-ul gratuit Știri. Pentru a face cereri de preluare, vom profita de axios pachet.

Dacă nu îl aveți deja instalat, puteți face acest lucru prin Yarn sau NPM:

$ yarn add axios
# Or
$ npm install axios

Pentru a utiliza API-ul Știri, va trebui să înregistrați un cont – pentru a obține o cheie API care este gratuită pentru mediile de dezvoltare. Pentru această demonstrație, vom păstra lucrurile simple, preluând doar toate articolele despre, de exemplu, Bitcoin. În components folder, să creăm un fișier nou numit NewsList.vue. În NewsList.vue, vom construi o listă de articole de știri Bitcoin pe care le-am primi ca răspuns de la API.

NewsList.vue ar trebui să includă acum următoarele coduri:

<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>

Apoi, ne asigurăm că actualizăm App.vue, astfel încât să poată fi afișată lista articolelor de știri:

<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>

De obicei – ai dori să paginați rezultatele, în loc să le adunați. Cu toate acestea, creăm în mod specific un caz în care un derulare în sus este util.

Afișați/Ascundeți butonul de derulare la partea de sus utilizând Scroll Listener

Ca parte a unei experiențe captivante pentru utilizator, să ne asigurăm că butonul de derulare în sus este dezvăluit numai atunci când utilizatorul începe să deruleze în jos pe pagină.

Pentru a realiza acest lucru, trebuie să ascultăm evenimentul de defilare în momentul în care un utilizator derulează în jos pe pagină.

Mai întâi, să țintim elementul butonului setând o referință la acesta. Apoi, folosim beforeUnmount() cârlige ciclului de viață pentru a adăuga și elimina butonul din DOM, cu ajutorul ascultătorului de defilare - la derularea în jos a paginii sau în partea de sus a paginii. De asemenea, putem verifica dacă un utilizator este în partea de sus a paginii dacă window.scrollY este mai mare decât 0. Cu aceasta, putem comuta vizibilitatea butonului, acolo unde este necesar.

Să actualizăm AppButton.vue componentă pentru a afișa sau ascunde butonul în funcție de cât de departe a derulat utilizatorul:

<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>

Implementarea evenimentului de defilare

Ceea ce ne rămâne în acest moment este să facem ca butonul să deruleze efectiv în partea de sus a paginii atunci când un utilizator dă clic pe el. Pentru a realiza acest lucru, să creăm un scrollToTop() metoda în AppButton.vue. Aceasta este o metodă pe care am invoca-o când window.scrollY = 0. Acum, când scrollToTop() este apelată metoda, pagina noastră derulează fără probleme până la partea de sus, iar butonul de defilare-sus-sus dispare și el:


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

Când acest fragment de cod este adăugat la AppButton.vue, veți descoperi că am implementat cu succes o funcționalitate de defilare în sus în aplicația noastră Vue, pe care o putem conecta la orice proiect în care avem nevoie de același lucru.

Concluzie

Felicitări pentru că ai urmat până la sfârșit! 🔥

În acest tutorial, ne-am uitat la cum să construim o funcționalitate de defilare în sus într-o aplicație Vue. Aceasta este o componentă generică reutilizabilă și poate fi introdusă cu ușurință și în alte proiecte.

Resurse relevante

Timestamp-ul:

Mai mult de la Stackabuse