全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

vue.js实现条件渲染的实例代码

一、初探条件渲染

vue 的条件渲染,仍旧依赖于指令系统,下面逐个介绍:

(1)v-if

<div id="app">
  <div v-if="c1">c1</div>
</div>
......
var app = new Vue({
  el: '#app',
  data: {
    c1: false
  }
});

当 c1 为真值的时候,渲染出 v-if 所绑定的元素,否则不渲染出该元素。渲染结果如下:

<div id="app"></div>

(2)v-else

<div id="app">
  <div v-if="c1">c1</div>
  <div v-else>c1 is not true</div>
</div>
......
var app = new Vue({
  el: '#app',
  data: {
    c1: false
  }
});

当 c1 为真值的时候,渲染 v-if 所绑定的元素,否则渲染 v-else 所绑定的元素。这里值得注意的是,在 Handlebars 模板引擎里面,else 可以和 each 所搭配,当遍历次数为0的时候,则渲染 else 块所对应的内容;而对于 vue,官方给出的说法是,每个 v-else 所绑定语句必须绑定在 v-if 或者 v-else-if 语句的后面。一开始我还抱有一丝希望地去试了一下,结果。。。

遍历次数为0的时候,v-else 绑定的元素没有渲染出来,而且控制台还报错了。

个人感觉,在这一方面,vue 的模板引擎可能有所欠缺。虽然说,我们可以利用在循环中添加条件判断实现相同的功能,但却需要添加额外的代码。

(3)v-else-if

<div id="app">
  <div v-if="c1">c1</div>
  <div v-else-if="c2">c2</div>
</div>
......
var app = new Vue({
  el: '#app',
  data: {
    c1: false,
    c2: true
  }
});

这里先检查 c1 是否为真值,是则渲染出 v-if 绑定的元素,否则检查 c2 是否为真值,是则渲染出 v-else-if 所绑定的元素。如果 c1 / c2 都不为真值,则都不渲染。渲染结果如下:

<div id="app">
  <div>c2</div>
</div>

不难理解,v-if、 v-else、 v-else-if 跟类 C 语言中的 if、else、else if 功能相仿。

二、条件渲染优化

除了提供跟类 C 语言中的 if、else、else if 相似的功能以外,vue 还为开发者提供了性能优化方案。

(1)v-show

v-show 有着和 v-if 相似而又不同的功能,v-if 依赖于控制 DOM 节点,而 v-show 是依赖于控制 DOM 节点的 display 属性。

<div id="app">
  <div v-show="c4">c4</div>
</div>
......
var app = new Vue({
  el: '#app',
  data: {
    c4: false
  }
});

当 v-show 绑定的值为真值的时候,节点正常渲染;当为假值的时候,节点仍旧渲染,但是添加了 style="display:none;",将节点通过 CSS 的方式隐藏。渲染结果如下:

<div id="app">
  <div style="display: none;">c4</div>
</div>

相比于 v-if,v-show 其实不管在什么条件下,一开始都会进行节点的渲染,而后续的状态切换都是基于 CSS 实现的。针对状态需要频繁切换状态的节点,v-show 相对于直接修改 DOM 节点的 v-if 有更好的性能。

然而,v-show 的缺点也是显而易见的,不管初始条件如何,它都将进行 DOM 节点的渲染,这对首屏加载优化不一定是个好事情。

(2)key

在使用 v-if 等指令的时候,vue 会尽可能地复用已经渲染的元素,而不是全部地重头渲染。例如一对绑定 v-if 与 v-else 的元素,如果二者内部 DOM 元素相同,则可能在所绑定数据改变时,只更新绑定了的属性,其它通过用户操作或者 JS 修改了的属性将被保留。

<div id="app">
  <form>
    <div class="input-group" v-if="name">
      <label for="name">name:</label>
      <input type="text" name="name" placeholder="user name" />
    </div>

    <div class="input-group" v-else>
      <label for="email">email:</label>
      <input type="text" name="email" placeholder="email" />
    </div>

    <button v-on:click.prevent="toggle">toggle</button>
  </form>
</div>
......
var app = new Vue({
  el: '#app',
  data: {
    name: true
  },
  methods: {
    toggle: function () {
      this.name = ! this.name;
    }
  }
});

这里就是如此,点击 toggle 按钮的时候,v-if 所绑定的值会切换,相应的,DOM 节点也会跟着切换,但是实际上,由于 vue 重用了 input 元素,切换的同时,用户填写的内容并没有被清空。同理,label 元素在切换的工程中,其实也只是修改了 for 属性和元素内的文字,并没有销毁原有 DOM 节点和生成新的 DOM节点。

但是 vue 做的这种优化并不总是为人们所需要的,不需要它的时候,我们为这个元素添加一个唯一的 key 值就可以了。

<div id="app">
  <form>
    <div class="input-group" v-if="name">
      <label for="name">name:</label>
      <input type="text" name="name" placeholder="user name" key="name" />
    </div>

    <div class="input-group" v-else>
      <label for="email">email:</label>
      <input type="text" name="email" placeholder="email" key="email" />
    </div>

    <button v-on:click.prevent="toggle">toggle</button>
  </form>
</div>
......
var app = new Vue({
  el: '#app',
  data: {
    name: true
  },
  methods: {
    toggle: function () {
      this.name = ! this.name;
    }
  }
});

像这样,为这两个不需要“优化”的 input 元素添加了唯一标识的 key 以后,vue 便不会再复用这两个元素。每次切换之后,修改的内容将不会被保留。

三、更多思考

(1)基于标签的指令(v-bind 、v-if)

Handlebars 的 helpers 有自己独立的语法,比如:

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

它定义了一组自己的语法。而实现同样的功能,vue 使用类似于 v-bind、v-if 之类的指令,它们都是绑定在一个个标签上面的,如

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

这样的语法更加简洁、清晰。

Handlebars 的语法,支持同时绑定多个 DOM 节点。

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

按照前面的思路,难道 vue 要实现成这样?

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

那根本不可能,添加额外的 DOM 节点包裹住它们?那就更不可能。vue 扩展了一个 template 节点,使用的时候,我们可以像 HTML 节点一样去使用它,但是渲染页面的时候,它不会被渲染在页面上。于是,前面的代码可以实现成这样:

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

想想,其实和 Handlebars 也差不多了,甚至显得还要复杂些了,毕竟 template 这个单词这么长~

(2)利用条件渲染字符串

前面说,v-if 等指令都是基于标签的,那如果我不想创建额外的标签,只是想按照条件去修改一个字符串呢?没错,你猜对了,template 节点,它里面除了可以存放节点,也可以直接存放字符串,就像这样:

<div id="app">
  <template v-if="c3">text</template>
</div>
......
var app = new Vue({
  el: '#app',
  data: {
    c3: true
  }
});

渲染结果:

<div id="app">text</div>

这里其实也就是利用了 template 节点不会被渲染在页面上的特性。

(3)属性的“条件渲染”

既然 HTML 节点可以条件渲染,多个 HTML 节点可以条件渲染,HTML 节点内字符串可以条件渲染,那么 HTML 属性呢?在编写模板的时候,HTML 属性其实也是字符串,我们能想上面那样,利用 template 模板创建字符串作为 HTML 的属性吗?

复制代码 代码如下:
<div title="<template v-if='c3'>title content</template>">此处应有 title</div>

是不是一看就感觉怪怪的?vue 也这样觉得,于是控制台里就解析成了:

复制代码 代码如下:
<div title="<template v-if='c3'>title content</template>">此处应有 title</div>

中间的 <template v-if='c3'>title content</template> 整个的被识别成了字符串,那如果去掉外面的双引号呢?

复制代码 代码如下:
<div title=<template v-if='c3'>title content</template>>此处应有 title</div>

好像看起来更奇怪了。最后的渲染结果:

<div title="<template">title content&gt;此处应有 title</div>

vue 的模板解析不是简单的依赖于字符串的解析,所以其实这里不能使用这种方法。正确的姿势是利用 v-bind 指令:

<div v-bind:title="c3 ? 'title content' : '' ">title</div>

因为 v-bind 指令的预期值实际上可以接受 js 表达式的,这里我们传入了一个条件表达式。当 c3 为真值的时候,渲染为 title="title content",当 c3 为假值的时候,渲染为 title=""。


# vue.js  # 条件渲染  # vue  # 深入理解Vue 的条件渲染和列表渲染  # 简单理解Vue条件渲染  # 学习vue.js条件渲染  # 浅析Vue.js 中的条件渲染指令  # Vuejs第一篇之入门教程详解(单向绑定、双向绑定、列表渲染、响应函数)  # 详解vuejs之v-for列表渲染  # Vue.JS入门教程之列表渲染  # Vue基础教程之条件渲染和列表渲染  # 绑定  # 都是  # 成了  # 多个  # 不需要  # 依赖于  # 这两个  # 数为  # 自己的  # 复用  # 的是  # 是个  # 不可能  # 我还  # 都不  # 也会  # 就像  # 那就  # 能在  # 我们可以 


相关文章: 高防服务器租用指南:配置选择与快速部署攻略  淘宝制作网站有哪些,淘宝网官网主页?  建站之星代理费用多少?最新价格详情介绍  公司网站制作费用多少,为公司建立一个网站需要哪些费用?  建站之星备案流程有哪些注意事项?  已有域名和空间如何快速搭建网站?  网站制作公司广州有几家,广州尚艺美发学校网站是多少?  专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?  大学网站设计制作软件有哪些,如何将网站制作成自己app?  建站之星2.7模板快速切换与批量管理功能操作指南  如何在建站之星绑定自定义域名?  建站之星安装需要哪些步骤及注意事项?  定制建站价位费用解析与套餐推荐全攻略  建站上传速度慢?如何优化加速网站加载效率?  正规网站制作公司有哪些,目前国内哪家网页网站制作设计公司比较专业靠谱?口碑好?  制作网站建设的公司有哪些,网站建设比较好的公司都有哪些?  昆明高端网站制作公司,昆明公租房申请网上登录入口?  如何通过.red域名打造高辨识度品牌网站?  网站制作与设计教程,如何制作一个企业网站,建设网站的基本步骤有哪些?  专业网站设计制作公司,如何制作一个企业网站,建设网站的基本步骤有哪些?  ,想在网上投简历,哪几个网站比较好?  建站主机是什么?如何选择适合的建站主机?  学校免费自助建站系统:智能生成+拖拽设计+多端适配  已有域名建站全流程解析:网站搭建步骤与建站工具选择  如何在万网ECS上快速搭建专属网站?  小米网站链接制作教程,请问miui新增网页链接调用服务有什么用啊?  香港服务器如何优化才能显著提升网站加载速度?  家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?  如何制作一个表白网站视频,关于勇敢表白的小标题?  网站插件制作软件免费下载,网页视频怎么下到本地插件?  Swift开发中switch语句值绑定模式  详解jQuery中基本的动画方法  详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)  如何在搬瓦工VPS快速搭建网站?  建站主机核心功能解析:服务器选择与网站搭建流程指南  合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?  PHP 500报错的快速解决方法  建站之星安装失败:服务器环境不兼容?  如何注册花生壳免费域名并搭建个人网站?  长沙企业网站制作哪家好,长沙水业集团官方网站?  如何快速重置建站主机并恢复默认配置?  建站之星安装路径如何正确选择及配置?  b2c电商网站制作流程,b2c水平综合的电商平台?  如何快速生成高效建站系统源代码?  详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)  网站制作壁纸教程视频,电脑壁纸网站?  北京网站制作公司哪家好一点,北京租房网站有哪些?  哈尔滨网站建设策划,哈尔滨电工证查询网站?  建站IDE高效指南:快速搭建+SEO优化+自适应模板全解析  如何在阿里云通过域名搭建网站? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。