152.md 9.0 KB
Newer Older
W
wizardforcel 已提交
1
# 8.条件渲染第 2 部分(v-if 和 v-show)
W
init  
wizardforcel 已提交
2 3 4 5 6

> 原文: [https://javabeginnerstutorial.com/vue-js/8-conditional-rendering-part-2/](https://javabeginnerstutorial.com/vue-js/8-conditional-rendering-part-2/)

我们是否没有足够的指令来处理条件渲染? 我们还需要`v-show`吗? 还有另一件事困扰我们的大脑吗?

W
wizardforcel 已提交
7
但是该怎么办? 我们忙于观看 Netflix 时,Evan You(Vue 的创建者)出于某种原因添加了它。 因此,让我们看看为什么该指令首先存在。 *警告*:这篇文章是“[条件渲染第 1 部分](https://javabeginnerstutorial.com/vue-js/7-conditional-rendering-part-1/)”的继续,因此,我建议您在继续进行之前先充分了解这些概念。
W
init  
wizardforcel 已提交
8

W
wizardforcel 已提交
9
我们讨论了`v-if``v-else`等不仅可以应用于单个 HTML 元素,而且可以应用于使用`<div>``<template>`等的元素块。让我们首先来看一个带有`<template>`元素的示例 并了解它作为*不可见包装器*的行为,以最终结果呈现给 DOM。
W
init  
wizardforcel 已提交
10

W
wizardforcel 已提交
11
## 使用<模板>元素
W
init  
wizardforcel 已提交
12 13 14

让我们在`<template>`元素内包装标题和段落,并使用`v-if`指令为其指定条件。 除此之外,我们还要添加没有任何条件的另一段。

W
wizardforcel 已提交
15
首先,将`display`属性添加到 Vue 实例的数据对象,并为其赋予`true`值。
W
init  
wizardforcel 已提交
16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36

```java
data: {
    display: true
  }
```

其次,对`index.html`文件进行以下更改,

```java
 <template v-if="display">
        <h1>Welcome</h1>
        <p>Hi there!</p>
      </template>
      <p>How are you doing?</p> 
```

如果由于`display`设置为`true`而看到了输出,则`if`条件评估为`true`,并显示模板块中的元素。

![v-if template block](data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%20520%20532'%3E%3C/svg%3E)

W
wizardforcel 已提交
37
<noscript><img alt="v-if template block" class="alignnone size-full wp-image-14093" height="532" src="img/6e38ac6963bfa766ebb74bd9aa67b5ba.png" width="520"/><p>这里有趣的是,如果您打开浏览器的<strong>开发人员工具</strong>(在 Chrome 浏览器中为<em> Ctrl + Shift + I </em><em> F12 </em>),然后在 在[元素]标签中,[<code>&lt;template&gt;</code>]元素将不包含[]。 它神奇地变成了<strong>不可见的</strong></p><p><img alt="developer tools" class="alignnone size-full wp-image-14094" data-lazy-src="https://javabeginnerstutorial.com/wp-content/uploads/2018/11/10_p2-template-devTools.jpg" height="433" src="data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%20329%20433'%3E%3C/svg%3E" width="329"/></p><noscript><img alt="developer tools" class="alignnone size-full wp-image-14094" height="433" src="img/65cdd8584fd0a814f07052ca3cac578b.png" width="329"/><span class="ezoic-adpicker-ad" id="ezoic-pub-ad-placeholder-124"></span><span class="ezoic-ad box-4 adtester-container adtester-container-124" data-ez-name="javabeginnerstutorial_com-box-4" style="display:block !important;float:none;margin-bottom:2px !important;margin-left:0px !important;margin-right:0px !important;margin-top:2px !important;min-height:110px;min-width:728px;text-align:center !important;"><span class="ezoic-ad ezoic-adl" ezah="90" ezaw="728" id="div-gpt-ad-javabeginnerstutorial_com-box-4-0" style="position:relative;z-index:0;display:inline-block;min-height:90px;min-width:728px;"></span></span><p><strong> <em>注意:</em> </strong> <em><code>v-if</code>条件的值为<code>false</code>时,整个元素将从 DOM 中分离/删除。 当在我们的应用中不需要某个元素时,这通常是首选的行为,因为 DOM 中包含较少的元素会提高其性能。 </em></p><h2><strong> v-show 指令</strong></h2><p>作为开发人员的生活是如此变幻莫测! 我们经常遇到需要频繁显示和隐藏元素的情况,即在网页上打开和关闭。 在这种情况下,最好使用<code>v-show</code>指令。</p><h3><strong>使用 v-show 的原因</strong></h3><p>该指令将确保 DOM 中始终存在<strong>元素。 将显示条件是否为真(评估为<code>true</code>)。 当条件评估为<code>false</code>时,该元素将通过自动添加 CSS 属性<code>display: none</code>来隐藏! 听起来不有趣吗?</strong></p><p>这个概念可能很难缠住我们的头脑。 不用担心 我已经覆盖了你。 示例和屏幕截图可为我们提供帮助!</p><p>在前面的示例中,让我们将<code>v-show</code>指令添加到第二段标签中。</p><pre><code class="language-html">&lt;p v-show="display"&gt;How are you doing?&lt;/p&gt;</code></pre><p><code>display</code><code>true</code>时,<code>v-if</code><code>v-show</code>的行为类似。 浏览器输出和开发人员工具显示的结果与以前相同(请参阅“使用&lt;模板&gt;元素”标题下的“<strong>”下显示的两个图像)。 这里没有惊喜!</strong></p><p>让我们将<code>display</code>属性的值更改为<code>false</code>。 我们完整的代码如下所示:</p><h4><em> Index.js </em></h4><pre><code class="language-javascript">var app = new Vue({ el: "#app", data: { display: false } });</code></pre><h4><em> Index.html </em></h4><pre><code class="language-html">&lt;!DOCTYPE html&gt; &lt;html&gt; &lt;head&gt; &lt;title&gt;Hello Vue!&lt;/title&gt; &lt;!-- including Vue with development version CDN --&gt; &lt;script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"&gt;&lt;/script&gt; &lt;/head&gt; &lt;body&gt; &lt;div id="app"&gt; &lt;template v-if="display"&gt; &lt;h1&gt;Welcome&lt;/h1&gt; &lt;p&gt;Hi there!&lt;/p&gt; &lt;/template&gt; &lt;p v-show="display"&gt;How are you doing?&lt;/p&gt; &lt;/div&gt; &lt;!-- including index.js file --&gt; &lt;script src="index.js"&gt;&lt;/script&gt; &lt;/body&gt; &lt;/html&gt;</code></pre><p>顺便说一句,让我们继续查看浏览器的输出和开发人员工具的结果。</p><p><img alt="v-show hidden" class="alignnone size-full wp-image-14092" data-lazy-src="https://javabeginnerstutorial.com/wp-content/uploads/2018/11/13_p2-v-show-invisible-1.jpg" height="501" src="data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%20652%20501'%3E%3C/svg%3E" width="652"/></p><noscript><img alt="v-show hidden" class="alignnone size-full wp-image-14092" height="501" src="img/af8367091b132c8d43446a93f6ede57b.png" width="652"/><p>不出所料,由于<code>v-if</code><code>v-show</code>条件都评估为<code>false</code>,因此没有任何内容呈现给网页。 这里也没有什么魔术。 但是,当我们打开开发人员工具并仔细查看“<strong> Elements </strong>”窗格时,有很多东西需要解码。</p><ol><li>具有<strong> v-if </strong>伪指令的<code>&lt;template&gt;</code>元素(包含<code>&lt;h1&gt;</code><code>&lt;p&gt;</code>元素)在评估为<code>false</code>时,已从 DOM 中删除了<strong></strong></li><li>仅具有<strong> v-show </strong>指令的第二个<code>&lt;p&gt;</code>元素<strong>使用 CSS <code>display</code>属性切换元素的可见性</strong>。 元素始终附加到 DOM,并且始终显示<strong>。 它只是变得不可见。 就这样!</strong></li></ol><h3><strong>当心! </strong></h3><p>由于不支持将<code>v-show</code><code>&lt;template&gt;</code>元素一起使用,因此无法使用。 另外,它不适用于<code>v-else</code><code>if</code><code>else</code>是灵魂伴侣,你知道吗?!不是,<code>show</code><code>else</code>!)</p><h3><strong>那么,我应该使用 v-if 或 v-show 吗? </strong></h3><p>好问题! 如果您想<strong>切换</strong>,通常将<strong>经常切换为</strong>,因为 DOM 中始终存在该元素,请使用<strong> v-show </strong>,无论初始条件是否为<code>true</code><code>false</code>。 借助 CSS <code>display</code>属性只能切换可见性。 因此,初始渲染成本较高。</p><p>如果<strong>的状态<strong>的状态不经常更改/切换</strong>,尤其是在运行时,请使用<strong> v-if </strong>。 因为在这里附加和分离元素通常会变得昂贵。 另外,请记住,<code>v-if</code><strong>懒惰的</strong>,即,如果条件在初次渲染时评估为<code>false</code>,则直到条件变为<code>true</code>时,元素或块才会被渲染。 第一次。</strong></p><p>还在头上有雾吗? 不用担心! 练习是这里的关键。 抓住巫师的帽子和魔杖,尝试一些咒语(示例场景),您将掌握它! 顺便说一下,以上讨论的所有代码都可以在<a href="https://github.com/JBTAdmin/vuejs"> GitHub 仓库</a>中找到。</p><p>祝您有美好的一天!</p><div class="sticky-nav" style="font-size: 15px;"><div class="sticky-nav-image"></div><div class="sticky-nav-holder"><div class="sticky-nav_item"><h6 class="heading-sm">下一篇文章</h6></div><h5 class="sticky-nav_heading " style="font-size: 15px;"><a href="https://javabeginnerstutorial.com/vue-js/9-rendering-lists-part-1/" title="9\. Rendering Lists Part 1 (Iterating over arrays)"> 9.渲染列表第 1 部分(遍历数组)</a></h5></div></div> </body> </html></noscript>