Vue er et hurtigt voksende progressivt framework til opbygning af brugergrænseflader. Det blev det JavaScript-framework med flest stjerner på GitHub og det mest stjernespækkede projekt i 2016 og 2017 på samme portal.
Oprettelse af applikationer i Vue er som sådan meget enkel, men hvis du vil bygge applikationer af god kvalitet, er du klar til lidt mere af en udfordring.
At være en del af Codesthold og ægte fortaler for Vue-teknologivil jeg gerne dele nogle Tips (ikke kopieret fra officielle Vue-dokumenter), som uden problemer vil forbedre Kode kvalitet og den ydeevne for Vue-applikationer.
Du kan finde fire regelkategorier. Vi er virkelig interesserede i tre af dem:
Væsentligt regler, der forhindrer os i at begå fejl,
Anbefalet og anbefales kraftigt regler for opretholdelse af bedste praksis - til forbedre kvaliteten og læsbarheden af koden.
Du tænker måske ... "Hvad?! Skal jeg huske alle regler?" Selvfølgelig skal du ikke det. Du kan bruge ESLint til at tage sig af de regler for dig. Du skal bare indstille alt korrekt i ESLints konfigurationsfil. Jeg foreslår, at du bruger anbefales Forudindstillet da du får et helt gratis sæt regler, der hjælper dig med at bygge apps med god praksis. Hvordan sætter man det op?
Som standard bør du finde strækker sig i ESLint-konfigurationen og erstat "plugin:vue/essential" med "plugin:vue/anbefalet"Det er alt.
Der er selvfølgelig et par regler, du skal huske, for ESLint kan ikke klare alt på egen hånd. For eksempel:
konsekvent navngivning,
navngivning af begivenheder i kebab-bogstaver,
præfiks $_navneområde_. private egenskaber i plugins, mixins osv,
enkelt filkomponent på øverste niveau elementrækkefølge.
Brug ikke flere v-if
Det kan nogle gange være nødvendigt at gøre mere end 1 element betinget, men folk skriver ofte noget i den retning:
indhold
indhold
indhold
Det er unødvendigt, fordi vi kan skrive det mere elegant:
Men hvad nu, hvis vi vil gøre det som et rodelement? I Vuekan vi ikke bruge . til dette formål. I nogle tilfælde kan indpakning i div være nok.
Det er ok, men selv om vi gerne vil, kan vi nogle gange ikke pakke elementer ind i div, for eksempel på grund af html-semantik (f.eks.
.
skal være et direkte barn af
.
eller .). Så når vi skal skrive:
(( element.navn ))
... og vi vil se en fejl som denne:
Vi kan håndtere det ved at ved hjælp af JSX og en funktionel komponentVi skal også sende en boolean, og den vil erstatte v-if.
</>
Skriv ikke api-kaldshåndteringer i komponenter
Faktisk er dette kun et af eksemplerne på, hvad man ikke bør gøre i komponenter. Gør blot, hvad der er lokalt nødvendigt i komponenternes logik. Alle metoder, der kan være eksterne, bør adskilles og kun kaldes i komponenter, f.eks. forretningslogik.
Nogle gange er det nok at bruge props, men der er også tilfælde, hvor de ikke er effektive. Det kan ske i situationer, hvor vi er nødt til at tilføje for mange props for at få komponenten til at fungere, som vi vil have det. Det simpleste eksempel kunne være en knapkomponent. Det er uden tvivl en komponent, som kan bruges overalt i en applikation. Så lad os se på en knapkomponent som denne.
(( tekst ))
På dette stadie er det en simpel komponent, som kun accepterer tekstprop. Ok, men det er måske ikke nok, da vi får brug for ikoner i knappen. I dette tilfælde skal vi tilføje yderligere 2 rekvisitter (2, fordi vi vil have mulighed for at tilføje før eller efter tekst). Så komponenten kommer til at se sådan ud:
(( tekst ))
Det er ikke dårligt, vi har kun tre rekvisitter, men...
Hvad hvis vi har brug for en belastningsindikator? Så er vi nødt til at tilføje endnu en prop. Og det er for hver eneste nye funktion! Lyder det udfordrende at holde trit med væksten i antallet af komponenter? Ja, det gør det helt sikkert!
Lad os bruge slots i stedet.
Enklere, ikke? Ok, men hvordan kan vi få funktionen med at tilføje ikoner? Det er virkelig nemt! Du skal bare bruge komponenten sådan her:
Tilbage
Næste
Nem måde at forbedre performance på
Jeg vil dele nogle tips med dig, som er virkelig nemme at implementere, så du kan få gavn af dem med det samme.
Lazy load-ruter
Nogle gange har vi ruter, der kun er tilgængelige for administratorer eller brugere med særlig adgang, og de bliver måske også besøgt mindre end andre. De er perfekte tilfælde til at bruge lazy load-ruten.
Du skal bare bruge pilfunktionen i din komponentegenskab til at returnere importfunktionen:
import PWelcome fra '@/pages/p-welcome';
export default new VueRouter (
(
tilstand: 'historie',
routes: [
(
sti: '/landing',
komponent: PWelcome, //jeg har lige importeret komponenten
navn: 'velkommen'
),
Doven indlæsning af Vue-komponenter
En lignende situation kan opstå med Vue-komponenter. Vi kan dovent importere komponenter fra en enkelt fil på denne måde:
const lazyComponent = () => import('pathToComponent.vue')
eksport standard (
komponenter: (lazyComponent )
)
// En anden syntaks
eksport standard (
komponenter: (
lazyComponent: () => import('pathToComponent.vue')
)
)
Takket være den dovne indlæsning af komponenten bliver den kun downloadet, når der anmodes om det. Hvis vi f.eks. har en komponent med v-if, vil der kun blive anmodet om den, hvis komponenten skal gengives. Så medmindre v-if-værdien er true, vil komponenten ikke blive indlæst. Derfor kan doven import også bruges til JavaScript filer.
Bonus: Når du bruger Vue CLI 3+, bliver alle dovent indlæste ressourcer forudindlæst som standard!
Brug gennemsigtige wrappers i stedet for attribut-props
Tænk på en komponent som denne:
Uden problemer kan vi bruge det sådan her:
eller
Det virker, fordi Vue giver dig mulighed for at sende html-attributter til komponenten, selv om du ikke har erklæret dem som props. Html-attributterne anvendes på komponentens rodelement (input i dette tilfælde).
Problemet opstår, når vi vil udvide vores inputkomponent, da den kunne se sådan ud:
vil ikke fungere, som vi ønsker, fordi typen og pladsholderen vil blive anvendt på div (rodelementet), og det giver ingen mening. Så vi er nødt til at håndtere det, fordi vi ønsker at tilføje vores attributter til input-elementet. Din første tanke er måske "lad os tilføje de rekvisitter, vi har brug for!", og det vil selvfølgelig fungere, men ... hvad nu, hvis vi vil bruge type, autofuldførelse, pladsholder, autofokus, handicappede, inputmodeosv., så er vi nødt til at definere props for hver html-attribut. Personligt bryder jeg mig ikke om denne lange metode, så lad os finde noget bedre!
Vi kan bruge v-bind="$attrs" og sende attributter direkte til . uden at deklarere store mængder rekvisitter. Husk også at tilføje muligheden inheritAttrs: false for at deaktivere overførsel af attributterne til rodelementet. Lad os gå lidt videre: Hvad nu, hvis vi skal tilføje event-lyttere til dette input? Igen kan det håndteres af props eller brugerdefinerede events, men der er en bedre løsning.
Der er en ny beregnet egenskab, som returnerer komponenten til lyttere og tilføjer input-lytteren. Vi bruger det beregnede input ved blot at skrive v-on="lyttere".
Brug watcher med immediate option i stedet for den oprettede hook og watcher sammen
Vi henter ofte nogle data på en oprettet (eller monteret) hook, men så har vi brug for at hente disse data ved hver ændring af en egenskab, f.eks. den aktuelle side i en paginering. Nogle har en tendens til at skrive det ned sådan her:
.
Selvfølgelig virker det, men... Det er ikke den bedste tilgang, ikke engang en god en. Så lad os se, hvordan vi kan refaktorere dette, et eksempel på en ikke så dårlig tilgang:
.
Ovenstående version er bedre, fordi det ikke er nødvendigt med endnu en metode, vi har kun navngivet en metode, der skal kaldes på for at ændre watchedProperty.
En endnu bedre tilgang:
.
Vi er sluppet af med created-krogen. Ved at tilføje indstillingen 'immediate' får vi komponenten til at kalde fetchData-metoden umiddelbart efter observationens start (det er lidt før created-krogen og efter beforeCreated), så den kan bruges i stedet for created-krogen.
Oversigt over tips til Vue.js
Disse tips vil ikke gøre din ansøgning perfekt, men hvis du bruger dem, går det hurtigt. forbedre kvaliteten af din kode. Jeg håber også, at du vil finde noget af interesse i ovenstående eksempler.
Bemærk, at nogle af dem er blevet forenklet til artiklens formål.