如果我这样做:
<div class="panel panel-default" v-if="socialiteLogins !== null">
小组不隐藏。如果我单独检查socialiteLogins === null
或使用==,它们都返回该对象不为空。它绝对是空的。如果我将它转储到页面上,我会得到[]作为结果。它是一个空的json对象。所以如果我试试这个:
<div class="panel panel-default" v-if="socialiteLogins.length !== 0">
小组仍然无法隐藏,我收到此错误:
无法读取属性&#39;长度&#39;为null
但如果我这样做:
<div class="panel panel-default" v-if="socialiteLogins !== null && socialiteLogins.length !== 0">
它完全隐藏了面板,初始加载时没有警告,但是当我稍后更新socialiteLogins变量时,如果它再次返回一个空的json对象,我会得到长度警告。知道为什么吗?
编辑:
添加它...如果我这样做:
<div class="panel panel-default" v-show="socialiteLogins">
它显示初始加载,即使没有,但如果我在页面加载后删除它正确隐藏面板。所以唯一的问题似乎是初始加载,因为它没有正确检测到没有记录。
答案 0 :(得分:8)
我不是Vue.js的专家,但以下内容适用于JS。
如果socialiteLogins
为null
或undefined
,则您无法读取length
的{{1}}属性。只有在socialiteLogins
是数组,对象或函数时才能读取。这就是你收到消息的原因:
无法读取属性&#39;长度&#39;为null
如果socialiteLogins
为undefined
或空数组socialiteLogins !== null
。但是,socialiteLogins == null
(请注意,这是使用松散比较)。
如果socialiteLogins
是一个空数组,它仍然是真的。 v-show
会将其视为true
。
这些事实的组合使您的代码无效。
在你的情况下,我认为这将有效:
<div class="panel panel-default" v-show="socialiteLogins && socialiteLogins.length">
工作原理:
JS &&
运算符计算第一个语句;如果它是真实的,它返回第二个语句的值。如果第一个语句是假的,则返回其值。
v-show
将表达式的结果强制转换为布尔值。
如果socialiteLogins
为undefined
或null
,则会返回该值,该值会强制为false
。
如果socialiteLogins
是一个空数组,socialiteLogins
是真的,那么&&
会返回第二个语句; socialiteLogins.length
将为0
。这也将被强制转移到false
。
如果socialiteLogins
是包含内容的数组,socialiteLogins
将是真实的,socialiteLogins.length
将是非零数字,将被强制转换为true
。< / p>
答案 1 :(得分:2)
@ RyanZim的回答有所帮助。这是解决方案,以防将来有人通过搜索来到这里。
问题源于数据的初始状态。例如,我有这个:
data: function() {
return {
socialiteLogins: null
}
},
适用于!== null但不适用于检查.length。稍后当它返回一个空对象时,.legnth将起作用但不是null。
因此,解决方案是将整个时间保持为正确的类型,以便我可以运行一致的检查:
data: function() {
return {
socialiteLogins: {}
}
},
编辑:对于将来找到此答案的任何人来说,这里的主要问题是没有使用正确的类型。如果要检查长度,则必须使用数组。对于对象,您可以计算键,而不是对象属性的长度。
答案 2 :(得分:0)
这是给您的提示。
<div class="panel panel-default" v-if="Object.keys(socialiteLogins).length > 0">
这就是我们的全部。
标记为已回答。