128 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			128 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
---
 | 
						|
title: Control Flow
 | 
						|
---
 | 
						|
 | 
						|
## Control Flow
 | 
						|
 | 
						|
 | 
						|
### Conditionals
 | 
						|
 | 
						|
With Vue.js you can decide wheter to show or not a piece of code in you final
 | 
						|
page, depending on some condition. For example, imagine a form input that is
 | 
						|
required a text at least 8 characters long: if the user input is shorter than 8,
 | 
						|
than an error message should appear; but if the input is longer than 8, the
 | 
						|
message disappears.
 | 
						|
 | 
						|
But let's make a simpler example. We want a condition that determines what is displayed, using a counter:
 | 
						|
 | 
						|
```html
 | 
						|
<div id="app">
 | 
						|
  <p v-if="counter > 10">
 | 
						|
    This message is only rendered when the counter is greater than 10
 | 
						|
  </p>
 | 
						|
</div>
 | 
						|
```
 | 
						|
 | 
						|
```javascript
 | 
						|
let app = new Vue({
 | 
						|
  el: '#app',
 | 
						|
  data: {
 | 
						|
    counter: 0
 | 
						|
  }
 | 
						|
});
 | 
						|
```
 | 
						|
 | 
						|
If you go to the console and start to increment the counter, when it crosses our
 | 
						|
threshold of 10, the message will be shown! Then, if you decrement `counter`,
 | 
						|
Vue.js will hide the message when `counter` gets lower than 10. For that, we
 | 
						|
used the directive `v-if`.
 | 
						|
 | 
						|
And you might be wondering if there's an `else` for that `if`. And there is the
 | 
						|
`v-else`. Notice that the `v-else` will always
 | 
						|
* expect a `v-if` prior to it
 | 
						|
* refers to the closest `v-if` in the page
 | 
						|
 | 
						|
Let's alter a little bit our first example to get this straight.
 | 
						|
 | 
						|
```html
 | 
						|
<div id="app">
 | 
						|
  <button type="button" @click="counter = counter + 1">Click Me!</button>
 | 
						|
  <p v-if="counter > 10">
 | 
						|
    This message is only rendered when the counter is greater than 10
 | 
						|
  </p>
 | 
						|
  <p v-else>
 | 
						|
    And this is the "otherwise" option
 | 
						|
  </p>
 | 
						|
</div>
 | 
						|
```
 | 
						|
 | 
						|
```javascript
 | 
						|
let app = new Vue({
 | 
						|
  el: '#app',
 | 
						|
  data: {
 | 
						|
    counter: 0
 | 
						|
  }
 | 
						|
});
 | 
						|
```
 | 
						|
 | 
						|
Play a little with that by changing `counter` values and pay attention to the
 | 
						|
message shown.
 | 
						|
 | 
						|
Vue.js also has the `v-else-if` directive.
 | 
						|
 | 
						|
 | 
						|
### Loops
 | 
						|
 | 
						|
Vue.js also helps with the generation of multiple copies of the same code
 | 
						|
structure, with loops. The classic example is a list dynamically rendered.
 | 
						|
 | 
						|
```html
 | 
						|
<div id="app">
 | 
						|
  <ul>
 | 
						|
    <li v-for="item in list">
 | 
						|
      {{ item }}
 | 
						|
    </li>
 | 
						|
  </ul>
 | 
						|
</div>
 | 
						|
```
 | 
						|
 | 
						|
```javascript
 | 
						|
let app = new Vue({
 | 
						|
  el: '#app',
 | 
						|
  data: {
 | 
						|
    list: [
 | 
						|
      "shave",
 | 
						|
      "do the dishes",
 | 
						|
      "clean the sink",
 | 
						|
      "pay the bill"
 | 
						|
    ]
 | 
						|
  }
 | 
						|
});
 | 
						|
```
 | 
						|
 | 
						|
Way easier than inserting a lot of `<li>`. And notice that whenever the `list`
 | 
						|
changes, the result will change accordingly. Try it out: open the console and
 | 
						|
`push` some string to the `list` with
 | 
						|
 | 
						|
```javascript
 | 
						|
app.list.push("something else");
 | 
						|
```
 | 
						|
 | 
						|
As expected, the page rendered now has our brand new item!
 | 
						|
 | 
						|
### Accessing current index in loops
 | 
						|
 | 
						|
`v-for` also supports an optional second argument for the index of the current item:
 | 
						|
 | 
						|
```html
 | 
						|
<div id="app">
 | 
						|
  <ul>
 | 
						|
    <li v-for="(item, index) in items">
 | 
						|
      {{ index }}: {{ item }}
 | 
						|
    </li>
 | 
						|
  </ul>
 | 
						|
</div>
 | 
						|
```
 | 
						|
This way, we can use `index` to style the first, last or even/odd list elements differently, or apply extra logic to our component.
 | 
						|
 |