Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Documentation for handling multiple options with <select> #531

Open
wants to merge 5 commits into
base: main
Choose a base branch
from
Open
Changes from 1 commit
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
36 changes: 29 additions & 7 deletions content/docs/forms.md
Original file line number Diff line number Diff line change
Expand Up @@ -182,13 +182,35 @@ 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.

> Note
>
> You can pass an array into the `value` attribute, allowing you to select multiple options in a `select` tag:
>
>```js
><select multiple={true} value={['B', 'C']}>
>```
### 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{4,10-12,24}
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(function(option){
return option.value;
});
this.setState({value: selectedFlavors});
}
```

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

```javascript{4,10-12,24}
<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)


## The file input Tag

In HTML, an `<input type="file">` lets the user choose one or more files from their device storage to be uploaded to a server or manipulated by JavaScript via the [File API](https://developer.mozilla.org/en-US/docs/Web/API/File/Using_files_from_web_applications).
Expand Down