Qoʻshma forma komponentlarini loyihalash

Qoʻshma forma komponentlarini loyihalash

Kirishga

So'nggi loyihani amalga oshirayotganda React Hook Form (RHF) va Material UI (MUI) asosida turli xil Form sahnalarini amalga oshirdim.

Loyihaning boshida Form UI'ning muvofiqligini saqlash uchun umumiy Field komponentini qurib foydalanayotgan edik.

<Field.Text
  name="name"
  label="Name"
/>

Dasturchi yuqoridagi usulda kiritish maydonlarini tezda tashkil eta oldi va React Hook Form va MUI'ni to'g'ridan-to'g'ri bog'lash zaruriyati bo'lmasdan, faqat umumiy komponentlardan foydalanish mumkin edi.

Haqiqatan ham, xizmatda quyidagi turli kiritish komponentlari taqdim etilgan edi.

  • Field.Text

  • Field.Select

  • Field.Autocomplete

  • Field.DatePicker

  • Field.DateTimePicker

  • Field.Checkbox

Dastlab bu tuzilma rivojlanish samaradorligi va UI muvofiqligi jihatidan yetarlicha samarali deb o'yladim.

Ammo loyiha kengayib, sahna talablarini xilma-xil bo'lgan sari, mavjud tuzilmaning cheklovlari asta-sekin ko'rinadigan bo'la boshladi.

Monolitik tuzilmaning cheklovlari

Boshqa tarafdan, dastlabki Field komponenti Label chiqarish, Validation ishlov berish, React Hook Form bilan bog'lash, Input render qilish kabi barcha vazifalarni bitta komponent ichida bajarish tuzilmasiga ega edi.

Field
├─ FormLabel
├─ Controller
└─ Input Component

Ushbu tuzilma odatiy kirish ekranida ishlatish uchun qulay edi.

Lekin haqiqiy xizmatda oddiy kirish maydonlaridan ko'ra murakkab UI shakllari ko'proq paydo bo'ldi.

Input yonida tugma bo'lgan UI

Mashhur misol sifatida kirish maydoni yonida tugma bilan joylashgan UI mavjud.

Masalan, takrorlanishni tasdiqlash, autentikatsiya raqamini so'rash, manzilni qidirish kabi funksiyalar quyidagi ko'rinishda amalga oshiriladi.

image1.png

Mavjud Field.Text Label, Input, HelperText bitta komponent sifatida bog'langanligi sababli, oddiy Flex tartiblash bilan kerakli tartibni amalga oshirish qiyin bo'ldi.

  • align-items: flex-start ishlatganingizda Label va tugma bir xil balandlikda joylashadi

  • align-items: center ishlatganingizda Input va tugmaning vertikal tartiblanishi g'alati ko'rinadi

  • align-items: flex-end ishlatganingizda asosiy holatda yaxshi, lekin xato xabar ko'rsatilganda tugma joyi birga siljiydi va tartib buziladi

Oxir-oqibat, tugma joyini moslashtirish uchun Label balandligi va masofasini hisoblagan margin-top: 22px kabi qattiq kod yozish kerak bo'ldi.

Bu Label, Input, HelperText kuchli bog'langan tuzilmasining murakkab UI ni tashkil etishga mos emasligini ko'rsatadigan misol edi.

Oraliq kirish(Range Field) uchun HelperText muammosi

Yana bir misol oraliq kirish UI edi.

Oraliq kirish foydalanuvchi nuqtai nazaridan bitta kirish elementi, lekin haqiqiy amalga oshirish boshlanish va tugash qiymatlaridan iborat ikkita kirish maydonidan tashkil topadi.

image2.png

Mavjud tuzilishda har bir kirish maydoni mustaqil Field sifatida harakat qilganligi sababli, Validation Error yuzaga kelganda HelperText ham alohida chiqarildi.

Maxsus torli ekranlarda xatolik xabarlari bir nechta qatorlarga o'zgarib, umumiy balandlik sezilarli darajada oshish muammosi yuzaga keldi.

Bundan tashqari, boshlanish va tugash qiymatlari bilan bog'liq xatolik xabarlarining uzunligi bir-biridan farq qilganda, joylashuv balandligi o'zgarib, ekranning beqaror ko'rinishi muammosi ham bor edi.

Foydalanuvchilar "diapazon" deb nomlangan bitta qiymatni kiritmoqda, lekin xatolik xabarlari ikkiga tarqalib ko'rsatilayotganligi UX jihatidan hayron qoldiruvchi nuqta edi.

Umumiy komponentlarni o'zgartirish holatining paydo bo'lishi

Loyihaning murakkablashuvi bilan bir nechta sahnalarda eski Field komponenti orqali talablarni qondirish qiyinlashdi.

Natijada, ba'zi sahnalarda umumiy komponentlardan foydalanmasdan, React Hook Formning Controller va MUI komponentlarini to'g'ridan-to'g'ri ishlatish usuli qo'llanilishga boshlandi.

<Controller
  name="period"
  control={control}
  render={({ field }) => (
    <TextField {...field} />
  )}
/>

Umumiy komponent mavjud bo'lishiga qaramay, alternativ implementatsiyaning paydo bo'lishi, ushbu komponentning kengaytirilganligi yetarli emasligini koʻrsatdi.

Ushbu muammoni hal qilish uchun mavjud tuzilmani qayta ko'rib chiqishga majbur bo'ldik.

Kompozitsiya tuzilmasini ko'rib chiqish sababi

Mavjud tuzilmaning eng katta muammosi, bitta komponentning juda ko'p mas'uliyatga ega ekanligidir.

Buni hal qilish uchun Reactning Kompozitsiya Patternini ko'rib chiqamiz.

Kompozitsiya - bitta katta komponent barcha funktsiyalarni bajaradigan o'rniga, kichik rol birliklari komponentlarini birlashtirib, UI ni tashkil qilish usulidir.

Rayonli misollar quyidagi kabi.

<Card>
  <Card.Header />
  <Card.Body />
  <Card.Footer />
</Card>

Har bir komponent o'z vazifasiga e'tibor qaratadi va kerakli shaklda erkin birlashtirish mumkin.

Bunday tuzilma Design Systemda ham tez-tez qo'llaniladigan naqsh bo'lib, kengaytirilganlik va qayta ishlatilish imkoniyatining yuqoriligi bilan ajralib turadi.

Fieldni rolga asoslangan tarzda ajratish

Oldin bitta komponent Label, Validation, Form ulanishi, Error chiqarish kabi hamma narsani bajarardi.

Bu esa quyidagicha rol birliklariga ajratildi.

<Field>
  <Field.Label />
  <Field.Control />
  <Field.HelperText />
</Field>

Har bir komponent quyidagi rollarni bajaradi.

  • Field: Layout tuzish va umumiy holatni boshqarish

  • Field.Label: Labelni chiqarish

  • Field.Control: React Hook Form ulanishi va kirish elementini render qilish

  • Field.HelperText: Xato xabarlari va ko'rsatma matnini chiqarish

Rollarni ajratganimizda komponentning mas'uliyati aniq bo'ldi va UIni ancha moslashuvchan tarzda tashkil qilish imkoniyati paydo bo'ldi.

Eng katta o'zgarish, Field.Group

Ushbu refaktoringda eng muhim o'zgarish Field.Groupning joriy etilishi bo'ldi.

Amaldagi xizmatda bir nechta kirish elementi bitta ma'noni anglatadigan holatlar ko'p uchraydi.

Ommabop misol - davrni tanlash UIsi.

<Field>
  <Field.Label required>
   기간
  </Field.Label>

  <Field.Group>
   <Field.Control name="startDate" />
   <span>~</span>
   <Field.Control name="endDate" />
  </Field.Group>

  <Field.HelperText />
</Field>

Oldingi tuzilmada boshlanish va tugash sanalari mustaqil maydonlar sifatida harakat qilgani uchun xato xabarlari takroran chiqarilib, guruh bo'yicha UXni taqdim etish qiyin bo'ldi.

Boshqa tomondan, Field.Groupni joriy etgandan so'ng bir nechta kirish elementlarini bitta maydon sifatida boshqarishimiz mumkin bo'ldi va Layout va Validation jarayoni ham ancha tabiiy ravishda tashkil qilindi.

Qoʻshilish shaklining keltirgan kengayishi

Composition tuzilmasi joriy etilgandan soʻng, yangi talablar paydo boʻlganda maxsus komponentlar yaratish zaruriyati deyarli qolmadi.

Masalan, teg kiritish UI'sini mavjud komponentlarni qoʻshish orqali amalga oshirish mumkin.

<Field>
  <Field.Label>
    Tags
  </Field.Label>

  <Field.Control
    render={() => (
      <>
        <TextField />
        <ChipList />
      </>
    )}
  />

  <Field.HelperText />
</Field>

Shunday qilib, yangi funksiyalar qoʻshish o'rniga, mavjud komponentlarni birlashtirib turli xil UI'larni yaratish imkoniyati yaratildi.

Tatbiq natijasi

Composition tuzilmasini tatbiq qilgandan so'ng, quyidagi ta'sirlarni qo'lga kiritish imkoniyati mavjud edi.

  • Form UI tuzilmasining muvofiqligini ta'minlash

  • Murakkab kiritish UI'ga moslashuvchanlikni oshirish

  • Yangi kiritish turini qo'shish osonligi

  • MUI slotProps dan foydalanishning ko'payishi

  • Umumiy komponentlarni chetlab o'tishning kamayishi

  • Saqlash va ta'mirlash xarajatlarini kamaytirish

  • Qayta foydalanish imkoniyatini oshirish

Xususan, yangi talablar yuzaga kelganda, mavjud komponentlarni oʻzgartirishdan koʻra birlashmalar orqali hal qilish imkoniyati yaratildi va kengayish ancha yuqori boʻldi.

Xulosa qilib

Dastlab men faqat React Hook Form wrapper komponentini yaxshilash ustida ishlayotganimni o'yladim.

Ammo aslida " umumiy komponentlarni qanday loyihalashtirish kerakki, uzoq muddatda kengaytiriladigan bo'lsin" degan masala ko'proq muhim edi.

Bu tajriba orqali hamma funksiyalarni bitta komponentga qo'shish Monolithic usulidan ko'ra, rolni ajratish va kerakli funksiyalarni birlashtirish Composition usuli ancha moslashuvchan ekanligini tasdiqlay oldim.

Kelgusi reja shu orqali Form komponentidan tashqari, Design Systemning umumiy qismida ushbu dizayn usulini qo'llab, qayta foydalanish va kengaytirish imkoniyatlarini oshirishdir.

nature

Site footer