Radix UI: unstyled React komponentai

Kas yra Radix UI ir kodėl jis vis labiau populiarėja

Jei dirbi su React ekosistema, tikriausiai jau pastebėjai, kad komponentų bibliotekų pasirinkimas yra milžiniškas. Bet štai problema – dauguma jų ateina su savo dizainu, kurio dažnai nenori arba negali naudoti. Material UI, Ant Design, Chakra UI – visos šios bibliotekos puikios, bet kartais tiesiog nori turėti pilną kontrolę virš to, kaip tavo komponentai atrodo.

Čia ir atsiranda Radix UI. Tai ne dar viena UI biblioteka su savo dizaino sistema. Tai rinkinys visiškai nestilizuotų, bet funkcionaliai pilnų React komponentų, kurie suteikia tau visą reikiamą funkcionalumą, prieinamumą ir klaviatūros navigaciją, bet stilių dalį palieka tau.

Pagalvok apie tai kaip apie LEGO kaladėles. Radix duoda tau visas reikalingas dalis, kurios veikia kartu, bet tu pats nusprendžia, kokios spalvos ir formos jos bus. Tai ypač patrauklu, kai dirbi su dizaineriais, kurie turi konkrečią viziją, arba kai kuri kompanija jau turi savo dizaino sistemą.

Kodėl nestilizuoti komponentai yra gera idėja

Iš pradžių gali atrodyti keista – kam man biblioteka, kuri nieko nedaro su stiliais? Bet pamąstyk apie tai giliau. Kiek kartų bandei pritaikyti Material UI komponentą prie savo dizaino ir praleisdavai valandas kovodamas su CSS specificity, !important taisyklėmis ir theme override’ais?

Radix UI filosofija yra paprasta: jie sprendžia sudėtingas problemas, o tu sprendžia paprastas. Sudėtinga yra sukurti dropdown meniu, kuris:
– Veikia su klaviatūra
– Yra prieinamas ekrano skaitytuvams
– Teisingai valdo fokusą
– Užsidaro paspaudus Escape
– Pozicionuojasi protingai, net jei yra prie ekrano krašto
– Veikia mobiliuose įrenginiuose

Paprasta yra parašyti CSS, kuris nuspalvina tą meniu tavo norimomis spalvomis.

Tradicinės UI bibliotekos sprendžia abi problemas, bet dažnai tai reiškia, kad tu kovoji su jų sprendimais. Radix sprendžia tik sudėtingą dalį ir leidžia tau daryti tai, ką geriausiai moki – stilizuoti.

Kaip pradėti dirbti su Radix UI

Pradėti naudoti Radix yra paprasta. Kiekvienas komponentas yra atskiras npm paketas, todėl instaliuoji tik tai, ko reikia:

„`bash
npm install @radix-ui/react-dialog
„`

Arba jei naudoji dropdown:

„`bash
npm install @radix-ui/react-dropdown-menu
„`

Pats komponentas naudojamas gana intuityviai. Štai paprastas dialogo pavyzdys:

„`jsx
import * as Dialog from ‘@radix-ui/react-dialog’;

function MyDialog() {
return (

Atidaryti dialogą



Dialogo pavadinimas

Čia gali būti bet koks turinys

Uždaryti



);
}
„`

Kaip matai, struktūra yra aiški ir semantiška. Kiekviena dalis turi savo paskirtį, ir tu tiesiog pridedi savo CSS klases. Jokių theme objektų, jokių sx propų, jokių styled komponentų – tik paprasti className atributai.

Prieinamumo (accessibility) supergebos

Vienas didžiausių Radix privalumų yra tai, kad prieinamumas yra įtaisytas iš karto. Tai nėra kažkas, ką reikia pridėti vėliau ar konfigūruoti – tai tiesiog veikia.

Pavyzdžiui, jų Accordion komponentas automatiškai:
– Prideda visus reikalingus ARIA atributus
– Valdo fokusą tarp skyrių
– Leidžia naudoti rodyklių klavišus navigacijai
– Teisingai praneša būsenas ekrano skaitytuvams

Tu net nepagalvoji apie tai, kol nepabandysi sukurti tokio komponento pats nuo nulio. Tai gali užtrukti dienas, o su Radix tai veikia iš karto.

Štai kodas Accordion komponentui:

„`jsx
import * as Accordion from ‘@radix-ui/react-accordion’;




Pirmas klausimas


Atsakymas į pirmą klausimą



„`

Viskas, kas susiję su ARIA rolėmis, aria-expanded, aria-controls ir kitais atributais, yra tvarkoma automatiškai. Tu tiesiog stilizuoji ir džiaugiesi.

Stilizavimo strategijos ir geriausi praktikos

Gerai, turime nestilizuotus komponentus. Kaip juos stilizuoti? Radix duoda tau keletą galimybių, ir visos jos yra geros – priklauso nuo tavo projekto poreikių.

Paprastas CSS – tiesiog pridedi className ir rašai CSS. Tai veikia puikiai mažesniems projektams:

„`css
.dialog-overlay {
background-color: rgba(0, 0, 0, 0.5);
position: fixed;
inset: 0;
}

.dialog-content {
background: white;
border-radius: 8px;
padding: 24px;
max-width: 500px;
}
„`

CSS Modules – jei nori lokalių stilių:

„`jsx
import styles from ‘./Dialog.module.css’;


„`

Tailwind CSS – ir čia prasideda magija. Radix ir Tailwind yra kaip sukurti vienas kitam. Galima tiesiog rašyti utility klases:

„`jsx

„`

CSS-in-JS – styled-components, emotion, ar bet kas kita veikia puikiai:

„`jsx
const StyledContent = styled(Dialog.Content)`
background: white;
border-radius: 8px;
padding: 24px;
`;
„`

Asmeniškai pastebėjau, kad Radix + Tailwind kombinacija yra neįtikėtinai produktyvi. Galima labai greitai kurti komponentus, o rezultatas atrodo tiksliai taip, kaip nori.

Data atributai ir būsenų stilizavimas

Vienas iš protingiausių Radix sprendimų yra tai, kaip jie valdo būsenas. Vietoj to, kad duotų tau props’us kaip `isOpen` ar `isDisabled`, jie naudoja data atributus.

Pavyzdžiui, Accordion.Trigger automatiškai gauna `data-state=”open”` arba `data-state=”closed”` atributą. Tai reiškia, kad gali stilizuoti būsenas tiesiog CSS:

„`css
.accordion-trigger[data-state=”open”] {
background-color: #f0f0f0;
}

.accordion-trigger[data-state=”open”] .icon {
transform: rotate(180deg);
}
„`

Su Tailwind tai atrodo dar švariau naudojant `data-*` variantus:

„`jsx

„`

Tai labai galingas pattern’as, nes stiliai yra deklaratyvūs ir aiškiai susieti su komponento būsena. Nereikia jokių papildomų state kintamųjų ar conditional rendering logikos.

Kompozicija ir customizacija

Radix komponentai yra sukurti taip, kad būtų lengva juos komponuoti ir customizuoti. Galima wrappinti juos į savo komponentus ir pridėti bet kokią logiką.

Pavyzdžiui, gali sukurti savo Button komponentą, kuris naudoja Radix Dialog:

„`jsx
function ConfirmButton({ onConfirm, children, title, description }) {
return (







{title}
{description}









);
}
„`

Atkreipk dėmesį į `asChild` prop’ą – tai dar viena Radix supergebų. Kai naudoji `asChild`, Radix nerendina savo elemento, o vietoj to perduoda visus props’us ir event handler’ius į tavo elementą. Tai leidžia išlaikyti semantinį HTML ir vengti nereikalingų wrapper’ių.

Ką reikia žinoti prieš naudojant gamyboje

Nors Radix yra puikus, yra keletas dalykų, kuriuos reikia turėti omenyje.

Bundle size – kiekvienas komponentas yra atskiras paketas, tai gerai. Bet kai kurie komponentai, ypač tokie kaip Popover ar Dropdown Menu, turi priklausomybių nuo kitų bibliotekų, pavyzdžiui, Floating UI pozicionavimui. Tai prideda keletą kilobaitų. Nėra tragedija, bet verta žinoti.

Mokymosi kreivė – jei esi įpratęs prie pilnų UI bibliotekų, pradžioje gali atrodyti keista, kad reikia viską stilizuoti pačiam. Bet tai greitai tampa antra prigimtimi, ir produktyvumas išauga.

Dokumentacija – Radix dokumentacija yra gera, bet kartais trūksta sudėtingesnių pavyzdžių. Bendruomenė aktyvi, tad dažniausiai galima rasti atsakymus GitHub discussions ar Discord serveryje.

TypeScript palaikymas – čia viskas puiku. Radix yra parašytas TypeScript ir tipai yra puikūs. Autocomplete veikia nuostabiai, ir retas atvejis, kai reikia kovoti su tipais.

Vienas praktinis patarimas – pradėk nuo paprastesnių komponentų kaip Dialog ar Accordion. Kai įgausi pasitikėjimo, galėsi pereiti prie sudėtingesnių dalykų kaip Select ar Combobox.

Radix ekosistema ir ateities perspektyvos

Radix nėra vien tik komponentų biblioteka. Aplink ją susiformavo visa ekosistema. Pavyzdžiui, yra Radix Colors – kruopščiai sukurta spalvų sistema, kuri turi puikų kontrastą ir prieinamumą. Yra Radix Icons – nedidelis, bet kokybiškas ikonų rinkinys.

Bet galbūt įdomiausias dalykas yra Radix Themes – tai nauja biblioteka, kuri paima Radix UI komponentus ir prideda jiems numatytus stilius. Tai kaip middle ground tarp visiškai nestilizuotų komponentų ir pilnos UI bibliotekos. Jei nori greitai pradėti, bet vis tiek turėti Radix lankstumą, Radix Themes gali būti geras pasirinkimas.

Komanda už Radix (Modulz / WorkOS) yra labai aktyvi ir nuolat tobulina biblioteką. Naujų komponentų pridedama reguliariai, o esami nuolat tobulinami. Tai nėra „side project” – tai rimtas produktas su ilgalaike vizija.

Dar vienas dalykas, kuris vertas dėmesio – Radix įtakojo kitas bibliotekas. Pavyzdžiui, React Aria iš Adobe ir Headless UI iš Tailwind Labs seka panašią filosofiją. Tai rodo, kad unstyled komponentų idėja yra ne tik mada, bet reali tendencija, kuri atspindi tai, ko nori kūrėjai.

Kada Radix yra tinkamas pasirinkimas (ir kada ne)

Radix puikiai tinka, kai:
– Turi dizainerį ar dizaino sistemą ir nori tiksliai ją implementuoti
– Vertini prieinamumą ir nenori to kurti pats
– Nori pilną kontrolę virš stilių
– Dirbi su Tailwind CSS ar panašia utility-first sistema
– Kuri produktą, kuris turi išsiskirti dizainu

Radix galbūt nėra geriausias pasirinkimas, kai:
– Reikia greitai sukurti prototipą ir dizainas nėra prioritetas
– Komandoje nėra dizainerio ir nori „out of the box” sprendimo
– Dirbi su legacy projektu, kuris jau naudoja kitą UI biblioteką
– Projektas labai mažas ir papildomas bundle size yra kritinis

Asmeniškai naudoju Radix beveik visuose naujuose projektuose. Kartą įpratęs prie šio darbo būdo, grįžti prie tradicinių UI bibliotekų tampa sunku. Ta laisvė ir kontrolė yra labai vertinga.

Bet svarbu suprasti, kad Radix nėra „geriau” už Material UI ar Chakra – tai tiesiog kitoks požiūris. Jei Material Design dizainas tau tinka, nėra prasmės naudoti Radix. Bet jei nori savo unikalų dizainą, Radix sutaupo neįtikėtinai daug laiko ir nervų.

Galiausiai, Radix UI yra puikus pavyzdys, kaip open source biblioteka gali spręsti realią problemą elegantiškai. Vietoj to, kad bandytų būti viskam, ji daro vieną dalyką labai gerai – suteikia funkcionalius, prieinamus komponentus, kuriuos gali stilizuoti kaip nori. Ir kartais būtent tai ir reikia.

Daugiau

Deno KV: built-in database