babel-plugin-react-jsx-directives

1.13.2 • Public • Published

babel-plugin-react-jsx-directives

npm GitHub repo size high usability

Babel plugin that carries directives to React JSX:

Installation

npm i babel-plugin-react-jsx-directives

Options

Option Type Description Default value
prefix string A prefix directives are preceded with; must consist of one or more lowercase characters, plus can contain $ char(s). $
prefixSeparation boolean Whether a prefix and directive name should be separated with the - character. false

Change of the Prefix

Replace the default $ prefix with x-, so e.g., $if becomes x-if:

plugins: [
    ['babel-plugin-react-jsx-directives', {
        prefix: 'x',
        prefixSeparation: true
    }]
]

The $if Directive

<p $if={this.state.status == 'available'}>
    I'm available
</p>
<p $elseif={this.state.status == 'busy'}>
    I'm busy now
</p>
<p $else>
    I'm certainly AFK
</p>

The $show Directive

<div $show={operationPerformed}>
    Operation has finished successfully.
</div>

The $hide Directive

<div $hide={errors.length === 0}>
    form contains errors
</div>

The $hidden Directive

<div $hidden={!show}>
    <img src="..." />
</div>

$hide vs. $hidden

  • $hide - an element hidden by the $hide directive is not visible and takes no space on the page (it is done by CSS display: none setting)
  • $hidden - an element hidden by the $hidden directive is not visible on the page but does take space of the page as if it were displayed (it is done by CSS visibility: hidden setting)

The $for Directive

<ul>
    <li $for={(book, idx) in this.state.books}
        key={idx}
    >
        {idx + 1}. {book.title}
    </li>
</ul>

The $switch Directive

<div $switch={this.state.n}>
    <p $case={1}>one</p>
    <p $case={2}>two</p>
    <p $case={3}>three</p>
    <p $default>?</p>
</div>

The $class Directive

<div className="box"
    $class={{isError: this.state.isError, isOk: this.state.isOk}}
>...</div>

The $class-* Directive

<div className="message"
    $class-fullscreen={this.state.device == 'mobile'}
>...</div>

The $style-* Directive

<p $style-color={hasError ? 'red' : '#222'}>...</p>
<p $style-fontSize="20">...</p>

You can use $style-font-size, yet the plugin will turn it into $style-fontSize, eventually.

  • a unit can be specified:
<p $style-margin_px="25">...</p>
  • use percent if a unit is meant to be %:
<div $style-width_percent="75">...</div>

A unit can be specified if a value of the directive is just a string rather than expression.

The $model Directive

  • the input below is connected to the phrase property of a component state:
<input $model="phrase" />
  • and this one to the accepted property of the state:
<input type="checkbox" $model="accepted" />
{ this.state.accepted ? 'Accepted' : 'Not accepted' }

The $params Directive

The directive allows omitting callback when using render props.

  • instead of a callback:
<div user={this.state.user}>
    {(user, idx) => {
        return <p>[{ idx }] { user.name } { user.surname } ({ user.age })</p>;
    }}
</div>
  • you can use the $params directive:
<div user={this.state.user} $params={(user, idx)}>
    <p>[{ idx }] { user.name } { user.surname } ({ user.age })</p>
</div>

The $dynamic-prop Directive

<div $dynamic-prop={[propToBind, valueForProp]}>
    ...
</div>

It's like v-bind:[propToBind]="valueForProp" directive known from the Vue framework.

The $dynamic-event Directive

<div $dynamic-event={[eventToListen, eventsHandler]}>
    ...
</div>

It's like v-on:[eventToListen]="eventsHandler" directive known from the Vue framework.

Package Sidebar

Install

npm i babel-plugin-react-jsx-directives

Weekly Downloads

20

Version

1.13.2

License

ISC

Unpacked Size

36.2 kB

Total Files

26

Last publish

Collaborators

  • damianc