U programiranju, od ključnog je značaja da se kod organizuje na način koji omogućava njegovu ponovnu upotrebu kad god je to moguće. Dupliranje koda može dovesti do nepotrebnog povećanja veličine koda i komplikovati proces pronalaženja i ispravljanja grešaka, naročito u složenijim aplikacijama.
Vue.js olakšava ponovnu upotrebu koda zahvaljujući takozvanim „composable“ funkcijama. Composables su funkcije koje enkapsuliraju određenu logiku i mogu se primeniti u različitim delovima projekta za upravljanje sličnim funkcionalnostima.
Da li su composables uvek postojali?
Pre nego što je Vue 3 uveo composable komponente, koristili su se mixini kao sredstvo za ponovnu upotrebu koda u različitim delovima aplikacije. Mixini su sadržali Vue.js opcije kao što su podaci, metode i hook-ovi životnog ciklusa, omogućavajući tako ponovnu upotrebu koda kroz više komponenti.
Za kreiranje mixina, oni su se organizovali u posebne datoteke i zatim primenjivali na komponente dodavanjem mixina svojstvu „mixins“ unutar objekta opcija komponente. Na primer:
export const formValidationMixin = { data() { return { formData: { username: '', password: '', }, formErrors: { username: '', password: '', }, }; }, methods: { validateForm() { this.formErrors = {}; if (!this.formData.username.trim()) { this.formErrors.username="Korisničko ime je obavezno."; } if (!this.formData.password.trim()) { this.formErrors.password = 'Lozinka je obavezna.'; } return Object.keys(this.formErrors).length === 0; }, }, };
Ovaj isječak koda ilustruje mixin za validaciju formi. Ovaj mixin sadrži dva svojstva podataka — `formData` i `formErrors` — inicijalno postavljena na prazne vrednosti.
`formData` služi za čuvanje unetih podataka iz forme, uključujući polja za korisničko ime i lozinku, koja su inicijalizovana kao prazna. `formErrors` prati ovu strukturu kako bi se u njemu zadržale potencijalne poruke o greškama, takođe inicijalno prazne.
Mixin takođe sadrži metodu, `validateForm()`, koja proverava da li su polja za korisničko ime i lozinku popunjena. Ukoliko je bilo koje od polja prazno, `formErrors` svojstvo se popunjava odgovarajućom porukom o grešci.
Metoda vraća `true` ako je forma validna, odnosno ako je `formErrors` prazan. Mixin se može koristiti uvoženjem u Vue komponentu i dodavanjem svojstvu `mixins` u Options objektu:
<template> <div> <form @submit.prevent="submitForm"> <div> <label for="username">Korisničko ime:</label> <input type="text" id="username" v-model="formData.username" /> <span class="error">{{ formErrors.username }}</span> </div> <div> <label for="password">Lozinka:</label> <input type="password" id="password" v-model="formData.password" /> <span class="error">{{ formErrors.password }}</span> </div> <button type="submit">Potvrdi</button> </form> </div> </template> <script> import { formValidation } from "./formValidation.js"; export default { mixins: [formValidation], methods: { submitForm() { if (this.validateForm()) { alert("Forma je uspešno poslata!"); } else { alert("Molimo vas, ispravite greške u formi."); } }, }, }; </script> <style> .error { color: red; } </style>
Ovaj primer prikazuje Vue komponentu napisanu koristeći pristup Options objekta. Svojstvo `mixins` uključuje sve uvezene mixine. U ovom slučaju, komponenta koristi metodu `validateForm` iz `formValidation` mixina kako bi obavestila korisnika da li je slanje forme uspešno.
Kako koristiti Composables
Composable je samostalna JavaScript datoteka koja sadrži funkcije prilagođene specifičnim problemima ili zahtevima. Možete koristiti Vue-ov API za kompoziciju unutar composable funkcije, koristeći funkcije poput `refs` i `computed refs`.
Ovaj pristup API-ju za kompoziciju omogućava kreiranje funkcija koje se mogu integrisati u različite komponente. Te funkcije vraćaju objekat koji se lako može uvesti i koristiti u Vue komponentama kroz funkciju `setup` Composition API-ja.
Za upotrebu composable funkcije, kreirajte novu JavaScript datoteku u `src` direktorijumu vašeg projekta. Za veće projekte, razmislite o organizaciji fascikle unutar `src` i kreiranju zasebnih JavaScript datoteka za različite composable funkcije, osiguravajući da naziv svake funkcije odražava njenu namenu.
Unutar JavaScript datoteke, definišite funkciju koja vam je potrebna. Evo restrukturiranja `formValidation` mixina kao composable funkcije:
import { reactive } from 'vue'; export function useFormValidation() { const state = reactive({ formData: { username: '', password: '', }, formErrors: { username: '', password: '', }, }); function validateForm() { state.formErrors = {}; if (!state.formData.username.trim()) { state.formErrors.username="Korisničko ime je obavezno."; } if (!state.formData.password.trim()) { state.formErrors.password = 'Lozinka je obavezna.'; } return Object.keys(state.formErrors).length === 0; } return { state, validateForm, }; }
Ovaj isječak započinje uvozom `reactive` funkcije iz `vue` paketa. Zatim se kreira funkcija za izvoz, `useFormValidation()`.
Nakon toga se kreira reaktivna promenljiva, `state`, koja sadrži svojstva `formData` i `formErrors`. Isječak nastavlja sa procesom validacije forme, slično pristupu kod mixina. Na kraju, vraća promenljivu `state` i funkciju `validateForm` kao objekat.
Composable funkciju možete koristiti uvoženjem JavaScript funkcije iz datoteke u vašoj komponenti:
<template> <div> <form @submit.prevent="submitForm"> <div> <label for="username">Korisničko ime:</label> <input type="text" id="username" v-model="state.formData.username" /> <span class="error">{{ state.formErrors.username }}</span> </div> <div> <label for="password">Lozinka:</label> <input type="password" id="password" v-model="state.formData.password" /> <span class="error">{{ state.formErrors.password }}</span> </div> <button type="submit">Potvrdi</button> </form> </div> </template> <script setup> import { useFormValidation } from "./formValidation.js"; import { ref } from "vue"; const { state, validateForm } = useFormValidation(); const submitForm = () => { if (validateForm()) { alert("Forma je uspešno poslata!"); } else { alert("Molimo vas, ispravite greške u formi."); } }; </script> <style> .error { color: red; } </style>
Nakon uvoza `useFormValidation` composable funkcije, ovaj kod dekonstruiše JavaScript objekat koji vraća i nastavlja sa validacijom forme. Prikazuje poruku upozorenja u zavisnosti od toga da li je slanje forme uspelo ili je bilo grešaka.
Composables su novi mixini
Iako su mixini bili korisni u Vue 2 za ponovnu upotrebu koda, composables su ih zamenili u Vue 3. Composables pružaju strukturiraniji i održiviji pristup za ponovnu upotrebu logike u Vue.js aplikacijama, što olakšava razvoj skalabilnih web aplikacija pomoću Vue-a.