1.0.0 • Published 5 years ago

babel-plugin-react-v-model v1.0.0

Weekly downloads
9
License
-
Repository
github
Last release
5 years ago

babel-plugin-react-v-model

Babel plugin for React component to add a syntactic sugar like Vue's v-model.

Installation

$ npm install babel-plugin-react-v-model --save-dev

Motivation

When you are building a input in React component, usullay, you have to write two JSXAttributes (value and onChange) to Two-WayDataBinding, like this.

class App extends React.Component{
  constructor() {
    super();
    
    this.state = {
      text: ''
    };
  }
 
  render() {
    const {text} = this.state;

    return (
      <div>
        <input 
          type="text"
          value={text}
          onChange={(e) => 
            this.setState({
              text: e.target.value
            })
          }
        />
      </div>
    )
  }
}

it looks simple, but if It is not a single input instead of a large number of inputs,It will be very troublesome. So, this plugin is born to resolve these thorny problems. With this plugin, you can easily code.

For instance,

class App extends React.Component{
  constructor() {
    super();
    
    this.state = {
      text: '',
      num: 1,
      radioVal: 1,
      checkboxVal: true,
      selectVal: 'A'
    };
  }

  render() {
    const {text, num, radioVal, checkboxVal, selectVal} = this.state;
    const {storeData, setItem} = this.props;// Store Supported

    return (
      <div>
        <input 
          type="text"
          v-model={text}
        />
        <textarea 
          v-model={text}
        />
        <label>
          <input 
            type="radio"
            name="radio"
            value={0}
            v-model={radioVal}
          />
          <input 
            type="radio"
            name="radio"
            value={1}
            v-model={radioVal}
          />
        </label>
        <input 
          type="checkbox"
          v-model={checkboxVal}
        />
        <select
          v-model={selectVal}
        >
          <option value="A">A</option>
          <option value="B">B</option>
          <option value="C">C</option>
        </select>
        <input 
          type="number"
          v-model={{
            bind: num,
            filter(val) {
              return (val > 0)? val : 0
            }
          }}
        />
        <input 
          type="text"
          v-model={{
            bind: storeData,
            handler: setItem
          }}
        />
      </div>
    )
  }
}

Usage

Write via babelrc.

// .babelrc
{
  "plugins": [
    "react-v-model"
  ]
}