Vue条件渲染

v-if

字符串模板中,我们可以像这样写一个条件块:


{{#if ok}}
    <h1></h1>
{{/if}}

在Vue中,我们使用v-if指令实现同样的功能:


<h1 v-if="ok"></h1>

也可以使用v-else添加一个else块:


<h1 v-if="ok">yes</h1>
<h1 v-else>Ne</h1>

(1)在<template>元素上使用v-if条件渲染分组
因为v-if是一个指令,所以必须将它添加到一个元素上,如果想切换多个元素呢?可以使用<template>元素当做不可见的包裹元素。并在上面使用v-if。最终渲染结果将不包含<template>


&lt;template v-if="ok"&gt;
    &lt;h1&gt;title&lt;/h1&gt;
    &lt;p&gt;text&lt;/p&gt;
&lt;/template&gt;

v-else

可以使用v-else指令来表示v-if的else块:


&lt;div v-if="Math.random() &gt; 0.5"&gt;&lt;/div&gt;
&lt;div v-else&gt;&lt;/div&gt;

v-else元素必须紧跟在v-if或者v-else-if的元素后面,否则它将不会被识别

v-else-if

2.1.0新增
v-else-if,充当v-if的else-if块:


&lt;div v-if="type==='a'"&gt;&lt;/div&gt;
&lt;div v-else-if="type==='b'"&gt;&lt;/div&gt;
&lt;div v-else&gt;&lt;/div&gt;

用key管理可复用的元素

Vue会尽可能高效的渲染元素,通常会复用已有元素而不是重头开始渲染。这样除了使vuebiande 非常快,还有其他一些好处,例如允许用户在不同的登录方式之间切换:


&lt;template v-if="login === 'a'"&gt;
    &lt;label&gt;username&lt;/label&gt;
    &lt;input /&gt;
&lt;/template&gt;
&lt;template v-else&gt;
    &lt;label&gt;Email&lt;/label&gt;
    &lt;input /&gt;
&lt;/template&gt;

如上,切换login,将不会清除用户已经输入的内,因为两个模板使用相同的元素,input元素不会被替换掉--仅仅替换了他的placeholder。

但是这样可能会被提bug,所以vue提供一种方式来表示这两个元素是完全独立的,只需要添加一个具有唯一值的key属性即可:


&lt;template v-if="loginType === 'username'"&gt;
  &lt;label&gt;Username&lt;/label&gt;
  &lt;input placeholder="Enter your username" key="username-input"&gt;
&lt;/template&gt;
&lt;template v-else&gt;
  &lt;label&gt;Email&lt;/label&gt;
  &lt;input placeholder="Enter your email address" key="email-input"&gt;
&lt;/template&gt;

如上,但是没有添加key的元素还是会被高效复用的。

v-show

另一个用于根据条件展示元素的选项是v-show指令。用法大致一样:


&lt;h1 v-show="ok"&gt;hello&lt;/h1&gt;

不同的是v-show的元素始终会被渲染并保存在DOM中,v-show只是简单的切换元素的display。

v-if vs v-show

v-if 是“真正”的条件渲染,因为它会确保在切换过程中条件块内的事件监听器和子组件适当地被销毁和重建。

v-if 也是惰性的:如果在初始渲染时条件为假,则什么也不做——直到条件第一次变为真时,才会开始渲染条件块。

相比之下,v-show 就简单得多——不管初始条件是什么,元素总是会被渲染,并且只是简单地基于 CSS 进行切换。

一般来说,v-if 有更高的切换开销,而 v-show 有更高的初始渲染开销。因此,如果需要非常频繁地切换,则使用 v-show 较好;如果在运行时条件很少改变,则使用 v-if 较好。

不推荐同时使用v-if和v-for!

来源:https://segmentfault.com/a/1190000016852402

原文地址:https://www.cnblogs.com/qixidi/p/10126264.html