【问题标题】:Vue.js computed property not workingVue.js 计算属性不起作用
【发布时间】:2016-04-05 17:54:03
【问题描述】:

我有一个用户数据对象,它有一个 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>

【问题讨论】:

    标签: vue.js computed-properties


    【解决方案1】:

    我不相信 Vue.js 中的计算属性可以接受参数,它们应该能够在没有额外交互的情况下构建自己。我相信你的错是你写了一个方法然后试图将它注册为一个计算属性。

    因此,只需将函数的注册从 computed 更改为 methods,这应该是一个简单的解决方法。

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

    这样您就不必更改任何其他代码。

    【讨论】:

    • 谢谢谢谢谢谢。就这么简单。我认为:)
    【解决方案2】:

    尝试禁用计算属性的缓存,如https://github.com/vuejs/vue/issues/1189 中所述。这样做,计算值将始终重新计算。

    computed: {
      fullName: {
        cache: false,
        get() {
          return user.first_name + ' ' + user.last_name;
        }
      }
    }
    

    【讨论】:

    【解决方案3】:

    计算属性不支持这样的嵌套。

    证明和一些解决方法/替代解决方案:https://github.com/vuejs/vue/issues/66

    【讨论】:

      【解决方案4】:

      您可以在您的计算属性中映射用户并像这样使用该映射数组:

      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}
      );
      

      【讨论】:

        【解决方案5】:

        当我使用带有未清除嵌套属性的 props 属性时,我遇到了类似的情况。出于某种原因,我做了一个

        console.log(user.first_name)

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

        另外,我使用 lambda 表达式完成了这项工作 https://stackoverflow.com/a/46234335/726751

        computed: {
            fullName: _this => {
                return _this.user.first_name + ' ' + _this.user.last_name;
            }
        }
        

        【讨论】:

          【解决方案6】:

          另一个原因:带有下划线 (_) 前缀的属性不会触发 computed

          惊喜:_$ 前缀是 reserved in Vue

          【讨论】:

            【解决方案7】:

            我在这里也有类似的问题:How to dinamically make computed in Vue.js, under dynamically loaded data

            但是,最后这是我在讨论和反复试验后得出的结论为您提供的可能解决方案。有几种方法:

            1. 创建扩展器,在每个元素内部分配计算,然后在 UI 中使用 item.computedProperty() 调用它(带双括号)
            2. 假设数据已加载,例如items,创建一个监视器,将计算分配给每个元素,然后放入extendedItems。当绑定到 UI 时,计算函数将变为响应式,因此 UI 将使用 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>
            

            【讨论】:

              猜你喜欢
              • 2015-08-19
              • 1970-01-01
              • 2017-08-26
              • 1970-01-01
              • 2017-02-02
              • 2019-08-08
              • 2017-10-06
              • 2017-10-07
              • 2014-06-09
              相关资源
              最近更新 更多