Radio Buttons no Vue.js
Os radio buttons permitem selecionar uma única opção dentro de um grupo de alternativas. Assim como ocorre com checkboxes, a diretiva v-model conecta o atributo checked a uma propriedade do Vue e monitora mudanças no valor por meio do evento change. O valor inicial é determinado pelo estado do atributo checked.
O exemplo abaixo mostra um conjunto de radio buttons que representam diferentes opções. Quando uma opção é selecionada, seu valor é armazenado na propriedade user:
<!DOCTYPE html>
<html>
  <head>
    <title>Explorando Vue.js</title>
    <meta charset="utf-8" />
  </head>
  <body>
    <script src="https://unpkg.com/vue"></script>
    <div id="app">
      <input type="radio" value="Tom" v-model="user" />
      <label>Tom</label><br />
      <input type="radio" value="Bob" v-model="user" />
      <label>Bob</label><br />
      <input type="radio" value="Sam" v-model="user" />
      <label>Sam</label><br />
      <span>Selecionado: {{ user }}</span>
    </div>
    <script>
      Vue.createApp({
        data() {
          return {
            user: "",
          };
        },
      }).mount("#app");
    </script>
  </body>
</html>Quando um radio button é selecionado, seu valor é armazenado na propriedade user e exibido na interface.

Radio Buttons Vinculados a Objetos
Cada radio button pode ser vinculado a um objeto, permitindo que a propriedade armazenada contenha mais informações. O atributo v-bind:value permite essa vinculação:
<!DOCTYPE html>
<html>
  <head>
    <title>Explorando Vue.js</title>
    <meta charset="utf-8" />
  </head>
  <body>
    <script src="https://unpkg.com/vue"></script>
    <div id="app">
      <input type="radio" v-bind:value="{ name: 'Tom', age: 22 }" v-model="user" />
      <label>Tom</label><br />
      <input type="radio" v-bind:value="{ name: 'Bob', age: 25 }" v-model="user" />
      <label>Bob</label><br />
      <input type="radio" v-bind:value="{ name: 'Sam', age: 28 }" v-model="user" />
      <label>Sam</label><br />
      <span v-if="user.name && user.age">Selecionado: {{ user.name }} - {{ user.age }}</span>
    </div>
    <script>
      Vue.createApp({
        data() {
          return {
            user: {},
          };
        },
      }).mount("#app");
    </script>
  </body>
</html>Quando um radio button é selecionado, o objeto correspondente é armazenado na propriedade user, permitindo acesso direto a seus atributos.

Em vez de definir manualmente cada radio button, uma abordagem mais eficiente é armazenar as opções em um array e criar os radio buttons dinamicamente:
<!DOCTYPE html>
<html>
  <head>
    <title>Explorando Vue.js</title>
    <meta charset="utf-8" />
  </head>
  <body>
    <div id="app">
      <template v-for="user in users">
        <input type="radio" v-bind:value="user" v-model="selectedUser" />
        <label>{{ user.name }}</label><br />
      </template>
      <span v-if="selectedUser">Selecionado: {{ selectedUser.name }} - {{ selectedUser.age }}</span>
    </div>
    <script src="https://unpkg.com/vue"></script>
    <script>
      Vue.createApp({
        data() {
          return {
            users: [
              { name: "Tom", age: 22 },
              { name: "Bob", age: 25 },
              { name: "Sam", age: 28 },
            ],
            selectedUser: null,
          };
        },
      }).mount("#app");
    </script>
  </body>
</html>Neste exemplo, o array users contém as opções disponíveis. O radio button selecionado é armazenado na propriedade selectedUser, que permite acesso direto aos atributos do objeto.
Documentação oficial: