У 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
, що повертає функцію.