Manipulando Arrays no Vue.js
No Vue.js, métodos específicos são definidos para simplificar o trabalho com arrays. Esses métodos permitem manipular os elementos de arrays diretamente:
push(), pop(), shift(), unshift(), splice(), sort(), reverse()
Esses métodos são implementações baseadas nos métodos JavaScript padrão de mesmo nome. Eles funcionam de forma semelhante, mas têm uma diferença importante: notificam o sistema Vue.js sobre as alterações no array, permitindo que o componente seja re-renderizado conforme necessário.
Além desses métodos, que modificam o array diretamente, há métodos como filter(), concat() e slice() que retornam novos arrays sem alterar o original. Quando esses métodos são usados, recomenda-se vinculá-los a propriedades computadas para garantir que as mudanças sejam refletidas na interface.
Adicionando e Removendo Elementos
O exemplo a seguir demonstra como adicionar um elemento a um array e como remover elementos usando o índice correspondente:
<!DOCTYPE html>
<html>
  <head>
    <title>Estudando Vue.js</title>
    <meta charset="utf-8" />
  </head>
  <body>
    <script src="https://unpkg.com/vue"></script>
    <div id="app">
      <p>
        <input type="text" v-model="newPhone" />
        <button v-on:click="phones.push(newPhone)">Adicionar</button>
      </p>
      <ul>
        <li v-for="(phone, index) in phones" :key="index">
          <p>{{ phone }} <button v-on:click="phones.splice(index, 1)">Remover</button></p>
        </li>
      </ul>
    </div>
    <script>
      Vue.createApp({
        data() {
          return {
            newPhone: "",
            phones: ["iPhone 16", "Samsung Galaxy S24", "Xiaomi Mi 11", "Motorola Edge 30"],
          };
        },
      }).mount("#app");
    </script>
  </body>
</html>Neste exemplo, ao clicar no botão, o valor inserido no campo de texto (armazenado em newPhone) é adicionado ao array phones. O Vue.js re-renderiza automaticamente a lista, exibindo o novo elemento. Para cada item da lista, há um botão que remove o elemento correspondente, com base no índice fornecido.

Retornando um Novo Array
Métodos como slice(), concat() e filter() geram novos arrays sem alterar o original. O exemplo a seguir mostra como redefinir um array existente com o valor retornado por slice():
<!DOCTYPE html>
<html>
  <head>
    <title>Estudando Vue.js</title>
    <meta charset="utf-8" />
  </head>
  <body>
    <script src="https://unpkg.com/vue"></script>
    <div id="app">
      <ul>
        <li v-for="phone in phones" :key="phone">
          <p>{{ phone }}</p>
        </li>
      </ul>
      <button v-on:click="updateList">Atualizar</button>
    </div>
    <script>
      Vue.createApp({
        data() {
          return {
            phones: ["iPhone 16", "Samsung Galaxy S24", "Xiaomi Mi 11", "Motorola Edge 30"],
          };
        },
        methods: {
          updateList() {
            this.phones = this.phones.slice(1, 3);
          },
        },
      }).mount("#app");
    </script>
  </body>
</html>Aqui, o método slice() retorna uma parte do array original, que é atribuída novamente ao atributo phones. Isso redefine os dados exibidos na interface.
 Antes de Clicar no Botão "Atualizar"
Antes de Clicar no Botão "Atualizar"
 Depois de Clicar no Botão "Atualizar"
Depois de Clicar no Botão "Atualizar"
Embora funcional, essa abordagem pode não ser ideal se o array original precisar ser preservado. Em situações como essa, a separação entre os dados e a sua representação visual é preferível.
Uma solução mais eficiente é o uso de propriedades computadas para representar subconjuntos do array, sem modificar os dados originais:
<!DOCTYPE html>
<html>
  <head>
    <title>Estudando Vue.js</title>
    <meta charset="utf-8" />
  </head>
  <body>
    <script src="https://unpkg.com/vue"></script>
    <div id="app">
      <input v-model.number="start" type="number" />
      <input v-model.number="end" type="number" />
      <ul>
        <li v-for="phone in visibleList" :key="phone">
          <p>{{ phone }}</p>
        </li>
      </ul>
    </div>
    <script>
      Vue.createApp({
        data() {
          return {
            start: 0,
            end: 3,
            phones: ["iPhone 16", "Samsung Galaxy S24", "Xiaomi Mi 11", "Motorola Edge 30"],
          };
        },
        computed: {
          visibleList() {
            return this.phones.slice(this.start, this.end);
          },
        },
      }).mount("#app");
    </script>
  </body>
</html>Neste exemplo, as propriedades start e end permitem ao usuário definir o intervalo de elementos exibidos. A propriedade computada visibleList utiliza o método slice() para retornar o subconjunto correspondente do array original. Isso garante que as alterações no intervalo se reflitam na interface, enquanto o array original permanece intacto.

Documentação oficial: