{"componentChunkName":"component---src-templates-blog-post-js","path":"/conditional-rendering-and-list-rendering/","webpackCompilationHash":"23268da9a2d41a689f81","result":{"data":{"site":{"siteMetadata":{"title":"A Vue Blog","author":"Gautham Lal"}},"markdownRemark":{"id":"61a30a23-5349-5c1f-a239-763b40919e79","excerpt":"In my post on directives I talked about v-if and v-for. Today let’s take a deeper look into both. v-if We can use this directive to conditionally render a block…","html":"<p>In my post on <a href=\"https://avueblog.netlify.com/fantastic-directives-and-how-to-use-them/\">directives</a> I talked about <code>v-if</code> and <code>v-for</code>. Today let’s take a deeper look into both.</p>\n<h2><code>v-if</code></h2>\n<p>We can use this directive to conditionally render a block. Whether the block will get rendered depends on the <a href=\"https://developer.mozilla.org/en-US/docs/Glossary/Truthy\">truthiness</a> of the expression in the directive. <code>v-if</code> removes the block from the DOM and hence won’t be rendered.</p>\n<div class=\"gatsby-highlight\" data-language=\"html\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-html line-numbers\"><code class=\"language-html\"><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>p</span> <span class=\"token attr-name\">v-if</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>isTrue<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>You can see me!<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>p</span><span class=\"token punctuation\">></span></span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span></span></pre></div>\n<h4><code>v-else</code></h4>\n<p>You can use <code>v-else</code> directive for rendering an alternate block when the <code>v-if</code> condition is not true.</p>\n<div class=\"gatsby-highlight\" data-language=\"html\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-html line-numbers\"><code class=\"language-html\"><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>p</span> <span class=\"token attr-name\">v-if</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>isTrue<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>You can see me!<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>p</span><span class=\"token punctuation\">></span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>p</span> <span class=\"token attr-name\">v-else</span><span class=\"token punctuation\">></span></span>Now you don't!<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>p</span><span class=\"token punctuation\">></span></span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span></span></pre></div>\n<h4><code>v-else-if</code></h4>\n<p>There is a <code>v-else-if</code> directive as well, which can be chained multiple times and it can serve an ‘else-if’ block.</p>\n<div class=\"gatsby-highlight\" data-language=\"html\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-html line-numbers\"><code class=\"language-html\"><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span> <span class=\"token attr-name\">v-if</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>number === 1<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>\n  One\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span> <span class=\"token attr-name\">v-else-if</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>number === 2<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>\n  Two\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span> <span class=\"token attr-name\">v-else-if</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>number === 3<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>\n  Three\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span> <span class=\"token attr-name\">v-else</span><span class=\"token punctuation\">></span></span>\n  Not One or Two or Three\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>One thing to keep in mind while using <code>v-else</code> and <code>v-else-if</code> is that they should immediately follow a <code>v-if</code> or a <code>v-else-if</code>.</p>\n<h4><code>v-if</code> on <code>&#x3C;template></code></h4>\n<p>Now there might come situations where we have to render multiple blocks based on a condition. We can use <code>v-if</code> on <code>&#x3C;template></code> in that case to create an invisible wrapper. The output that gets rendered will not include the <code>&#x3C;template></code> element. This can also help us avoid the unwanted use of <code>&#x3C;div></code> tags.</p>\n<div class=\"gatsby-highlight\" data-language=\"html\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-html line-numbers\"><code class=\"language-html\"><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>template</span> <span class=\"token attr-name\">v-if</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>showUser<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>h1</span><span class=\"token punctuation\">></span></span>Name<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>h1</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>p</span><span class=\"token punctuation\">></span></span>Username<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>p</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>p</span><span class=\"token punctuation\">></span></span>Title<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>p</span><span class=\"token punctuation\">></span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>template</span><span class=\"token punctuation\">></span></span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<h4><code>v-show</code></h4>\n<p>We have another directive for conditionally displaying elements called <code>v-show</code>. We can use it similarly to <code>v-if</code>.</p>\n<div class=\"gatsby-highlight\" data-language=\"html\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-html line-numbers\"><code class=\"language-html\"><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>p</span> <span class=\"token attr-name\">v-show</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>isShow<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>You can see me!<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>p</span><span class=\"token punctuation\">></span></span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span></span></pre></div>\n<p>The difference is that the block will get always rendered but just hides it when the expression is falsy. It toggles the <code>display</code> CSS property of the element. You can view this in the ‘Elements’ tab of your browser’s developer tools.</p>\n<div class=\"gatsby-highlight\" data-language=\"html\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-html line-numbers\"><code class=\"language-html\"><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>p</span> <span class=\"token attr-name\">v-show</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>isShow<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>You can see me!<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>p</span><span class=\"token punctuation\">></span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>button</span> <span class=\"token attr-name\"><span class=\"token namespace\">v-on:</span>click</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>isShow = !isShow<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>button</span><span class=\"token punctuation\">></span></span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span></span></pre></div>\n<p>The above toggles the value of <code>isShow</code> on the button click. In the developer console, you can see that a style <code>display: none</code> is being added to the <code>&#x3C;p></code> element.</p>\n<p>A thing to keep in mind is that <code>v-else</code> and <code>v-else-if</code> cannot be used with <code>v-show</code>. <code>v-show</code> also does not support <code>&#x3C;template></code> element.</p>\n<hr>\n<h2><code>v-for</code></h2>\n<p><code>v-for</code> directive lets us render a list of items in an array or an object. The required syntax is <code>item in items</code> where <code>item</code> is the element currently being iterated on from the <code>items</code> array or object.</p>\n<h4><code>v-for</code> on arrays</h4>\n<div class=\"gatsby-highlight\" data-language=\"html\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-html line-numbers\"><code class=\"language-html\"><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>ul</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>li</span> <span class=\"token attr-name\">v-for</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>ingredient in ingredients<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>{{ ingredient }}<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>li</span><span class=\"token punctuation\">></span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>ul</span><span class=\"token punctuation\">></span></span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span></span></pre></div>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-javascript line-numbers\"><code class=\"language-javascript\">data<span class=\"token punctuation\">:</span> <span class=\"token punctuation\">{</span>\n  \tingredients<span class=\"token punctuation\">:</span> <span class=\"token punctuation\">[</span><span class=\"token string\">'meat'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'fruit'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'cookies'</span><span class=\"token punctuation\">]</span>\n<span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span></span></pre></div>\n<p>The above <code>v-for</code> will render an unordered list with the array elements in <code>ingredients</code> as list items.</p>\n<ul>\n  <li>meat</li>\n  <li>fruit</li>\n  <li>cookies</li>\n</ul>\n<p><code>v-for</code> also allows, you to have an optional second parameter, the index of the item.</p>\n<div class=\"gatsby-highlight\" data-language=\"html\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-html line-numbers\"><code class=\"language-html\"><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>ul</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>li</span> <span class=\"token attr-name\">v-for</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>(ingredient, index) in ingredients<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>{{ ingredient }} - {{ index }}<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>li</span><span class=\"token punctuation\">></span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>ul</span><span class=\"token punctuation\">></span></span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span></span></pre></div>\n<h4><code>v-for</code> on objects</h4>\n<p>Similar to iterating through the elements of an array, <code>v-for</code> can be used to iterate through the properties of an object.</p>\n<div class=\"gatsby-highlight\" data-language=\"html\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-html line-numbers\"><code class=\"language-html\"><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>ul</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>li</span> <span class=\"token attr-name\">v-for</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>object in myObject<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>{{ object }}<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>li</span><span class=\"token punctuation\">></span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>ul</span><span class=\"token punctuation\">></span></span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span></span></pre></div>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-javascript line-numbers\"><code class=\"language-javascript\">data<span class=\"token punctuation\">:</span> <span class=\"token punctuation\">{</span>\n  myObject<span class=\"token punctuation\">:</span> <span class=\"token punctuation\">{</span>\n    title<span class=\"token punctuation\">:</span> <span class=\"token string\">'Lord of the Rings'</span><span class=\"token punctuation\">,</span>\n    author<span class=\"token punctuation\">:</span> <span class=\"token string\">'J.R.R. Tolkien'</span><span class=\"token punctuation\">,</span>\n    books<span class=\"token punctuation\">:</span> <span class=\"token string\">'3'</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>Result:</p>\n<ul>\n  <li>Lord of the Rings</li>\n  <li>J.R.R. Tolkien</li>\n  <li>3</li>\n</ul>\n<p>You can also provide a second and a third argument to get the property name (or key) and index.</p>\n<div class=\"gatsby-highlight\" data-language=\"html\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-html line-numbers\"><code class=\"language-html\"><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>ul</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>li</span> <span class=\"token attr-name\">v-for</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>(object, k, i) in myObject<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>{{ k }}: {{ object }} - {{ i }}<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>li</span><span class=\"token punctuation\">></span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>ul</span><span class=\"token punctuation\">></span></span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span></span></pre></div>\n<ul>\n  <li>title: Lord of the Rings - 0</li>\n  <li>author: J.R.R. Tolkien - 1</li>\n  <li>books: 3 - 2</li>\n</ul>\n<hr>\n<p>Similar to <code>v-if</code>, <code>v-if</code> can also be used with <code>&#x3C;template></code> to render a block multiple times.</p>\n<p><code>v-if</code> can also be used with <code>v-for</code> to check whether the block should be rendered for each element based on a condition. <code>v-if</code> can be used on the wrapper element of <code>v-for</code> to skip the loop.</p>\n<p><code>v-for</code> can be used to render a block a given number of times by passing it an integer.</p>\n<div class=\"gatsby-highlight\" data-language=\"html\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-html line-numbers\"><code class=\"language-html\"><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>ul</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>li</span> <span class=\"token attr-name\">v-for</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>n in 10<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>{{ n }} <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>li</span><span class=\"token punctuation\">></span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>ul</span><span class=\"token punctuation\">></span></span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span></span></pre></div>\n<p>Result:</p>\n<p>1 2 3 4 5 6 7 8 9 10</p>\n<h4>Providing a <code>key</code> to <code>v-for</code></h4>\n<p>Vue uses an “in-place patch” strategy where if the order of the items changes, Vue will patch element in place to match the new order instead of reordering the items. While this is efficient, in complex cases it could cause hindrance.</p>\n<p>To let Vue track each item, we can provide a unique <code>key</code> to each element. This lets Vue identify the elements and track changes and then reuse and reorder them when necessary. This essentially avoids the re-render of the entire loop.</p>\n<p>You can provide <code>key</code> with the help of <code>v-bind</code>.</p>\n<div class=\"gatsby-highlight\" data-language=\"html\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-html line-numbers\"><code class=\"language-html\"><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>li</span> <span class=\"token attr-name\">v-for</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>(ingredient, i) in ingredients<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">:key</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>ingredient<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>{{ ingredient }} ({{ i }})<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>li</span><span class=\"token punctuation\">></span></span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span></span></pre></div>\n<hr>\n<p>So Vue makes our life easier by providing us <code>v-for</code> and <code>v-if</code>. They are flexible and can even be used together to solve routine use cases easily.</p>","frontmatter":{"title":"Conditional Rendering and List Rendering in Vue.js","date":"August 31, 2019","description":"Looking deeper into the directives that help us render based on conditions and lists."}}},"pageContext":{"isCreatedByStatefulCreatePages":false,"slug":"/conditional-rendering-and-list-rendering/","previous":{"fields":{"slug":"/dynamic-binding-of-classes-and-styles-in-vue/"},"frontmatter":{"title":"Dynamic Binding of Classes and Styles in Vue.js!"}},"next":null}}}