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
Babel plugin that carries directives to React JSX:
$if$show$hide$hidden$for$switch$class$class-*$style-*$model$params$dynamic-prop$dynamic-event
Installation
npm i babel-plugin-react-jsx-directivesOptions
| 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$hidedirective is not visible and takes no space on the page (it is done by CSSdisplay: nonesetting)$hidden- an element hidden by the$hiddendirective is not visible on the page but does take space of the page as if it were displayed (it is done by CSSvisibility: hiddensetting)
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
percentif 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
phraseproperty of a component state:
<input $model="phrase" />- and this one to the
acceptedproperty 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
$paramsdirective:
<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.