Feedback

Optimistisk UI

Optimistisk UI opdaterer grænsefladen med det samme, som om en handling er lykkedes, før serveren svarer — og ruller tilbage, hvis kaldet fejler. Det er primært et engineering- og interaktionsmønster; der findes ingen generaliserbare effekttal, så indholdet her er rationale og vejledning, ikke måling.

5 min læsning

Definition

Optimistisk UI antager, at en handling lykkes, opdaterer skærmen straks og ruller tilbage ved fejl.

Hvorfor det virker

Grundpræmissen er Nielsens 0,1-sekunds-tærskel: under 0,1 sekund føles systemet øjeblikkeligt. Et netværkskald når næsten aldrig dertil, så man kan kun opnå den øjeblikkelige følelse ved at opdatere lokalt med det samme.1

Øjeblikkelig feedback fjerner »spinner-usikkerheden«, hvor brugeren stirrer på en spinner og er i tvivl, om der overhovedet skete noget. Feedback på en handling er en af de mest basale UX-regler.2

Fordi den optimistiske opdatering ikke kræver et netværkskald, er den næsten øjeblikkelig for brugeren — appen føles hurtigere, selvom serveren ikke er blevet det.3

Mønstret egner sig, når handlingen næsten altid lykkes (fx et »like«): så er det spild at lade brugeren vente på validering. Værdien forudsætter, at rollback er en sjælden undtagelse.4

Hvornår du bruger det — og hvornår ikke

Hvornår du bruger det

  • Handlinger lykkes næsten altid (likes, flyt, tjek af).
  • Ventetid på serveren ville føles unødigt trægt.
  • Der findes en fornuftig måde at rulle tilbage på.

Hvornår du bør undgå det

  • Handlingen har alvorlige konsekvenser ved fejl (betaling).
  • Tilbagerulning ville forvirre mere end at vente.

Best practices

  1. Brug det kun til handlinger med høj succesrate og lav risiko

    Likes, favoritter, tilføj til liste, markér som læst. Mønstrets værdi forudsætter, at rollback sjældent sker.4

  2. Gem altid den forrige tilstand, og håndtér rollback eksplicit

    Ved fejl skal den optimistiske version kasseres og tilstanden rulles tilbage. Uden rollback-logik bliver UI’et usandt.3

  3. Vis en tydelig fejlbesked ved rollback

    Fejl aldrig i stilhed. Fang fejlen og vis en besked — gerne med mulighed for at prøve igen.4

  4. Brug det ikke til betalinger eller uigenkaldelige handlinger

    Rollback kan reparere UI’et, men ikke virkeligheden. En gennemført betaling eller en uigenkaldelig handling kan ikke rulles pænt tilbage. (Et ræsonnement udledt af kildernes rollback-model.)3

  5. Vær ærlig — vis ikke succes, du ikke kan indfri

    Ser brugeren gentagne gange noget »lykkes« og så blive trukket tilbage, undermineres tilliden. Forudsigelighed skaber tillid.2

  6. Gør tilstandsændringer tilgængelige

    En rent visuel ændring (fx et hjerte, der skifter farve) opfanges ikke af hjælpeteknologi. Læg ændringen i et ARIA live-område, der er til stede på forhånd.5

  7. Vælg rigtig »politeness«

    Brug aria-live="polite" (eller role="status") til ikke-kritiske opdateringer; reservér assertive til tidskritiske beskeder, da det afbryder skærmlæseren.5

  8. Lad serverens sandhed vinde til sidst

    Design altid, så den optimistiske tilstand konvergerer med serverens svar, når det kommer.3

Typiske fejl

  • Brugt til risikable eller uigenkaldelige handlinger

    Betaling, endelig indsendelse, sletning uden fortrydelse — rollback kan ikke reparere virkeligheden.

  • Silent failure

    At rulle tilbage uden besked. Brugeren tror, handlingen lykkedes, og bliver forvirret, når tilstanden pludselig skifter.

  • At glemme rollback-logikken

    En fejlet ændring bliver stående som »sand« i UI’et.

  • Forvirrende, umarkeret rollback

    En værdi, der springer tilbage uden forklaring eller uden at pege på, hvad brugeren kan gøre.

  • Utilgængelige tilstandsændringer

    Kun visuel feedback, som skærmlæsere ikke annoncerer, fordi der ikke er noget live-område.

Eksempler i praksis

Like-/favorit-knap

Den officielle React-dokumentation bruger netop en like-knap som kerneeksempel: hjertet skifter tilstand med det samme, mens kaldet kører i baggrunden.

Afsendelse af kommentar/besked

Apollos dokumentation demonstrerer mønstret med en kommentar, der vises straks efter afsendelse og erstattes af serverens rigtige objekt, når svaret kommer.

Ofte stillede spørgsmål

Hvad er optimistisk brugerflade helt kort?

At grænsefladen opdateres med det samme, som om handlingen lykkedes, før serveren svarer — og ruller tilbage, hvis kaldet fejler.

Hvorfor føles det hurtigere, når serveren ikke er blevet hurtigere?

Fordi den lokale opdatering rammer Nielsens tærskel på 0,1 sekund for »øjeblikkelig« respons, som et netværkskald næsten aldrig kan nå. Det er opfattet hastighed, ikke reel serverhastighed.

Hvornår bør jeg ikke bruge det?

Ved betalinger, uigenkaldelige eller kritiske handlinger. Rollback kan rette UI’et, men ikke en handling, der reelt allerede er sket i den virkelige verden.

Hvad skal der ske, hvis serverkaldet fejler?

Rul tilbage til den forrige tilstand og vis en tydelig fejlbesked — gerne med mulighed for at prøve igen. Rul aldrig tilbage i stilhed.

Hvordan gør jeg de øjeblikkelige ændringer tilgængelige for skærmlæsere?

Læg ændringen i et ARIA live-område (fx aria-live="polite" eller role="status"), som er til stede på forhånd og tomt fra start. Brug kun assertive til kritiske beskeder.

Findes der tal på, hvor meget det forbedrer brugeroplevelsen?

Ikke som robuste, generaliserbare studier. Det er et veletableret design-/engineering-mønster begrundet i responstid og feedback — men konkrete effekttal bør ikke publiceres, medmindre de stammer fra jeres egne målinger.

Kilder

  1. Response Time Limits: The 3 Important LimitsJakob Nielsen, Nielsen Norman Group (1993)
  2. Visibility of System Status (Usability Heuristic #1)Nielsen Norman Group (2018)
  3. Optimistic mutation results (Optimistic UI)Apollo GraphQL Docs
  4. useOptimisticReact (react.dev)
  5. ARIA live regionsMDN Web Docs (Mozilla)