window.pipedriveLeadboosterConfig = { bas: 'leadbooster-chat.pipedrive.com', företagId: 11580370, playbookUuid: '22236db1-6d50-40c4-b48f-8b11262155be', version: 2, } ;(funktion () { var w = fönster if (w.LeadBooster) { console.warn('LeadBooster finns redan') } annars { w.LeadBooster = { q: [], on: funktion (n, h) { this.q.push({ t: "o", n: n, h: h }) }, trigger: funktion (n) { this.q.push({ t: 't', n: n }) }, } } })() Förbättring av appen Vue.js. Några praktiska tips - The Codest
Codest
  • Om oss
  • Tjänster
    • Utveckling av programvara
      • Frontend-utveckling
      • Backend-utveckling
    • Staff Augmentation
      • Frontend-utvecklare
      • Backend-utvecklare
      • Dataingenjörer
      • Ingenjörer inom molntjänster
      • QA-ingenjörer
      • Övriga
    • Det rådgivande
      • Revision och rådgivning
  • Industrier
    • Fintech & bankverksamhet
    • E-commerce
    • Adtech
    • Hälsoteknik
    • Tillverkning
    • Logistik
    • Fordon
    • IOT
  • Värde för
    • VD OCH KONCERNCHEF
    • CTO
    • Leveranschef
  • Vårt team
  • Fallstudier
  • Vet hur
    • Blogg
    • Möten
    • Webbinarier
    • Resurser
Karriär Ta kontakt med oss
  • Om oss
  • Tjänster
    • Utveckling av programvara
      • Frontend-utveckling
      • Backend-utveckling
    • Staff Augmentation
      • Frontend-utvecklare
      • Backend-utvecklare
      • Dataingenjörer
      • Ingenjörer inom molntjänster
      • QA-ingenjörer
      • Övriga
    • Det rådgivande
      • Revision och rådgivning
  • Värde för
    • VD OCH KONCERNCHEF
    • CTO
    • Leveranschef
  • Vårt team
  • Fallstudier
  • Vet hur
    • Blogg
    • Möten
    • Webbinarier
    • Resurser
Karriär Ta kontakt med oss
Pil tillbaka GÅ TILLBAKA
2020-10-30
Utveckling av programvara

Förbättring av appen Vue.js. Några praktiska tips

Codest

Dominik Grzedzielski

Senior Software Engineer

Vue är ett snabbt växande progressivt ramverk för att bygga användargränssnitt. Det blev JavaScript-ramverket med flest stjärnor på GitHub och det mest stjärnmärkta projektet 2016 och 2017 på samma portal.

Skapa applikationer i Vue är i sig väldigt enkelt, men om du vill bygga applikationer av god kvalitet får du räkna med lite större utmaningar.

Att vara en del av Codest Team och en verklig förespråkare av Vue-teknikvill jag dela med mig av några Tips (inte kopierad från officiella Vue-dokument) som enkelt kommer att förbättra kod kvalitet och prestanda för Vue-applikationer.

Först och främst ska du använda Vue Style Guide och ESLint

Jag vill inte upprepa vad som redan har sagts. Det finns en stilguide i Vue-dokumenten:
Vue 2 dokument - stilguide eller
Vue 3 dokument - stilguide

Du hittar där fyra regelkategorier. Vi bryr oss verkligen om tre av dem:

  • Väsentlig regler som hindrar oss från att göra fel,
  • Rekommenderas och rekommenderas starkt regler för att behålla bästa praxis - till förbättra kvaliteten och läsbarhet av kod.

Du kanske tänker... "Va?! Måste jag komma ihåg alla regler?" Det behöver du naturligtvis inte. Du kan använda ESLint för att ta hand om dessa regler åt dig. Du behöver bara ställa in allt på rätt sätt i ESLints konfigurationsfil. Jag föreslår att du använder rekommenderas förinställd eftersom du får en helt gratis uppsättning regler som hjälper dig att bygga appar med god praxis. Hur ställer man in det?

Som standard bör du hitta förlänger nyckel i ESLint-konfigurationen och ersätt "plugin:vue/essential" med "plugin:vue/rekommenderad"Det är allt.

Naturligtvis finns det några regler som du bör komma ihåg, eftersom ESLint inte kan hantera allt på egen hand. Det gäller till exempel

  • konsekvent namngivning,
  • händelser namngivning i kebab-fall,
  • prefix $_namnområde privata egenskaper i plugins, mixins etc,
  • enstaka fil komponent högsta nivå element order.

Använd inte flera v-if

Det kan ibland vara nödvändigt att villkorligt återge mer än 1 element, men folk skriver ofta något sådant:

innehåll

innehåll

innehåll

Det är onödigt eftersom vi kan skriva det på ett mer elegant sätt:

<code> <template v-if="condition">
   <div>innehåll</div>
   <div>innehåll</div>
   <div>innehåll</div>
 </template>

Men vad händer om vi vill göra det som ett rotelement? I Vuekan vi inte använda för detta ändamål. I vissa fall kan det räcka med att linda in den i div.

Det är ok, men hur mycket vi än vill kan vi ibland inte packa in element i div, till exempel på grund av html-semantik (t.ex.

  • . måste vara ett direkt barn till
      . eller
        .). Så när vi måste skriva:

         
      1. (( objekt.namn ))
      2. ... och vi kommer att se ett fel som det här:

        Vue js kod

        Vi kan hantera det genom att med hjälp av JSX och en funktionell komponent, vi bör också skicka en boolean och den kommer att ersätta v-if.

        Skriv inte api-anropshanterare i komponenter

        Egentligen är detta bara ett av exemplen på vad man inte ska göra i komponenter. Gör bara det som är lokalt nödvändigt i komponenternas logik. Varje metod som kan vara extern bör separeras och endast anropas i komponenter, t.ex. affärslogik.

        Exempel:

        Istället för en metod som denna:

        skapad() (
        this.fetchArticles();
        ),
        metoder: (
         async hämtaArtiklar() (
          försök (
            const data = await axios.get(url);
            this.articles = data.articles;
            ) catch (e) (
            // hantera fel
            )
          )
        )

        Skriv något liknande - anropa bara rätt metod som kommer att returnera API-resultat:

         async hämta artiklar() (
           försök (
             this.articles = await ArticlesService.fetchAll();
           ) catch (e) (
             // hantera fel
           )
          )

        Använd slots istället för stora mängder rekvisita

        Ibland räcker det med att använda props, men det finns också fall då de inte är effektiva. Det kan hända i situationer där vi måste lägga till för många props för att få komponenten att fungera som vi vill att den ska göra. Det enklaste exemplet kan vara en knappkomponent. Utan tvekan är det en komponent som kan användas var som helst i en applikation. Så låt oss överväga en knappkomponent som den här.

        
        (( text ))

        I det här skedet är det en enkel komponent som bara accepterar textprop. Ok, men det kanske inte räcker eftersom vi kommer att behöva ikoner i knappen. I det här fallet måste vi lägga till ytterligare 2 rekvisita (2, eftersom vi vill ha möjlighet att lägga till före eller efter text). Så, komponenten kommer att se ut så här:

        
        (( text ))

        Det är inte illa, vi har bara tre rekvisita, men...

        Vad händer om vi behöver en laddningsindikator? Ja, då måste vi lägga till en ny prop. Och det är för varje ny funktion! Låter det utmanande att hålla jämna steg med ökningen av antalet komponenter nu? Ja, det gör det definitivt!

        Låt oss använda slots istället.

        Enklare, eller hur? Ok, men hur kan vi få funktionen för att lägga till ikoner? Det är verkligen enkelt! Använd bara komponenten så här:

        Tillbaka
        
        Nästa

        Enkelt sätt att förbättra prestandan

        Jag kommer att dela med mig av några tips som är väldigt enkla att genomföra, så att du kan dra nytta av dem direkt.

        Rutter för latent laddning

        Ibland kan vi ha rutter som endast är tillgängliga för administratörer eller användare med särskild åtkomst, och de kan också besökas mindre än andra. De är perfekta fall för att använda lazy load-rutten.

        Använd bara arrow-funktionen i din komponentegenskap för att returnera importfunktionen:

         export standard ny VueRouter (
           (
             läge: "history",
             rutter: [
               (
                 sökväg: '/landning',
                 component: () => import('../pages/p-welcome'),
                 namn: 'välkommen'
               ),
          ...

        Istället för..:

        import PWelcome från '@/pages/p-welcome';
        
        export standard ny VueRouter (
        (
        läge: 'historia',
        rutter: [
        (
        sökväg: '/landning',
        komponent: PWelcome, //just importerad komponent
        namn: 'välkommen'
        ),

        Ledig lastning Vue-komponenter

        En liknande situation kan uppstå med Vue komponenter. Vi kan importera enstaka filkomponenter på det här sättet:

        const lazyComponent = () => import('pathToComponent.vue')
        export standard (
        komponenter: (lazyComponent )
        )
        
        // En annan syntax
        export default (
        komponenter: (
        lazyComponent: () => import('pathToComponent.vue')
        )
        )

        Tack vare den lata laddningen av den komponenten laddas den bara ner när den begärs. Om vi till exempel har en komponent med v-if, kommer den endast att begäras om komponenten ska renderas. Så om inte v-if-värdet är sant kommer komponenten inte att laddas. Därför kan lazy importing också användas för JavaScript filer.

        Bonus: När du använder Vue CLI 3+ är alla resurser som laddas slarvigt prefetched som standard!

        vue js-utveckling

        Använd transparenta wrappers istället för attributprops

        Tänk på en komponent som den här:

        Utan några problem kan vi använda det så här:

        eller


        Det fungerar, eftersom Vue kan du skicka html-attribut till komponenten, även om du inte har deklarerat dem som props. HTML-attributen tillämpas på komponentens rotelement (input i det här fallet).

        Problemet uppstår när vi vill expandera vår input-komponent, eftersom den skulle kunna se ut så här:

        <code> <template>
           <div class="form-group">
             <label :for="id">(( etikett ))</label>
             <input
               :id="id"
               :value="value"
               class="base-input"
               @input="$emit('input', $event.target.value)"
             >
           </div>
         </template>

        Nu använder vi komponenten på det här sättet:

        kommer inte att fungera som vi vill, eftersom typen och platshållaren kommer att tillämpas på div (rotelement) och det är ingen mening. Så vi måste hantera det, eftersom vi vill lägga till våra attribut till inmatningselementet. Din första tanke kan vara "låt oss lägga till de rekvisita vi behöver!" och det kommer naturligtvis att fungera, men ... vad händer om vi vill använda typ, autokomplettering, platshållare, autofokus, funktionshindrad, inmatningslägeetc., så måste vi definiera props för varje html-attribut. Jag gillar personligen inte den här utdragna metoden, så låt oss leta efter något bättre!

        Vi kan ta itu med hela problemet i bara två rader.

        <template>
          <div class="form-group">
            <label :for="id">(( etikett ))</label>
            <!-- pay attention to v-bind="$attrs" -->
            <input
              :id="id"
              v-bind="$attrs"
              :value="value"
              class="base-input"
              @input="$emit('input', $event.target.value)"
            >
          </div>
        </template>
        
        <script>
        export default (
          name: 'BaseInput',
          inheritAttrs: false, // <- pay attention to this line
          props: ['value', 'label', 'id']
        );
        </script>

        Vi kan använda v-bind="$attrs" och skicka attribut direkt till utan att deklarera stora mängder rekvisita. Kom också ihåg att lägga till alternativet inheritAttrs: false för att inaktivera passering av attributen till rotelementet. Låt oss gå lite längre: tänk om vi behöver lägga till händelselyssnare till den här inmatningen? Återigen kan det hanteras av rekvisita eller anpassade händelser, men det finns en bättre lösning.

        <template>
          <div class="form-group">
            <label :for="id">(( etikett ))</label>
            <!-- pay attention to v-on="listeners" -->
            <input
              :id="id"
              v-bind="$attrs"
              :value="value"
              class="base-input"
              v-on="listeners"
            >
        </div>
        </template>
        
        <script>
        export default (
          name: 'BaseInput',
          inheritAttrs: false,
          props: ['value', 'label', 'id'],
          computed: (
            listeners() (
              return (
                ...this.$listeners,
                input: event => this.$emit('input', event.target.value)
              );
            )
          )
        );
        </script>

        Det finns en ny beräknad egenskap som returnerar komponenten för lyssnare och lägger till input-lyssnaren. Vi använder den beräknade inmatningen genom att helt enkelt skriva v-on="lyssnare".

        Använd watcher med alternativet immediate istället för att skapa hook och watcher tillsammans

        Vi hämtar ofta data på en skapad (eller monterad) hook, men sedan behöver vi hämta data vid varje ändring av en egenskap, t.ex. aktuell sida i en paginering. Vissa tenderar att skriva ner det så här:

        export default (
          namn: 'SomeComponent',
          watch: (
            someWatchedProperty() (
              this.fetchData();
            )
          ),
          skapad() (
            this.fetchData();
          ),
          metoder: (
            fetchData() (
              // hantera hämtning av data
            )
          )
        );

        Naturligtvis fungerar det, men ... Det är inte det bästa tillvägagångssättet, inte ens ett bra. Så, låt oss kolla hur vi kan refaktorisera detta, Ett exempel på inte så dåligt tillvägagångssätt:

        export default (
        namn: 'SomeComponent',
        bevakning: (
          someWatchedProperty: 'hämta data'
        ),
          skapad() (
            this.fetchData();
          ),
          metoder: (
            fetchData() (
              // hantera hämtning av data
            )
          )
        );

        Ovanstående version är bättre eftersom det inte behövs någon annan metod, vi har bara angett en metod som ska anropas för att ändra watchedProperty.

        Ett ännu bättre tillvägagångssätt:

        export default (
            namn: 'SomeComponent',
            klocka: (
              someWatchedProperty: (
                hanterare: 'fetchData',
                omedelbar: true
              )
            ),
            metoder: (
              fetchData() (
                // hantera hämtning av data
              )
            )
          );

        Vi har tagit bort den skapade kroken. Genom att lägga till alternativet "immediate" gör vi att komponenten anropar fetchData-metoden omedelbart efter observationens början (det är lite före created-kroken och efter beforeCreated), så att den kan användas i stället för created-kroken.

        Vue.js tips sammanfattning

        Dessa tips kommer inte att göra din ansökan perfekt, men om du använder dem kommer du snabbt att förbättra kvaliteten på din kod. Jag hoppas också att du kommer att hitta något av intresse i exemplen ovan.

        Observera att vissa av dem har förenklats för artikelns syfte.

        Läs mer om detta:

        JavaScript är helt död. Någon snubbe på internet

        En djupare titt på de mest populära React-krokarna

        Programvaruprojekt där du kan använda JavaScript

  • Relaterade artiklar

    Utveckling av programvara

    Bygg framtidssäkrade webbappar: Insikter från The Codest:s expertteam

    Upptäck hur The Codest utmärker sig genom att skapa skalbara, interaktiva webbapplikationer med banbrytande teknik som ger sömlösa användarupplevelser på alla plattformar. Läs om hur vår expertis driver digital omvandling och affärsutveckling...

    DEKODEST
    Utveckling av programvara

    Topp 10 Lettlandsbaserade mjukvaruutvecklingsföretag

    Läs mer om Lettlands främsta mjukvaruutvecklingsföretag och deras innovativa lösningar i vår senaste artikel. Upptäck hur dessa teknikledare kan hjälpa till att lyfta ditt företag.

    thecodest
    Lösningar för företag och uppskalningsföretag

    Java Software Development Essentials: En guide till framgångsrik outsourcing

    Utforska denna viktiga guide om framgångsrik outsourcing av Java-programvaruutveckling för att förbättra effektiviteten, få tillgång till expertis och driva projektframgång med The Codest.

    thecodest
    Utveckling av programvara

    Den ultimata guiden till outsourcing i Polen

    Den kraftiga ökningen av outsourcing i Polen drivs av ekonomiska, utbildningsmässiga och tekniska framsteg, vilket främjar IT-tillväxt och ett företagsvänligt klimat.

    TheCodest
    Lösningar för företag och uppskalningsföretag

    Den kompletta guiden till verktyg och tekniker för IT-revision

    IT-revisioner säkerställer säkra, effektiva och kompatibla system. Läs mer om hur viktiga de är genom att läsa hela artikeln.

    Codest
    Jakub Jakubowicz CTO och medgrundare

    Prenumerera på vår kunskapsbas och håll dig uppdaterad om expertisen från IT-sektorn.

      Om oss

      The Codest - Internationellt mjukvaruutvecklingsföretag med teknikhubbar i Polen.

      Förenade kungariket - Huvudkontor

      • Kontor 303B, 182-184 High Street North E6 2JA
        London, England

      Polen - Lokala tekniknav

      • Fabryczna Office Park, Aleja
        Pokoju 18, 31-564 Kraków
      • Brain Embassy, Konstruktorska
        11, 02-673 Warszawa, Polen

        Codest

      • Hem
      • Om oss
      • Tjänster
      • Fallstudier
      • Vet hur
      • Karriär
      • Ordbok

        Tjänster

      • Det rådgivande
      • Utveckling av programvara
      • Backend-utveckling
      • Frontend-utveckling
      • Staff Augmentation
      • Backend-utvecklare
      • Ingenjörer inom molntjänster
      • Dataingenjörer
      • Övriga
      • QA-ingenjörer

        Resurser

      • Fakta och myter om att samarbeta med en extern partner för mjukvaruutveckling
      • Från USA till Europa: Varför väljer amerikanska startup-företag att flytta till Europa?
      • Jämförelse av Tech Offshore Development Hubs: Tech Offshore Europa (Polen), ASEAN (Filippinerna), Eurasien (Turkiet)
      • Vilka är de största utmaningarna för CTO:er och CIO:er?
      • Codest
      • Codest
      • Codest
      • Privacy policy
      • Användarvillkor för webbplatsen

      Copyright © 2025 av The Codest. Alla rättigheter reserverade.

      sv_SESwedish
      en_USEnglish de_DEGerman da_DKDanish nb_NONorwegian fiFinnish fr_FRFrench pl_PLPolish arArabic it_ITItalian jaJapanese ko_KRKorean es_ESSpanish nl_NLDutch etEstonian elGreek sv_SESwedish