【问题标题】:Why html shows the object returned by the computed property is ‘undefined’?为什么 html 显示计算属性返回的对象是“未定义的”?
【发布时间】:2019-02-12 06:42:58
【问题描述】:

我的 vue 项目出错。我使用 computed 返回一个对象。

computed: {
        getOpLog() {
            if (this.product_menu) {
                this.product_menu.forEach(opLogItem => {
                    if(opLogItem.id === 'menu_item_oplog') {
                        return opLogItem;
                    }
                });
            }
        }
    },

我的调试器显示我有正确的返回对象。

但是当我在浏览器中运行它时,它就不起作用了。

[Vue warn]: Error in render: "TypeError: Cannot read property 'hidden' of undefined"

这是我的 html。

<el-menu-item v-if="getOpLog.hidden" :id="getOpLog.id">
...
</el-menu-item>

但是当我使用这个时

getOpLog() {
    if (this.product_menu) {
        return this.product_menu[8]
    }
}

它工作。我想知道我该如何解决这个问题。Thx

【问题讨论】:

    标签: vue.js element-ui


    【解决方案1】:

    当 getter 中的 if 条件为 falseif (this.product_menu) 时,getter 将返回 undefined 对象。因此,Vue.js 抱怨。

    作为一种简单的补救措施,在v-if 中添加一个额外的检查,例如:

    <el-menu-item v-if="getOpLog && getOpLog.hidden" :id="getOpLog.id">
    ...
    </el-menu-item>
    

    此外,在数组的 forEach 函数中使用 return 并不会真正导致从实际的 getter 函数返回。它只是从内部箭头函数返回。您需要使用Array.prototype.find 方法修改您的代码:

    computed: {
        getOpLog() {
            if (this.product_menu) {
                const item = this.product_menu.find(opLogItem => {
                    return opLogItem.id === 'menu_item_oplog';
                });
    
                return item;
            }
        }
    };
    

    但是,如果 find 方法返回 undefined 值,您仍然应该使用 v-if 检查 getOpLog

    【讨论】:

    • 这样getOpLog总是未定义,el-menu-item永远不会显示
    • 是的,事情就是这样。但是如果你有getOpLogundefined,那么你也可以使用Vue.js 的v-else 指令来显示替代的内容/组件。
    • 这不是我的意思。我的意思是 getOpLog 需要返回一个在 js 中正确但在 html 中不正确的对象。我想弄清楚这一点。
    • @suedar,我再次阅读了您的代码并相应地修改了我的答案。这应该适合你。使用find 方法而不是forEach
    • 我不太清楚为什么。尝试将 debugger/console.log 放在 return item; 之前
    猜你喜欢
    • 2021-11-10
    • 2020-01-05
    • 1970-01-01
    • 1970-01-01
    • 2020-04-14
    • 2016-02-26
    • 1970-01-01
    • 2013-04-25
    • 1970-01-01
    相关资源
    最近更新 更多