【问题标题】:How to conditionally display in Vue, only if Firestore field value matches a specific string value?仅当 Firestore 字段值与特定字符串值匹配时,如何在 Vue 中有条件地显示?
【发布时间】:2021-10-22 04:52:26
【问题描述】:

Firestore 数据库字段(review 集合中的reviewPrivacy)是字符串类型,从具有三个可能答案(值)之一的 Vue 表单条目(单选)填充:keepFullyPrivate 在其中。

如果review.reviewPrivacy 的值为keepFullyPrivate,我试图仅显示<h2>The reviewer's identity is private</h2>

一旦这工作正常,我将添加一个v-if-else,然后是v-else 选项,为每个选项显示不同的内容。

我的代码如下。

VSC 中没有标记任何错误,但 review.reviewPrivacy 的值是什么并不重要 - <h2> 标记中的文本始终显示,无论它是否等于 keepFullyPrivate

<div v-if="('review.reviewPrivacy', '==', 'keepFullyPrivate')"><h2>The reviewer's identity is private</h2></div> 

更新(附加信息):

  • 我使用的是 Vue 版本 3.2.1
  • 从 Firestore 获取的数据正确。例如,在与上述代码相同的父级中,这一行 &lt;p&gt; Privacy choice for this review: {{ review.reviewPrivacy }} &lt;/p&gt; 在 DOM 中产生以下文本:此评论的隐私选择:postAnonPublic,即v-else-if 条件。

第二次更新:按照 cmets 的要求将代码作为一个完整的块:

<div class="review-detailZ">
<div> <!-- BEGIN main (left-hand) column -->
  <p> Privacy choice for this review: {{ review.reviewPrivacy }} </p>
  <br />
   
  <!-- Using Vue version 3.2.1 -->
          
   <div v-if="('review.reviewPrivacy', '==', 'keepFullyPrivate')"><h2>The reviewer's identity is private</h2></div>
   <div v-else-if="('review.reviewPrivacy', '==', 'postAnonPublic')"><h2>Incognito - review by{{ review.userName }}</h2></div> 
   <div v-else><h2>Reviewer chose to be fully public - full name is {{ review.userFirstName }} {{ review.userLastName }}</h2></div>
   
  <br />
  <p>Created {{ review.createdAt }} days ago</p>
  <br />
</div>

谢谢!

【问题讨论】:

  • 很难找出问题所在,因为代码被分成不同的部分。你能分享完整的完整(minimal, reproducible example)吗?
  • 没有v-if="review.reviewPrivacy === keepFullyPrivate"&gt;v-else-if="review.reviewPrivacy === 'postAnonPublic'" 工作?进行此更改后,您是否尝试过重新启动 Vue 服务器

标签: vue.js google-cloud-firestore conditional-formatting


【解决方案1】:

我看到了两种方法:

A) 您可以创建一个计算属性“showSectionX ()”来进行比较:

[...]

<div v-if="showSectionX"><h2>The reviewer's identity is private</h2></div>

[...]

computed: {
  showSectionX () {
    return this.review.reviewPrivacy === 'keepFullyPrivate'
  }
}

[...]

如果X,您当然应该使用描述本节目的的词。

B) 你可以直接在 v-if 中进行比较:

[...]

<div v-if="review.reviewPrivacy === 'keepFullyPrivate'"><h2>The reviewer's identity is private</h2></div>

[...]

我猜后者是你试图做的但使用了错误的语法。

【讨论】:

  • 谢谢@Fred。就在您发布解决方案之前,我使用了 Dharmaraj 的建议来正确实施 Tony19 的解决方案,该解决方案运行良好。最好的,-M
  • 如果您在视图或组件的不同位置使用此比较,我建议使用计算属性以避免重复。
  • 感谢@Fred。会的!
【解决方案2】:

('review.reviewPrivacy', '==', 'keepFullyPrivate') 只是一个逗号分隔的字符串组,它的计算结果为最后一个字符串:'keepFullyPrivate',因此您的标记变为v-if="'keepFullyPrivate'",这始终是真实的。因此,div 及其h2 始终会被渲染。

比较review.reviewPrivacy'keepFullyPrivate' 的正确表达式是:

review.reviewPrivacy == 'keepFullyPrivate'

// or even better:
review.reviewPrivacy === 'keepFullyPrivate'

对于strict comparison,最好使用三等号 (===)。

所以最终结果应该是:

<div v-if="review.reviewPrivacy === 'keepFullyPrivate'"><h2>The reviewer's identity is private</h2></div>

【讨论】:

  • 很高兴它为您工作。通常不需要重新启动开发服务器。出于好奇,您使用的是什么开发服务器?
【解决方案3】:

new Vue({
  el: "#app",
  data: {
    review: { reviewPrivacy:0 },
    keepFullyPrivate:0
  }
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.16/vue.js"></script>
<div id="app">
<div v-if="review.reviewPrivacy == keepFullyPrivate">
   <h2>The reviewer's identity is private</h2>
</div>
<div v-else>
<h2>else part</h2>
</div>
</div>

【讨论】:

  • 谢谢@k-sridhar-reddy。我尝试了您的解决方案,但当时它对我不起作用,但我未能采取重新启动 Vue 服务器的重要步骤。一旦我这样做了,Tony19 的解决方案就奏效了(你也可能奏效,但我没有发短信给它)。最好的,-M
  • @MarkGavagan 谢谢..,实际上是新的 Vue({ el: "#app", data: { review: { reviewPrivacy:0 }, keepFullyPrivate:'keepFullyPrivate' ---> //inplace零,你需要放置它是另一种方式}})很高兴看到你快乐
  • 谢谢,@k-sridhar-reddy
猜你喜欢
  • 2014-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-07
  • 2013-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多