React vs Vue — Handling Selections
Tags: webdev, react, vue, javascript
Published: 2021-01-21 21:49:21

**Check out my books on Amazon at https://www.amazon.com/John-Au-Yeung/e/B08FT5NT62**

**Subscribe to my email list now at http://jauyeung.net/subscribe/**


React is the most popular front end library for the last few years. Vue is a front end framework that’s catching up quickly.

It’s hard to choose between the 2 frameworks since they both have their pros and cons.

In this article, we’ll compare how React and Vue frameworks handle form radio button and drop-down selections and which one is easier for developers.

### Radio Buttons

With Vue, we can use the `v-model` directive to bind the radio button choices to the component’s model directly.

For example, with Vue, we write the following to add a set of radio buttons and display the selected choice on the screen:

`index.html` :

```
<!DOCTYPE html>
<html lang="en">
  <head>
    <title>App</title>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  </head>
  <body>
    <div id="app">
      <input type="radio" value="One" v-model="picked" />
      <label>One</label>
      <br />
      <input type="radio" value="Two" v-model="picked" />
      <label>Two</label>
      <br />
      <span>Picked: {{ picked }}</span>
    </div>
    <script src="index.js"></script>
  </body>
</html>
```

`index.js` :

```
const app = new Vue({
  el: "#app",
  data: {
    picked: ""
  }
});
```

In the code above, we just set the value of `v-model` of both radio buttons to the same `picked` model.

Then when we click either radio button, we’ll see the selected choice show in the span.

With React, we have to add the `checked` prop to each radio button so that only the value that’s selected is checked.

For instance, we write the following to rewrite the example above with React:

```
import React, { useState } from "react";

export default function App() {
  const [picked, setPicked] = useState("");
  const handleClick = e => setPicked(e.target.value);

  return (
    <div className="App">
      <input
        type="radio"
        value="One"
        checked={picked === "One"}
        onClick={handleClick}
      />
      <label>One</label>
      <br />
      <input
        type="radio"
        value="Two"
        checked={picked === "Two"}
        onClick={handleClick}
      />
      <label>Two</label>
      <br />
      <span>Picked: {picked}</span>
    </div>
  );
}
```

In the code above, we have the same 2 radio buttons as in the Vue example, but we added a `onClick` handler to set the `picked` state, and we also have the `checked` attribute to indicate when they should be checked.

We indicate that we only want them selected when the given value is picked.

This is extra work that we don’t have to with Vue.

### Handling Drop-Down Selections

We can use `v-model` to bind directly to the selected value of the dropdown with Vue.

Therefore, we can write the following to create a drop-down and then display the selected choice:

`index.html` :

```
<!DOCTYPE html>
<html lang="en">
  <head>
    <title>App</title>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  </head>
  <body>
    <div id="app">
      <select v-model="picked">
        <option>One</option>
        <option>Two</option>
      </select>
      <br />
      <span>Picked: {{ picked }}</span>
    </div>
    <script src="index.js"></script>
  </body>
</html>
```

`index.js` :

```
const app = new Vue({
  el: "#app",
  data: {
    picked: ""
  }
});
```

In the code above, we created a dropdown and then bind the selected value to the `picked` model in the Vue component.

Then we referenced `picked` to display the selected choice in the span.

We didn’t have to specify the value if the value and the displayed text are the same.

With React, we write the following code to handle setting the selected value from a dropdown:

```
import React, { useState } from "react";

export default function App() {
  const [picked, setPicked] = useState("");

  return (
    <div className="App">
      <select onChange={e => setPicked(e.target.value)}>
        <option>One</option>
        <option>Two</option>
      </select>
      <br />
      <span>Picked: {picked}</span>
    </div>
  );
}
```

To handle change in the value of a dropdown, we pass in an event handler to set the selected value to the `picked` state.

Then we display it in the span below the dropdown.

The Vue and React examples are pretty close with respect to handling dropdowns.

### Multiple Selections

With Vue, it’s easy to handle the values of select elements that let users select multiple values.

We can write the following code to do that:

`index.html` :

```
<!DOCTYPE html>
<html lang="en">
  <head>
    <title>App</title>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  </head>
  <body>
    <div id="app">
      <select v-model="picked" multiple>
        <option>One</option>
        <option>Two</option>
        <option>Three</option>
      </select>
      <br />
      <span>Picked: {{ picked }}</span>
    </div>
    <script src="index.js"></script>
  </body>
</html>
```

`index.js` :

```
const app = new Vue({
  el: "#app",
  data: {
    picked: []
  }
});
```

In the code above, we have a select element with the `multiple` attribute to enable multiple selection.

Then we just bind to the `picked` array with `v-model` and reference the `picked` array straight in the template to display the selected choices.

With React, we have to write the following to get the selected choices and display them:

```
import React, { useState } from "react";

export default function App() {
  const [picked, setPicked] = useState([]);

  return (
    <div className="App">
      <select
        multiple
        onChange={e =>
          setPicked([...e.target.selectedOptions].map(o => o.value))
        }
      >
        <option>One</option>
        <option>Two</option>
        <option>Three</option>
      </select>
      <br />
      <span>Picked: {picked.join(", ")}</span>
    </div>
  );
}
```

In the code, we reference:

```
[...e.target.selectedOptions].map(o => o.value)
```

to get the selected options from the select element and then get the `value` property of each entry and put them in the `picked` array.

Then we display the `picked` entries by call `join` to combine the choices into one string.

As we can see, we have to do lots of things that we didn’t have to do in the Vue example to get equivalent functionality.

There’s way more logic involved just to get the selections from a select element that lets the user choose multiple choices.

Also, we have to spread the `e.target.selectedOptions` object so that we convert it to an array. `e.target.selectedOptions` is an array-like object, which isn’t an array.

### Verdict

Vue is definitely better with handling radio buttons and select elements that let us choose multiple choices.

The `v-model` directive took care of most of the hard work of extracting the selected choices and displaying the data.

With React, we have to write our own code to extract the selected choices and display them also takes some work.