0.5.5 • Published 2 years ago

@ray-js/babel-plugin-transform-react-jsx-to-rn-stylesheet v0.5.5

Weekly downloads
-
License
MIT
Repository
-
Last release
2 years ago

babel-plugin-transform-react-jsx-to-rn-stylesheet

Transform StyleSheet selector to style in JSX Elements.

Installation

npm install --save-dev babel-plugin-transform-react-jsx-to-rn-stylesheet

Usage

Via .babelrc

.babelrc

{
  "plugins": ["transform-react-jsx-to-rn-stylesheet"]
}

Example

Your component.js that contains this code:

import { Component } from 'react';
import './app.css';
class App extends Component {
  render() {
    return <div className='header' />;
  }
}

Will be transpiled into something like this:

import { Component } from 'react';
import appCssStyleSheet from './app.css';

var _styleSheet = appCssStyleSheet;

class App extends Component {
  render() {
    return <div style={_styleSheet.header} />;
  }
}

Can write multiple classNames like this:

import { Component } from 'react';
import './app.css';

class App extends Component {
  render() {
    return <div className='header1 header2' />;
  }
}

Will be transpiled into something like this:

import { Component } from 'react';
import appCssStyleSheet from './app.css';

var _styleSheet = appCssStyleSheet;

class App extends Component {
  render() {
    return <div style={[_styleSheet.header1, _styleSheet.header2]} />;
  }
}

Also support array, object and expressions like this:

import { Component } from 'react';
import './app.css';

class App extends Component {
  render() {
    return (
      <div className={'header'}>
        <div className={{ active: this.props.isActive }} />
        <div className={['header1 header2', 'header3', { active: this.props.isActive }]} />
        <div className={this.props.visible ? 'show' : 'hide'} />
        <div className={getClassName()} />
      </div>
    );
  }
}

Will be transpiled into something like this:

import { Component } from 'react';
import appCssStyleSheet from './app.css';
var _styleSheet = appCssStyleSheet;

class App extends Component {
  render() {
    return (
      <div style={_styleSheet.header}>
        <div style={_getStyle({ active: this.props.isActive })} />
        <div style={_getStyle(['header1 header2', 'header3', { active: this.props.isActive }])} />
        <div style={_getStyle(this.props.visible ? 'show' : 'hide')} />
        <div style={_getStyle(getClassName())} />
      </div>
    );
  }
}

function _getClassName() {
  /* codes */
}
function _getStyle(className) {
  return _styleSheet[_getClassName(className)]; // not real code
}

And can also import multiple css file:

import { Component } from 'react';
import 'app1.css';
import 'app2.css';

class App extends Component {
  render() {
    return <div className='header1 header2' />;
  }
}

Will be transpiled into something like this:

import { Component } from 'react';
import app1CssStyleSheet from './app1.css';
import app2CssStyleSheet from './app2.css';

class App extends Component {
  render() {
    return <div style={[_styleSheet.header1, _styleSheet.header2]} />;
  }
}

var _styleSheet = _mergeStyles(app1CssStyleSheet, app2CssStyleSheet);

also suport inline style value is string

import { createElement, render } from 'rax';
import './app.less';

class App extends Component {
  render(<div className="header" style="width:100px;height:100px;background-color:rgba(0, 0, 0, 0.5);border: 1px solid;" />);
}
  ↓ ↓ ↓ ↓ ↓ ↓
import { createElement, render } from 'rax';
import appLessStyleSheet from "./app.less";
var _styleSheet = appLessStyleSheet;

class App extends Component {
  render() {
    return <div style={[_styleSheet["header"], {
  "width": 100,
  "height": 100,
  "backgroundColor": "rgba(0, 0, 0, 0.5)",
  "borderWidth": 1,
  "borderColor": "black",
  "borderStyle": "solid"
}]} />);
  }
}

support multiple className to style

.babelrc

{
  "plugins": ["transform-react-jsx-to-rn-stylesheet", { "enableMultipleClassName": true }]
}
import { createElement, Component } from 'rax';
import './app.css';

class App extends Component {
  render() {
    return <div className='container' headerClassName='header' />;
  }
}

/*  ↓ ↓ ↓ ↓ ↓ ↓  */

import { createElement, Component } from 'rax';
import appCssStyleSheet from './app.css';
var _styleSheet = appCssStyleSheet;

class App extends Component {
  render() {
    return <div style={_styleSheet['container']} headerStyle={_styleSheet['header']} />;
  }
}

the enableMultipleClassName option will match 'attribute' end with 'className' | 'style', and transform className to style.

but use the error css value in style attribute

like this:

import { createElement, Component } from 'rax';
import './app.css';

class App extends Component {
  render() {
    return <StatusBar barStyle='dark-content' />;
  }
}

the plugin can't transform 'dark-content' to css value, so this transformation will be ignored

import { createElement, Component } from 'rax';
import appCssStyleSheet from './app.css';
var _styleSheet = appCssStyleSheet;

class App extends Component {
  render() {
    return <StatusBar barStyle={'dark-content'} />;
  }
}
0.5.6-beta-1

2 years ago

0.4.8

2 years ago

0.5.4-beta-1

2 years ago

0.4.12-beta-1

2 years ago

0.4.12-beta-0

2 years ago

0.4.10-beta-1

2 years ago

0.5.4

2 years ago

0.5.3

2 years ago

0.5.5

2 years ago

0.5.0

2 years ago

0.5.8-beta-1

2 years ago

0.5.7-beta-2

2 years ago

0.5.7-beta-1

2 years ago

0.5.2

2 years ago

0.5.1

2 years ago

0.5.3-beta-3

2 years ago

0.5.3-beta-2

2 years ago

0.5.3-beta-1

2 years ago

0.4.15-beta-0

2 years ago

0.4.10

2 years ago

0.4.11

2 years ago

0.4.12

2 years ago

0.3.31

2 years ago

0.3.30

2 years ago

0.3.29

2 years ago

0.4.1-beta-1

2 years ago

0.3.28

2 years ago

0.4.4-beta-1

2 years ago

0.3.27

2 years ago

0.4.6-beta-1

2 years ago

0.3.26

2 years ago

0.4.6-beta-3

2 years ago

0.4.6-beta-2

2 years ago

0.3.23

2 years ago

0.4.5

2 years ago

0.4.4

2 years ago

0.4.7

2 years ago

0.4.6

2 years ago

0.4.0

2 years ago

0.4.2

2 years ago

0.3.10

2 years ago

0.3.4

2 years ago