From 74eac9addd7b22c0a0b963786cf65895d55b8c2a Mon Sep 17 00:00:00 2001 From: Dan Abramov Date: Thu, 27 Oct 2016 02:02:14 +0100 Subject: [PATCH] Tweak Forms --- docs/forms.md | 217 ++++++++++++++++++++++++++------------- docs/reference-events.md | 2 +- 2 files changed, 148 insertions(+), 71 deletions(-) diff --git a/docs/forms.md b/docs/forms.md index a8c10519..b9d8c0c6 100644 --- a/docs/forms.md +++ b/docs/forms.md @@ -9,7 +9,7 @@ redirect_from: "tips/controlled-input-null-value.html" Form components such as ``, ` ``` @@ -220,16 +253,16 @@ To make an uncontrolled component, `defaultValue` is used instead. > > You can pass an array into the `value` attribute, allowing you to select multiple options in a `select` tag: ` - + ); } } -ReactDOM.render(
, document.getElementById('root')); +ReactDOM.render( + , + document.getElementById('root') +); ``` -[Try this on CodePen.](https://codepen.io/ericnakagawa/pen/pExQbL?editors=0010) +[Try it out on CodePen.](https://codepen.io/gaearon/pen/qawrbr?editors=0010) -### Basic Radio Button +### Uncontrolled Radio Button -```javascript +```javascript{25,34,35,44} class Form extends React.Component { constructor(props) { super(props); @@ -365,38 +414,53 @@ class Form extends React.Component { return (


-

- +
+
+
); } } -ReactDOM.render(, document.getElementById('root')); +ReactDOM.render( + , + document.getElementById('root') +); ``` -[Try this on CodePen.](https://codepen.io/ericnakagawa/pen/WGaYVg?editors=0010) +[Try it out on CodePen.](https://codepen.io/gaearon/pen/ozOPLJ?editors=0010) +### Uncontrolled Checkbox -### Basic Uncontrolled Checkbox - -```javascript +```javascript{37,45,46,54} class Form extends React.Component { constructor(props) { super(props); @@ -406,10 +470,16 @@ class Form extends React.Component { } handleChange(event) { - let value = event.target.value; - let checked = this.state.checked; // copy - if (!checked[value]) { checked[value] = true; } else { checked[value] = false; } - this.setState({checked: checked}) + const value = event.target.value; + // Copy the object so we don't mutate the old state. + // (This requires an Object.assign polyfill): + const checked = Object.assign({}, this.state.checked) + if (!checked[value]) { + checked[value] = true; + } else { + checked[value] = false; + }; + this.setState({checked}); } handleSubmit(event) { @@ -424,36 +494,43 @@ class Form extends React.Component { return (


- -

- +
+
+
); } } -ReactDOM.render(, document.getElementById('root')); -``` - -[Try it on CodePen.](https://codepen.io/ericnakagawa/pen/kkAzPO?editors=0010) - -### Form Events - -Event names: +ReactDOM.render( + , + document.getElementById('root') +); ``` -onChange onInput onSubmit -``` + +[Try it on CodePen.](https://codepen.io/gaearon/pen/rrbkWz?editors=0010) diff --git a/docs/reference-events.md b/docs/reference-events.md index b68e65c8..6e275db9 100644 --- a/docs/reference-events.md +++ b/docs/reference-events.md @@ -35,7 +35,7 @@ string type > > As of v0.14, returning `false` from an event handler will no longer stop event propagation. Instead, `e.stopPropagation()` or `e.preventDefault()` should be triggered manually, as appropriate. -### Event pooling +### Event Pooling The `SyntheticEvent` is pooled. This means that the `SyntheticEvent` object will be reused and all properties will be nullified after the event callback has been invoked. This is for performance reasons.