JSPM

  • ESM via JSPM
  • ES Module Entrypoint
  • Export Map
  • Keywords
  • License
  • Repository URL
  • TypeScript Types
  • README
  • Created
  • Published
  • Downloads 8
  • Score
    100M100P100Q48897F
  • License ISC

Babel plugin that carries directives to React JSX: `$if/$else`

Package Exports

  • babel-plugin-react-jsx-directives

This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (babel-plugin-react-jsx-directives) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.

Readme

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.