Могу ли я передать параметры в вычисляемых свойствах в Vue.Js
можно ли передать параметр в вычисляемые свойства в Vue.Js. Я вижу, что при использовании getters/setter с помощью computed они могут взять параметр и назначить его переменной. как здесь от документация:
// ...
computed: {
fullName: {
// getter
get: function () {
return this.firstName + ' ' + this.lastName
},
// setter
set: function (newValue) {
var names = newValue.split(' ')
this.firstName = names[0]
this.lastName = names[names.length - 1]
}
}
}
// ...
это тоже можно:
// ...
computed: {
fullName: function (salut) {
return salut + ' ' + this.firstName + ' ' + this.lastName
}
}
// ...
где вычисляемое свойство принимает аргумент и возвращает желаемый результат. Однако, когда я пытаюсь это, я получаю эту ошибку:
vue.общий.js: 2250 Uncaught TypeError: fullName-это не функция(...)
должен ли я использовать методы для таких случаев?
6 ответов:
скорее всего, вы хотите использовать метод:
<span>{{ fullName('Hi') }}</span> methods: { fullName(salut) { return `${salut} ${this.firstName} ${this.lastName}` } }
более длинное объяснение
технически вы можете использовать вычисленное свойство с таким параметром:
computed: { fullName() { return salut => `${salut} ${this.firstName} ${this.lastName}` } }(спасибо
Unirgyдля базового кода для этого.)разница между вычисляемым свойством и методом заключается в том, что вычисляемые свойства кэшируются и меняются только тогда, когда меняются их зависимости. А способ будет оценивать каждый раз его называется. Нет никаких преимуществ использования этого подхода над вычисляемым свойством в таком случае. Вы можете прочитать больше об этом в документации Vuehttps://vuejs.org/v2/guide/computed.html#Computed-Caching-vs-Methods
эта ситуация немного отличается при использовании Vuex. Насколько мне известно, в Vuex это единственный способ одновременно получить результат параметризованных из магазина (действия асинхронного). Таким образом, этот подход указан в официальной документации Vuex для его газопоглотители https://vuex.vuejs.org/guide/getters.html#method-style-access
вы можете использовать методы, но я предпочитаю по-прежнему использовать вычисляемые свойства вместо методов, если они не изменяют данные или не имеют внешних эффектов.
вы можете передать аргументы вычисляемым свойствам таким образом (не документировано, но предложено сопровождающими, не помню где):
computed: { fullName: function () { var vm = this; return function (salut) { return salut + ' ' + vm.firstName + ' ' + vm.lastName; }; } }EDIT: пожалуйста, не используйте это решение, оно только усложняет код без каких-либо преимуществ.
ну, технически говоря, мы можем передать параметр вычисляемой функции, так же, как мы можем передать параметр функции геттера в vuex. Такая функция является функцией, которая возвращает функцию.
например, в геттерах магазина:
{ itemById: function(state) { return (id) => state.itemPool[id]; } }этот геттер может быть сопоставлен с вычисленными функциями компонента:
computed: { ...mapGetters([ 'ids', 'itemById' ]) }и мы можем использовать эту вычисленную функцию в нашем шаблоне следующим образом:
<div v-for="id in ids" :key="id">{{itemById(id).description}}</div>мы можем применить тот же подход для создания вычисляемого метода, который принимает параметр.
computed: { ...mapGetters([ 'ids', 'itemById' ]), descriptionById: function() { return (id) => this.itemById(id).description; } }и использовать его в нашем шаблоне:
<div v-for="id in ids" :key="id">{{descriptionById(id)}}</div>при этом я не говорю здесь, что это правильный способ делать вещи с Vue.
однако я мог заметить, что когда элемент с указанным идентификатором мутирует в магазине, представление автоматически обновляет свое содержимое с новыми свойствами этого элемента (привязка, похоже, работает нормально).
да методы существуют для использования параметров. Как и ответы, приведенные выше, в вашем примере лучше всего использовать методы, так как выполнение очень легкое.
только для справки, в ситуации, когда метод является сложным и стоимость высока, вы можете кэшировать результаты следующим образом:
data() { return { fullNameCache:{} }; } methods: { fullName(salut) { if (!this.fullNameCache[salut]) { this.fullNameCache[salut] = salut + ' ' + this.firstName + ' ' + this.lastName; } return this.fullNameCache[salut]; } }Примечание: при использовании этого, следите за памятью, если речь идет о тысячах
вы можете передать параметры, но это не Вью.js путь или то, как вы делаете это неправильно.
однако есть случаи, когда вам нужно это сделать.Я покажу вам простой пример передачи значения в вычисляемое свойство с помощью getter и setter.
<template> <div> Your name is {{get_name}} <!-- John Doe at the beginning --> <button @click="name = 'Roland'">Change it</button> </div> </template>и скрипт
export default { data: () => ({ name: 'John Doe' }), computed:{ get_name: { get () { return this.name }, set (new_name) { this.name = new_name } }, } }при нажатии кнопки мы передаем вычисляемому свойству имя 'Roland' и в
set()мы меняем имя с 'John Doe' на 'Ролан'.Ниже приведен общий случай использования, когда вычисляется используется с геттером и сеттером. Скажем, у вас есть следующий магазин vuex:
export default new Vuex.Store({ state: { name: 'John Doe' }, getters: { get_name: state => state.name }, mutations: { set_name: (state, payload) => state.name = payload }, })и в вашем компоненте вы хотите добавить
v-modelна вход, но с помощью магазина vuex.<template> <div> <input type="text" v-model="get_name"> {{get_name}} </div> </template> <script> export default { computed:{ get_name: { get () { return this.$store.getters.get_name }, set (new_name) { this.$store.commit('set_name', new_name) } }, } } </script>
Я не совсем уверен,что вы пытаетесь достичь, но похоже, что вы будете прекрасно использовать метод вместо вычисленного!
Comments