javascript - Cum să creezi proprietăți prescurtate asemănătoare cu Bootstrap pentru componentele React?


Care este cea mai bună metodă de a realiza acest comportament împreună cu React + TypeScript?

import { Button, Card } from 'src/components';

const Page = () => (
  <div>
    <Card mx3 p3 flex justifyContentEnd>
      /* Card content */
    </Card>
    <Button my2 mx3>
      Login
    </Button>
  </div>
);

De exemplu, mx3 va adăuga o margine de 16px pe orizontală, my2 va adăuga o margine de 8px pe verticală etc., similar cu modul în care framework-ul Bootstrap folosește clase pentru a aplica stiluri de utilitate ușor.

Am analizat câteva biblioteci de componente cu acest tip de comportament pentru a găsi o soluție potrivită; totuși, constat că majoritatea nu au suport puternic pentru tipizare. Exemple sunt RNUILib, NativeBase, Magnus UI, etc.

Răspuns #1

Poți declara proprietățile tale astfel:

const styles = ['mx3', 'p3', 'flex'] as const

type Styles = Record<typeof styles[number], boolean>;

Apoi folosește-le astfel:

type CardProps = Styles & {
  other: 'props here'
}

Acum, asta ar trebui să funcționeze:

<Card mx3 p3 flex />

Poți obține prop-uri aplicate astfel:

const values = Object.entries(props).map(([key, value]) => value ? key : null).filter(Boolean)

Răspunsul #2

Dacă te uiți la codul sursă al react-bootstrap, au mapat valoarea booleană la o anumită clasă CSS folosind o funcție utilitară din pachetul classnames. Poți face același lucru:

...
...
        <Component
          {...buttonProps}
          {...props}
          ref={ref}
          className={classNames(
            className,
            prefix,
            active && 'active',
            variant && `${prefix}-${variant}`,
            size && `${prefix}-${size}`,
            props.href && props.disabled && 'disabled',
          )}
        />
...
...