简体   繁体   English

Vue.js - 如何在数组对象上实现计算属性?

[英]Vue.js - How to implement Computed properties on objects of array?

I have an array of objects inside my Vue instance, and for each item I'd like to write a Computed property.我的 Vue 实例中有一个对象数组,我想为每个项目编写一个 Computed 属性。

Each object has only two properties: firstName and lastName .每个对象只有两个属性: firstNamelastName I would like to write a Computed property for each named 'fullName', which is just a concatenation of firstName and lastName .我想为每个命名的“fullName”编写一个 Computed 属性,它只是firstNamelastName的串联。

I'm familiar with implementing Computed properties of data object properties of a Vue instances, but when it comes to doing so with elements of an array, I get confused.我熟悉实现 Vue 实例的数据对象属性的计算属性,但是当涉及到数组元素时,我感到困惑。

Currently, my code is this:目前,我的代码是这样的:

 var app = new Vue({ el: '#app', data: { names: [{ firstName: 'Mike', lastName: 'McDonald', done: false }, { firstName: 'Alex', lastName: 'Nemeth', done: false }, { firstName: 'Nate', lastName: 'Kostansek', done: true }, { firstName: 'Ivan', lastName: 'Wyrsta', done: true } ] }, computed: { fullName: function(name) { return name.lastName + ', ' + name.firstName; } } methods: { toggle: function(name) { name.done = !name.done; } } });
 <script src="https://cdn.jsdelivr.net/npm/vue@2.5.17/dist/vue.js"></script> <div id='app'> <ol> <li v-for='name in names'> <input type='checkbox' v-bind:checked='name.done' v-on:change='toggle(name)' /> <span v-if='!name.done'>{{ fullName(name) }}</span> <del v-else>{{ fullName(name) }}</del> </li> </ol> </div>

And here is the respective jsFiddle这是各自的jsFiddle

You could use fullname as method instead of computed property in your case :在您的情况下,您可以使用fullname作为方法而不是computed属性:

 var app = new Vue({ el: '#app', data: { names: [{ firstName: 'Mike', lastName: 'McDonald', done: false }, { firstName: 'Alex', lastName: 'Nemeth', done: false }, { firstName: 'Nate', lastName: 'Kostansek', done: true }, { firstName: 'Ivan', lastName: 'Wyrsta', done: true } ] }, computed: { }, methods: { fullName: function(name) { return name.lastName + ', ' + name.firstName; }, toggle: function(name) { name.done = !name.done; } } });
 <script src="https://cdn.jsdelivr.net/npm/vue@2.5.17/dist/vue.js"></script> <div id='app'> <ol> <li v-for='name in names'> <input type='checkbox' v-bind:checked='name.done' v-on:change='toggle(name)' /> <span v-if='!name.done'>{{ fullName(name) }}</span> <del v-else>{{ fullName(name) }}</del> </li> </ol> </div>

Another solution is to loop through names array inside a computed property by concatenating firstname and lastname , after that return this array and loop through it in your template另一种解决方案是通过连接firstnamelastname在计算属性中循环遍历names数组,然后返回此数组并在模板中循环遍历它

 var app = new Vue({ el: '#app', data: { names: [{ firstName: 'Mike', lastName: 'McDonald', done: false }, { firstName: 'Alex', lastName: 'Nemeth', done: false }, { firstName: 'Nate', lastName: 'Kostansek', done: true }, { firstName: 'Ivan', lastName: 'Wyrsta', done: true } ] }, computed: { fullNames() { return this.names.map(name => { let fl = {}; fl.fname = name.firstName + ", " + name.lastName; fl.done = name.done; return fl; }) } }, methods: { fullName: function(name) { return name.lastName + ', ' + name.firstName; }, toggle: function(name) { name.done = !name.done; } } });
 <script src="https://cdn.jsdelivr.net/npm/vue@2.5.17/dist/vue.js"></script> <div id='app'> <ol> <li v-for='name in fullNames'> <input type='checkbox' v-bind:checked='name.done' v-on:change='toggle(name)' /> <span v-if='!name.done'>{{ name.fname }}</span> <del v-else>{{ name.fname }}</del> </li> </ol> </div>

You can't use the 'computed' with a parameter.您不能将“计算”与参数一起使用。 Most probably you want to use a method:很可能您想使用一种方法:

example例子

<span>{{ fullName('Hi') }}</span>

methods: {
  fullName(param) {
      return `${this.param} ${this.firstName} ${this.lastName}`
  }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM