Guide
Essentials
- Installation
- Introduction
- The Vue Instance
- Template Syntax
- Computed Properties and Watchers
- Class and Style Bindings
- Conditional Rendering
- List Rendering
- Event Handling
- Form Input Bindings
- Components Basics
Components In-Depth
- Component Registration
- Props
- Custom Events
- Slots
- Dynamic & Async Components
- Handling Edge Cases
Transitions & Animation
- Enter/Leave & List Transitions
- State Transitions
Reusability & Composition
- Mixins
- Custom Directives
- Render Functions & JSX
- Plugins
- Filters
Tooling
- Single File Components
- Testing
- TypeScript Support
- Production Deployment
Scaling Up
- Routing
- State Management
- Server-Side Rendering
- Security
Internals
- Reactivity in Depth
Migrating
- Migration from Vue 1.x
- Migration from Vue Router 0.7.x
- Migration from Vuex 0.6.x to 1.0
- Migration to Vue 2.7
Meta
- Comparison with Other Frameworks
- Join the Vue.js Community!
- Meet the Team
Conditional Rendering
v-if
The directive v-if
is used to conditionally render a block. The block will only be rendered if the directive’s expression returns a truthy value.
|
It is also possible to add an “else block” with v-else
:
|
Conditional Groups with v-if
on <template>
Because v-if
is a directive, it has to be attached to a single element. But what if we want to toggle more than one element? In this case we can use v-if
on a <template>
element, which serves as an invisible wrapper. The final rendered result will not include the <template>
element.
|
v-else
You can use the v-else
directive to indicate an “else block” for v-if
:
|
A v-else
element must immediately follow a v-if
or a v-else-if
element - otherwise it will not be recognized.
v-else-if
New in 2.1.0+
The v-else-if
, as the name suggests, serves as an “else if block” for v-if
. It can also be chained multiple times:
|
Similar to v-else
, a v-else-if
element must immediately follow a v-if
or a v-else-if
element.
Controlling Reusable Elements with key
Vue tries to render elements as efficiently as possible, often re-using them instead of rendering from scratch. Beyond helping make Vue very fast, this can have some useful advantages. For example, if you allow users to toggle between multiple login types:
|
Then switching the loginType
in the code above will not erase what the user has already entered. Since both templates use the same elements, the <input>
is not replaced - just its placeholder
.
Check it out for yourself by entering some text in the input, then pressing the toggle button:
This isn’t always desirable though, so Vue offers a way for you to say, “These two elements are completely separate - don’t re-use them.” Add a key
attribute with unique values:
|
Now those inputs will be rendered from scratch each time you toggle. See for yourself:
Note that the <label>
elements are still efficiently re-used, because they don’t have key
attributes.
v-show
Another option for conditionally displaying an element is the v-show
directive. The usage is largely the same:
|
The difference is that an element with v-show
will always be rendered and remain in the DOM; v-show
only toggles the display
CSS property of the element.
Note that v-show
doesn’t support the <template>
element, nor does it work with v-else
.
v-if
vs v-show
v-if
is “real” conditional rendering because it ensures that event listeners and child components inside the conditional block are properly destroyed and re-created during toggles.
v-if
is also lazy: if the condition is false on initial render, it will not do anything - the conditional block won’t be rendered until the condition becomes true for the first time.
In comparison, v-show
is much simpler - the element is always rendered regardless of initial condition, with CSS-based toggling.
Generally speaking, v-if
has higher toggle costs while v-show
has higher initial render costs. So prefer v-show
if you need to toggle something very often, and prefer v-if
if the condition is unlikely to change at runtime.
v-if
with v-for
Using v-if
and v-for
together is not recommended. See the style guide for further information.
When used together with v-if
, v-for
has a higher priority than v-if
. See the list rendering guide for details.