Skip to content

Instantly share code, notes, and snippets.

@BinaryMuse
Last active January 31, 2016 21:14
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save BinaryMuse/eff4093f0c23d95808c3 to your computer and use it in GitHub Desktop.
Save BinaryMuse/eff4093f0c23d95808c3 to your computer and use it in GitHub Desktop.
ES7 Decorator version of `LinkedStateMixin` that supports dot-separated paths

Make your React ES6 classes LinkState aware with a decorator. Supports nested state keys by specifying the key name with dots.

@NestedValueLink
class MyComponent extends React.Component {
  constructor(...args) {
    super(...args);

    this.state = {
      path: { to: { key: "" } }
    };
  }

  render() {
    return <input valueLink={this.linkState("path.to.key")} />;
  }
}
// This example is live at https://jsbin.com/soduqi/edit?js,output
@NestedValueLink
class Application extends React.Component {
constructor(...args) {
super(...args);
this.state = {
paymentData: "", // only used for display purposes
payment: { // the data we want our form to manage
name: "",
ccard: "",
verify: "",
month: "",
year: ""
}
};
this.handleChange = this.handleChange.bind(this);
this.handleAssignClick = this.handleAssignClick.bind(this);
}
render() {
return (
<form onChange={this.handleChange}>
<div>
<label>Name</label>
<input valueLink={this.linkState("payment.name")} />
</div>
<div>
<label>CCard #</label>
<input valueLink={this.linkState("payment.ccard")} />
</div>
<div>
<label>CVV</label>
<input valueLink={this.linkState("payment.verify")} />
</div>
<div>
<label>Month</label>
<input valueLink={this.linkState("payment.month")} />
</div>
<div>
<label>Year</label>
<input valueLink={this.linkState("payment.year")} />
</div>
<hr />
<pre>{this.state.paymentData}</pre>
<div>
<button onClick={this.handleAssignClick}>Assign Some Data</button>
</div>
</form>
);
}
handleChange(e) {
setTimeout(() => {
this.setState({paymentData: JSON.stringify(this.state.payment, null, " ")});
});
}
handleAssignClick(e) {
e.preventDefault();
const newPaymentData = {
name: "My Name",
ccard: "1234-5678-9012-3456",
verify: "123",
month: "01",
year: "15"
};
this.setState({
paymentData: JSON.stringify(newPaymentData, null, " "),
payment: newPaymentData
});
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment