Чи можна передавати параметри у computed-властивості у Vue.js?

У Vue.js computed-властивості (обчислювані властивості) не підтримують передавання параметрів напряму, оскільки вони кешуються та залежать тільки від реактивних змінних, визначених у їхньому тілі.

Якщо вам потрібно передати параметр у computed-властивість, є два підходи:


📌 1. Використання computed з filter() або find()

Якщо вам потрібно отримати значення залежно від змінної у data або ref, ви можете використовувати computed у поєднанні з filter() або find().

Приклад:

<template>
  <div>
    <input v-model="searchTerm" placeholder="Введіть ім'я" />
    <ul>
      <li v-for="user in filteredUsers" :key="user.id">{{ user.name }}</li>
    </ul>
  </div>
</template>

<script setup>
import { ref, computed } from 'vue';

const searchTerm = ref("");
const users = ref([
  { id: 1, name: "Олександр" },
  { id: 2, name: "Ірина" },
  { id: 3, name: "Марко" },
]);

const filteredUsers = computed(() => {
  return users.value.filter(user => 
    user.name.toLowerCase().includes(searchTerm.value.toLowerCase())
  );
});
</script>

Як працює?

  • filteredUsers автоматично оновлюється при зміні searchTerm.
  • computed працює без передачі параметра напряму, а використовує реактивне значення searchTerm.

📌 2. Використання methods замість computed

Якщо вам потрібно передати аргумент під час виклику, використовуйте методи (methods), оскільки вони не кешуються, на відміну від computed.

Приклад:

<template>
  <div>
    <input v-model="searchTerm" placeholder="Введіть ім'я" />
    <ul>
      <li v-for="user in filterUsers(searchTerm)" :key="user.id">{{ user.name }}</li>
    </ul>
  </div>
</template>

<script setup>
import { ref } from 'vue';

const searchTerm = ref("");
const users = ref([
  { id: 1, name: "Олександр" },
  { id: 2, name: "Ірина" },
  { id: 3, name: "Марко" },
]);

const filterUsers = (term) => {
  return users.value.filter(user => 
    user.name.toLowerCase().includes(term.toLowerCase())
  );
};
</script>

Як працює?

  • Тут функція filterUsers(searchTerm) викликається напряму у template з аргументом.
  • Використання methods дає гнучкість, але не використовує кешування як computed.

📌 3. Використання фабрики функцій у computed

Якщо вам обов’язково потрібно передавати параметр у computed, можна повернути функцію:

<template>
  <div>
    <ul>
      <li v-for="user in getUserById(2)" :key="user.id">{{ user.name }}</li>
    </ul>
  </div>
</template>

<script setup>
import { ref, computed } from 'vue';

const users = ref([
  { id: 1, name: "Олександр" },
  { id: 2, name: "Ірина" },
  { id: 3, name: "Марко" },
]);

const getUserById = computed(() => (id) => {
  return users.value.find(user => user.id === id);
});
</script>

Як працює?

  • getUserById – це computed, яке повертає функцію.
  • Потім у template можна викликати getUserById(2), щоб знайти користувача з id = 2.

⚠ Але: такий підхід не кешує результати для різних id, оскільки кожен раз створюється нова функція.


📌 Висновок: коли який підхід використовувати?

Підхід Коли використовувати?
computed без параметрів Коли результат залежить тільки від реактивних змінних (ref(), reactive()).
computed з .filter() або .find() Коли потрібно отримати значення на основі реактивних змінних.
methods Коли потрібно передавати параметри у функцію.
computed, що повертає функцію Якщо необхідно використовувати computed з параметрами, але без кешування.

🎯 Висновок

У computed-властивості НЕ можна передавати параметри напряму, оскільки вони не є функціями, які приймають аргументи.
Рішення: Використовуйте computed для залежностей від реактивних змінних, а для аргументів – methods або computed, що повертає функцію.

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *