Add react-hook-form to ImageForm #1310
Open
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Denne PR'en erstatter bruken av Formik i
ImageForm
med react-hook-form. Størrelsen på PR'en er ikke nødvendigvis representativ, da den inneholder en del filer som måtte "klones" for å slippe unna Formik.Grunnen til at denne overgangen er interessant er at react-hook-form i mye større grad unngår rerenders når et form oppdateres. Vårt tidligere bruk av Formik førte til at hele siden ble rerendret hver gang det oppsto en endring i et felt. I React-hook-form skjer dette kun ved første tastetrykk i et felt. Forskjellene kan testes ut ved å åpne konsollen, navigere til en react-dev-tools-fane og sjekke "Highlight updates when components render".
React-hook-form
har ikkesetStatus
, som vi har brukt til å eksplisitt fortelle Slate at en ny verdi skal tas i bruk når et form resettes til en tidligere versjon. Jeg endte opp med å lage en Provider som dispatcher events som kan lyttes på. Inntil videre opprettes en slik provider på toppen av hvert form i applikasjonen, slik at vi slipper å legge til flere globale providers. Inntil videre kan den legges inn v.h.awithFormEventsProvider
, sånn at det er mest mulig "plug-and-play".Det ser også ut som at react-hook-form er såpass god til diffing at vi ikke trenger å bruke
isFormikFormDirty
, men det kan hende at @haattis har andre meninger der. Krysser fingrene.FormField
er ment til å erstatteFormikField
, bare at den ikke defaulter tilInput
dersomchildren
ikke passeres. Man må alltid spesifisere hva som skal rendres, men dette kan fint endres. For å få til ordentlig typing av returverdiene tilchildren
-funksjonen måtte jeg ty til litt kreativ typing, da typene til react-hook-form ikke ville godta måten vi tar i brukDescendant
på.Etter denne overgangen er flaskehalsen for et form nedtrekkspaneler. Når en accordion åpnes eller lukkes rerendres hele formet. Hele formet blir også rerendret hver gang et felt endrer gyldighet (valid->invalid / invalid->valid). Sistnevnte kan kanskje ordnes med memoization, det har jeg ikke fått sett på ennå. Førstnevnte vil være mer utfordrende, og kan heller tas på et annet tidspunkt. Da burde man også se på hvordan en
AccordionSection
blir rendret. Slik det er nå blir den gjenskapt hver gang en seksjon blir åpnet, som fører til unødvendige API-kall og renders.