A easy-to-use two-way data binding solution for front-end frameworks using JSX with "setState" api like React.
See Also:
- Using for-directive in JSX: babel-plugin-jsx-for-directive
- Using if-directive in JSX: babel-plugin-jsx-if-directive
实现原理系列教程:
npm install --save-dev babel-plugin-jsx-two-way-binding
Edit your .babelrc file:
{
"plugins": [
"jsx-two-way-binding"
]
}
In your jsx file:
class App extends React.Component {
constructor(props) {
super(props);
this.state = {
name: 'Joe'
}
}
render() { return (
<div>
<h1>I'm {this.state.name}</h1>
<input type="text" model={this.state.name}/>
</div>
)}
}
And it will be compiled to:
class App extends React.Component {
constructor(props) {
super(props);
this.state = {
name: 'Joe'
}
}
render() { return (
<div>
<h1>I'm {this.state.name}</h1>
<input
type="text"
value={this.state.name}
onChange={e => this.setState({ name: e.target.value })}
/>
</div>
)}
}
In your jsx file:
class App extends React.Component {
constructor(props) {
super(props);
this.state = {
name: 'Joe'
}
}
render() { return (
<div>
<h1>I'm {this.state.name}</h1>
<input
type="text"
model={this.state.name}
onChange={() => console.log(`Changed at ${(new Date()).toLocaleString()}`)}
/>
</div>
)}
}
Then it will be compiled to:
class App extends React.Component {
constructor(props) {
super(props);
this.state = {
name: 'Joe'
}
}
render() { return (
<div>
<h1>I'm {this.state.name}</h1>
<input
type="text"
value={this.state.name}
onChange={e => {
this.setState({ name: e.target.value });
(() => console.log(`Changed at ${(new Date()).toLocaleString()}`))(e);
}}
/>
</div>
)}
}
In your jsx file:
class App extends React.Component {
constructor(props) {
super(props);
this.state = {
profile: {
name: {
type: 'string',
value: 'Joe'
},
age: {
type: 'number',
value: 21
}
}
}
}
render() { return (
<div>
<h1>I'm {this.state.profile.name.value}</h1>
<input type="text" model={this.state.profile.name.value}/>
</div>
)}
}
Then it will be compiled to:
class App extends React.Component {
constructor(props) {
super(props);
this.state = {
profile: {
name: {
type: 'string',
value: 'Joe'
},
age: {
type: 'number',
value: 21
}
}
}
}
render() { return (
<div>
<h1>I'm {this.state.profile.name.value}</h1>
<input
type="text"
value={this.state.profile.name.value}
onChange={e => this.setState({
profile: Object.assign({}, this.state.profile, {
name: Object.assign({}, this.state.profile.name, {
value: e.target.value
})
})
})}
/>
</div>
)}
}
Edit your .babelrc file:
{
"plugins": [
"jsx-two-way-binding",
{
"attrName": "binding"
}
]
}
In your jsx file:
class App extends React.Component {
constructor(props) {
super(props);
this.state = {
name: 'Joe'
}
}
render() { return (
<div>
<h1>I'm {this.state.name}</h1>
<input type="text" binding={this.state.name}/>
</div>
)}
}