【问题标题】:Vue.js Cannot read property 'length' of nullVue.js 无法读取 null 的属性“长度”
【发布时间】:2023-03-11 21:26:01
【问题描述】:

如果我这样做:

<div class="panel panel-default" v-if="socialiteLogins !== null">

面板不会隐藏。如果我单独检查socialiteLogins === null,或者使用==,它们都会返回该对象不为空。虽然它肯定是空的。如果我将它转储到页面上,我会得到 [] 作为结果。这是一个空的 json 对象。所以如果我试试这个:

<div class="panel panel-default" v-if="socialiteLogins.length !== 0">

面板仍然没有隐藏,我收到此错误:

无法读取 null 的属性“长度”

但如果我这样做:

<div class="panel panel-default" v-if="socialiteLogins !== null && socialiteLogins.length !== 0">

它完美地隐藏了面板,在初始加载时没有警告,但是当我稍后更新 socialiteLogins 变量时,如果它再次返回一个空的 json 对象,我会收到长度警告。知道为什么吗?

编辑:

添加到它...如果我这样做:

<div class="panel panel-default" v-show="socialiteLogins">

即使没有,它也会在初始加载时显示,但如果我在页面加载后删除它们,它会正确隐藏面板。所以唯一的问题似乎是初始加载没有正确检测到没有记录。

【问题讨论】:

  • 你的问题可能有错字;你说的第一个例子不起作用,但最后一个例子完全一样,你说它有效。
  • @RyanZim 有,谢谢,而且我做了更多测试,但仍然无法正常工作,所以我更新了问题。

标签: javascript vue.js


【解决方案1】:

我不是 Vue.js 方面的专家,但以下内容一般适用于 JS。


如果socialiteLoginsnullundefined,则无法读取它的length 属性。仅当socialiteLogins 是数组、对象或函数时才能读取。这就是您收到消息的原因:

无法读取 null 的属性“长度”

如果socialiteLoginsundefined 或一个空数组,则socialiteLogins !== null。但是,socialiteLogins == null(请注意,这是使用松散比较)。

如果socialiteLogins 是一个空数组,它仍然是真的。 v-show 会将其视为true

这些事实的结合使您的代码无法正常工作。


在你的情况下,我认为这会起作用:

 <div class="panel panel-default" v-show="socialiteLogins && socialiteLogins.length">

工作原理:

JS &amp;&amp; 运算符评估第一条语句;如果为真,则返回第二条语句的值。如果第一条语句是假的,则返回它的值。

v-show 将表达式的结果强制转换为布尔值。

如果socialiteLoginsundefinednull,则返回该值,该值被强制转换为false

如果socialiteLogins为空数组,socialiteLogins为真,所以&amp;&amp;返回第二条语句; socialiteLogins.length 将是 0。这也将被强制转换为 false

如果socialiteLogins 是一个有内容的数组,socialiteLogins 将是真实的,socialiteLogins.length 将是一个非零数字,它将被强制转换为true

【讨论】:

  • IMO, Citizen answer 下面更好。对我来说,最好定义一个初始状态,而不是到处添加检查。如果您必须在模板中检查此条件 10 次怎么办?在视图组件的data 中定义像socialiteLogins: [] 这样的状态对我来说是一个更好的解决方案。
【解决方案2】:

@RyanZim 的回答有所帮助。这是万一其他人将来通过搜索来到这里的解决方案。

问题源于数据的初始状态。例如,我有这个:

data: function() {
    return {
        socialiteLogins: null
    }
},

这适用于 !== null 但不适用于检查 .length。稍后当它返回一个空对象时,.legnth 将起作用,但不是 null。

所以解决方案是让它始终保持正确的类型,以便我可以运行一致的检查:

data: function() {
    return {
        socialiteLogins: []
    }
},

【讨论】:

  • 不确定是否是错字;如果将初始值设置为空数组 ([]) 而不是空对象,则代码的意图会更清晰。
  • 谢谢!节省了我很多时间
【解决方案3】:

这是给你的提示。

<div class="panel panel-default" v-if="Object.keys(socialiteLogins).length > 0">

到此为止。

标记为已回答。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-21
    • 2015-04-06
    • 2019-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-27
    相关资源
    最近更新 更多