Вычисляемое свойство Vue.js не работает

У меня есть объект данных пользователя, который имеет first_name и last_name и вычисляемое свойство, которое возвращает полное имя, но в моей директиве v-for не работает следующее?

new Vue({

        el: '#content',

        data: {
          "users": [
            {
              "id": 3,
              "first_name": "Joe",
              "last_name": "Blogs"
            },
            {
              "id": 3,
              "first_name": "Jane",
              "last_name": "Doe"
            }
          ]
       },
        computed: {
           fullName: function (user) {
                return user.first_name + ' ' + user.last_name;
            }

        }

    });



    <tr v-for="user in users | orderBy fullName(user)">
          <td class="col-xs-6 col-sm-3 col-md-3 col-lg-3">
              {{fullName(user)}} 
         </td>
    <tr>

person adam78    schedule 31.12.2015    source источник


Ответы (7)


Я не верю, что вычисляемое свойство в Vue.js может принимать аргумент, они должны иметь возможность создавать себя без дополнительного взаимодействия. Я считаю, что ваша вина заключалась в том, что вы написали метод, а затем попытались зарегистрировать его как вычисляемое свойство.

Таким образом, это должно быть простое решение - просто изменить регистрацию вашей функции с computed на methods, что и есть на самом деле.

methods: {
       fullName: function (user) {
            return user.first_name + ' ' + user.last_name;
        }

    }

Таким образом, вам не придется менять какой-либо другой код.

person Azeame    schedule 01.01.2016

Попробуйте отключить кеш для вычисляемого свойства, как указано в https://github.com/vuejs/vue/issues/1189. При этом вычисленное значение всегда будет пересчитываться.

computed: {
  fullName: {
    cache: false,
    get() {
      return user.first_name + ' ' + user.last_name;
    }
  }
}
person Fernanda Lemos    schedule 04.01.2017
comment
но в этом случае. откуда пользователь? - person Long Tran; 11.10.2019
comment
Устарело: vuejs.org/v2/guide/migration.html#cache -false-deprecated - person Hassan Ahmed; 11.12.2019

Вычисляемые свойства не поддерживают такое вложение.

Доказательство и некоторые обходные пути / альтернативные решения: https://github.com/vuejs/vue/issues/66

person ceejayoz    schedule 31.12.2015

Вы можете сопоставить пользователей в своем вычисляемом свойстве и использовать этот сопоставленный массив следующим образом:

computed: {
  fullName: function () {
    return this.users.map(
      item => item.first_name + ' ' + item.last_name
    );
  }
}

Тогда вы можете сделать что-то вроде:

<tr v-for="(user, item) in users">
   <td class="col-xs-6 col-sm-3 col-md-3 col-lg-3">
     {{fullName[item]}} 
   </td>
<tr>

И я использую стрелочную функцию es6. Если вы не хотите использовать стрелочную функцию, вы можете сделать что-то вроде:

return this.users.map(
  function(item) {return item.first_name + ' ' +item.last_name}
);
person Mali Naeemi    schedule 21.03.2017

У меня был аналогичный случай, когда я использовал свойство props с не очищенными вложенными свойствами. По какой-то причине я сделал эту работу

console.log(user.first_name)

       fullName: function (user) {
            console.log(user.first_name)
            return user.first_name + ' ' + user.last_name;
       }

Кроме того, я сделал эту работу, используя лямбда-выражение https://stackoverflow.com/a/46234335/726751

computed: {
    fullName: _this => {
        return _this.user.first_name + ' ' + _this.user.last_name;
    }
}
person Jorge Wander Santana Ureña    schedule 20.09.2017

Другая причина: свойства с префиксом подчеркивания (_) не будут запускать computed.

Сюрприз: префиксы _ и $ зарезервированы во Vue.

person laffuste    schedule 10.04.2019

У меня здесь похожий вопрос: Как динамически выполнять вычисления в Vue.js при динамически загружаемых данных.

Но, в конце концов, вот возможное решение для вас из заключения, которое я получаю после обсуждения и проб и ошибок. Есть несколько способов:

  1. создать расширитель, который назначает вычисленное внутри каждого элемента, а затем вызывает его, используя item.computedProperty() в пользовательском интерфейсе (с двойной скобкой)
  2. предположим, что данные загружены, например items, создайте наблюдателя, который назначит вычисленное каждому элементу, а затем поместит внутрь extendedItems. вычисленная функция станет реактивной при привязке к пользовательскому интерфейсу, поэтому пользовательский интерфейс будет использовать extendedItems вместо items
  3. используйте vue this.$set, чтобы вручную установить и включить реактивность вычисляемого.

Это вычислено с помощью функции из решения номер 1:

new Vue({

    el: '#content',

    data: {
      "users": [
        {
          "id": 3,
          "first_name": "Joe",
          "last_name": "Blogs"
        },
        {
          "id": 3,
          "first_name": "Jane",
          "last_name": "Doe"
        }
      ]
   },
    computed: {
        extendedUsers: function(){
            var users = this.users;
            for (var i in users)
                this.extendUser(users[i])

        },
        extendUser: function(user){
            user.fullName = function(){
                return user.first_name + " " + user.last_name;
            }
        }

    }

});



<tr v-for="user in users | orderBy user.fullName()">
      <td class="col-xs-6 col-sm-3 col-md-3 col-lg-3">
          {{user.fullName()}} 
     </td>
<tr>
person Hans Yulian    schedule 09.07.2018