# 条件渲染
## v-if
`v-if`指令用于条件性地渲染一块内容。这块内容只会在指令的表达式返回 truthy 值的时候被渲染。
~~~html
<h1 v-if="awesome">Vue is awesome!</h1>
~~~
也可以用`v-else`添加一个“else 块”:
~~~html
<h1 v-if="awesome">Vue is awesome!</h1>
<h1 v-else>Oh no!</h1>
~~~
### 在`<template>`元素上使用`v-if`条件渲染分组
因为`v-if`是一个指令,所以必须将它添加到一个元素上。但是如果想切换多个元素呢?此时可以把一个`<template>`元素当做不可见的包裹元素,并在上面使用`v-if`。最终的渲染结果将不包含`<template>`元素。
~~~
<template v-if="ok">
<h1>Title</h1>
<p>Paragraph 1</p>
<p>Paragraph 2</p>
</template>
~~~
### [`v-else`](https://cn.vuejs.org/v2/guide/conditional.html#v-else "v-else")
你可以使用`v-else`指令来表示`v-if`的“else 块”:
~~~
<div v-if="Math.random() > 0.5">
Now you see me
</div>
<div v-else>
Now you don't
</div>
~~~
`v-else`元素必须紧跟在带`v-if`或者`v-else-if`的元素的后面,否则它将不会被识别。
### [`v-else-if`](https://cn.vuejs.org/v2/guide/conditional.html#v-else-if "v-else-if")
> 2.1.0 新增
`v-else-if`,顾名思义,充当`v-if`的“else-if 块”,可以连续使用:
~~~
<div v-if="type === 'A'">
A
</div>
<div v-else-if="type === 'B'">
B
</div>
<div v-else-if="type === 'C'">
C
</div>
<div v-else>
Not A/B/C
</div>
~~~
类似于`v-else`,`v-else-if`也必须紧跟在带`v-if`或者`v-else-if`的元素之后。
### [用`key`管理可复用的元素](https://cn.vuejs.org/v2/guide/conditional.html#%E7%94%A8-key-%E7%AE%A1%E7%90%86%E5%8F%AF%E5%A4%8D%E7%94%A8%E7%9A%84%E5%85%83%E7%B4%A0 "用 key 管理可复用的元素")
Vue 会尽可能高效地渲染元素,通常会复用已有元素而不是从头开始渲染。这么做除了使 Vue 变得非常快之外,还有其它一些好处。例如,如果你允许用户在不同的登录方式之间切换:
~~~
<template v-if="loginType === 'username'">
<label>Username</label>
<input placeholder="Enter your username">
</template>
<template v-else>
<label>Email</label>
<input placeholder="Enter your email address">
</template>
~~~
那么在上面的代码中切换`loginType`将不会清除用户已经输入的内容。因为两个模板使用了相同的元素,`<input>`不会被替换掉——仅仅是替换了它的`placeholder`。
自己动手试一试,在输入框中输入一些文本,然后按下切换按钮:
Username
Toggle login type
这样也不总是符合实际需求,所以 Vue 为你提供了一种方式来表达“这两个元素是完全独立的,不要复用它们”。只需添加一个具有唯一值的`key`属性即可:
~~~
<template v-if="loginType === 'username'">
<label>Username</label>
<input placeholder="Enter your username" key="username-input">
</template>
<template v-else>
<label>Email</label>
<input placeholder="Enter your email address" key="email-input">
</template>
~~~
现在,每次切换时,输入框都将被重新渲染。请看:
Username
Toggle login type
注意,`<label>`元素仍然会被高效地复用,因为它们没有添加`key`属性。
## [`v-show`](https://cn.vuejs.org/v2/guide/conditional.html#v-show "v-show")
另一个用于根据条件展示元素的选项是`v-show`指令。用法大致一样:
~~~
<h1 v-show="ok">Hello!</h1>
~~~
不同的是带有`v-show`的元素始终会被渲染并保留在 DOM 中。`v-show`只是简单地切换元素的 CSS 属性`display`。
注意,`v-show`不支持`<template>`元素,也不支持`v-else`。
## [`v-if`vs`v-show`](https://cn.vuejs.org/v2/guide/conditional.html#v-if-vs-v-show "v-if vs v-show")
`v-if`是“真正”的条件渲染,因为它会确保在切换过程中条件块内的事件监听器和子组件适当地被销毁和重建。
`v-if`也是**惰性的**:如果在初始渲染时条件为假,则什么也不做——直到条件第一次变为真时,才会开始渲染条件块。
相比之下,`v-show`就简单得多——不管初始条件是什么,元素总是会被渲染,并且只是简单地基于 CSS 进行切换。
一般来说,`v-if`有更高的切换开销,而`v-show`有更高的初始渲染开销。因此,如果需要非常频繁地切换,则使用`v-show`较好;如果在运行时条件很少改变,则使用`v-if`较好。
## `v-if`与`v-for`一起使用
**不推荐**同时使用`v-if`和`v-for`。
当`v-if`与`v-for`一起使用时,`v-for`具有比`v-if`更高的优先级。请查阅[列表渲染指南](https://cn.vuejs.org/v2/guide/list.html#v-for-with-v-if)以获取详细信息。
## 一个综合的例子
```
<template>
<div>
<div v-if="type === 'A'">A</div>
<div v-else-if="type === 'B'">B</div>
<div v-else-if="type === 'C'">C</div>
<div v-else>Not A/B/C</div>
</div>
</template>
<script>
export default {
name: "HelloWorld",
data() {
return {};
},
computed: {
type() {
let arr = ["A", "B", "C", "D"];
return arr[this.random(0, arr.length - 1)];
}
},
methods: {
random(n, m) {
//构造随机整数[n..m]
var random = Math.floor(Math.random() * (m - n + 1) + n);
return random;
}
}
};
</script>
<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
</style>
```
- 内容介绍
- EcmaScript基础
- 快速入门
- 常量与变量
- 字符串
- 函数的基本概念
- 条件判断
- 数组
- 循环
- while循环
- for循环
- 函数基础
- 对象
- 对象的方法
- 函数
- 变量作用域
- 箭头函数
- 闭包
- 高阶函数
- map/reduce
- filter
- sort
- Promise
- 基本对象
- Arguments 对象
- 剩余参数
- Map和Set
- Json基础
- RegExp
- Date
- async
- callback
- promise基础
- promise-api
- promise链
- async-await
- 项目实践
- 标签系统
- 远程API请求
- 面向对象编程
- 创建对象
- 原型继承
- 项目实践
- Classes
- 构造函数
- extends
- static
- 项目实践
- 模块
- import
- export
- 项目实践
- 第三方扩展库
- immutable
- Vue快速入门
- 理解MVVM
- Vue中的MVVM模型
- Webpack+Vue快速入门
- 模板语法
- 计算属性和侦听器
- Class 与 Style 绑定
- 条件渲染
- 列表渲染
- 事件处理
- 表单输入绑定
- 组件基础
- 组件注册
- Prop
- 自定义事件
- 插槽
- 混入
- 过滤器
- 项目实践
- 标签编辑
- 移动客户端开发
- uni-app基础
- 快速入门程序
- 单页程序
- 底部Tab导航
- Vue语法基础
- 模版语法
- 计算属性与侦听器
- Class与Style绑定
- 样式与布局
- Box模型
- Flex布局
- 内置指令
- 基本指令
- v-model与表单
- 条件渲染指令
- 列表渲染指令v-for
- 事件与自定义属性
- 生命周期
- 项目实践
- 学生实验
- 贝店商品列表
- 加载更多数据
- 详情页面
- 自定义组件
- 内置组件
- 表单组件
- 技术专题
- 状态管理vuex
- Flyio
- Mockjs
- SCSS
- 条件编译
- 常用功能实现
- 上拉加载更多数据
- 数据加载综合案例
- Teaset UI组件库
- Teaset设计
- Teaset使用基础
- ts-tag
- ts-badge
- ts-button
- ta-banner
- ts-list
- ts-icon
- ts-load-more
- ts-segmented-control
- 代码模版
- 项目实践
- 标签组件
- 失物招领客户端原型
- 发布页面
- 检索页面
- 详情页面
- 服务端开发技术
- 服务端开发环境配置
- Koajs快速入门
- 快速入门
- 常用Koa中间件介绍
- 文件上传
- RestfulApi
- 一个复杂的RESTful例子
- 使用Mockjs生成模拟数据
- Thinkjs快速入门
- MVC模式
- Thinkjs介绍
- 快速入门
- RESTful服务
- RBAC案例
- 关联模型
- 应用开发框架
- 服务端开发
- PC端管理界面开发
- 移动端开发
- 项目实践
- 失物招领项目
- 移动客户端UI设计
- 服务端设计
- 数据库设计
- Event(事件)
- 客户端设计
- 事件列表页面
- 发布页面
- 事件详情页面
- API设计
- image
- event
- 微信公众号开发
- ui设计规范