---
# System prepended metadata

title: ReVue Day 2-2 模板語法
tags: [Vue]

---

ReVue Day 2-2 模板語法
===

###### tags:`Vue`

[TOC]


## 動態渲染：基於 "Mustache" 模板和 Virtual DOM

 [1:16:30]
- Vue 使用的模板是基於 html 語法，這就是為什麼他的學習曲線較低。
- 底層使用虛擬 DOM，來計算需要重新渲染哪些部分。
> 這就是為甚麼不要直接操作原生 DOM，會導致 Virtual DOM 計算錯誤。

### 模板語法 (Template Syntax)

用兩個花括弧 `{{ data }}`，將資料渲染進 DOM 系統
```htmlmixed=
<div id="app">
  {{ message }}
</div>
```

```javascript=
var app = new Vue({
  el: '#app',
  data: {
    message: 'Hello Vue!'
  }
})
```

> 動態更新畫面：
> 
> 打开你的浏览器的 JavaScript 控制台，并修改 app.message 的值，你将看到上例相应地更新。

### 用 v-bind: 綁定元素 attribute

```htmlmixed=
<div id="app-2">
  <span v-bind:title="message">
    鼠标悬停几秒钟查看此处动态绑定的提示信息！
  </span>
</div>
```
```javascript=
var app2 = new Vue({
  el: '#app-2',
  data: {
    message: '页面加载于 ' + new Date().toLocaleString()
  }
})
```

- v-bind attribute 被称为指令
- 前缀 v-，表示它是 Vue 提供的特殊 attribute
- 在这里的意思是：<br> “将这个元素节点的 title attribute 和 Vue 实例的 message property 保持一致”。

v-if 條件式
---

用 v-if 控制切换一个元素是否显示
```htmlmixed=
<div id="app-3">
  <p v-if="seen">现在你看到我了</p>
</div>
```
```javascript=
var app3 = new Vue({
  el: '#app-3',
  data: {
    seen: true
  }
})
```

![](https://i.imgur.com/kDHvdnm.png)

> 继续在控制台输入 app3.seen = false，你会发现之前显示的消息消失了。

> 此外，Vue 也提供一个强大的过渡效果系统，可以在 Vue 插入/更新/移除元素时自动应用过渡效果。
> https://cn.vuejs.org/v2/guide/transitions.html


v-for: 綁定 array 資料，渲染為 ”項目列表“
---

```htmlmixed=
<div id="app-4">
  <ol>
    <li v-for="todo in todos">
      {{ todo.text }}
    </li>
  </ol>
</div>
```

```javascript=
var app4 = new Vue({
  el: '#app-4',
  data: {
    todos: [
      { text: '学习 JavaScript' },
      { text: '学习 Vue' },
      { text: '整个牛项目' }
    ]
  }
})
```
![](https://i.imgur.com/IoUMjX1.png)

> 在控制台里，输入 app4.todos.push({ text: '新项目' })
> 
> 你会发现列表最后添加了一个新项目。

v-on: “browser 事件监听器“

```htmlmixed=
<div id="app-5">
  <p>{{ message }}</p>
  <button v-on:click="reverseMessage">反转消息</button>
</div>
```
```javascript=
var app5 = new Vue({
  el: '#app-5',
  data: {
    message: 'Hello Vue.js!'
  },
  methods: {
    reverseMessage: function () {
      this.message = this.message.split('').reverse().join('')
    }
  }
})
```
![](https://i.imgur.com/ffP7W2q.png)

v-model：表單的雙向綁定
---

Vue 提供 v-model 語法，讓你輕鬆實現"表單 input" 和"元件狀態"之間的雙向綁定

```htmlmixed=
<div id="app-6">
  <p>{{ message }}</p>
  <input v-model="message">
</div>
```

```javascript=
var app6 = new Vue({
  el: '#app-6',
  data: {
    message: 'Hello Vue!'
  }
})
```
![](https://i.imgur.com/C0AAbLf.png)


### v-model 和 v-bind 不同之處？


```htmlmixed=
<div id="app-7">
    <p>{{ message }}</p>

    <h4>v-model</h4>
    <input v-model="message">

    <br>

    <h4>v-bind</h4>
    <input v-bind:value="message">
</div>
```

```javascript=
var app6 = new Vue({
  el: '#app-7',
  data: {
    message: 'Hello Vue!'
  }
})
```



