Skip to content
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 27 additions & 0 deletions content/docs/forms.md
Original file line number Diff line number Diff line change
Expand Up @@ -182,6 +182,33 @@ class FlavorForm extends React.Component {

Overall, this makes it so that `<input type="text">`, `<textarea>`, and `<select>` all work very similarly - they all accept a `value` attribute that you can use to implement a controlled component.


### Handling multiple options with `<select>`

It is also possible to select multiple options within a `<select>` tag, by enabling the `multiple` attribute and passing an array into the `value` attribute. This array should contain the corresponding `value` attributes of the `<option>` tags inside the `<select>` tag.

The `handleChange` method from the above example would then change to get the selected values from `event.target.selectedOptions`.

```javascript{2}
handleChange(event) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The indentation is inconsistent for the rest of this page, which is 2 spaces for both HTML and JS. Do fix your markup accordingly (not sure if Prettier does that for you).

Also, you can simplify handleChange to:

const selectedFlavors = Array.from(event.target.selectedOptions).map(option => option.value);
this.setState({value: selectedFlavors});

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@yangshun Done. I was not sure if using arrow functions was OK for the docs or not, that is why decided to write it using function

const selectedFlavors = Array.from(event.target.selectedOptions).map(option => option.value);
this.setState({value: selectedFlavors});
}
```

The `<select>` inside the render would also change to pass an array to the `value` attribute:

```html
<select value={this.state.value} onChange={this.handleChange} multiple={true}>
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

2 spaces indentation.

<option value="grapefruit">Grapefruit</option>
<option value="lime">Lime</option>
<option value="coconut">Coconut</option>
<option value="mango">Mango</option>
</select>
```

[Try it on CodePen.](https://codepen.io/nupgrover/pen/RxeqLQ?editors=0010)

> Note
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This note below now looks confusing because we've just discussed it. Maybe move it above, and then expand on how to change it dynamically?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

True, I'll make the change

>
> You can pass an array into the `value` attribute, allowing you to select multiple options in a `select` tag:
Expand Down