2 minutes
Vue-筆記-2-模板
模板語言 Vue template (官網說法 指令 Directives)
- v-text
<span v-text="msg"></span>
<span>{{msg}}</span>
兩種寫法都可以。
- v-html
<div v-html="html"></div>
如果想要動態插入內容,使用innerHTML是拿不到實例中的data的喔。
- v-show
<h1 v-show="show">Hello!</h1>
等於CSS裡的display。
- v-if, v-else-if, v-else
<div v-if="type === 'A'">A</div>
<div v-else-if="type === 'B'">B</div>
<div v-else>Not A/B</div>
v-if 和 v-show 的差別是在條件不成立的情況下,v-if不會被渲染到網頁上,v-show則是單純看不到。
- v-for
<!-- Array --> <li v-for="todo in todos" v-if="todo.isComplete"> {{ todo }} </li> <div v-for="(todo, index) in todos"> {{ index }}: {{ todo }} </div> <!-- Object --> <div v-for="value in object"> {{ value }} </div> <div v-for="(value, key) in object"> {{ key }}: {{ value }} </div> <div v-for="(value, key, index) in object"> {{ index }}. {{ key }}: {{ value }} </div>
注意v-for的優先度比v-if高,所以放在同一層的話,可以有條件的印出內容。
<br/>
6. v-model 雙向綁定
- 限制 只能用在
1. input
2. select
3. textarea
4. components
- 修飾符
1. .lazy 監聽事件用blur取代預設的change
2. .trim 過濾頭尾空格
3. .number 輸入字符串轉為數字型別
<br/>
7. v-bind(**:**)
{% raw %}
標籤的屬性不能使用{{class}},應使用v-bind
{% endraw %}
```html
<a :href="url" :title.prop="hint">link</a>
<svg :view-box.camel="viewBox"></svg>
```
- 修飾符
1. .prop 從綁定HTML元素的屬性(attribute)改成DOM的屬性(property)
2. .camel 將kebab-case命名法,轉換成camelCase命名法(駝峰式),因vue-loader內建,就不用加這個修飾符
3. .sync 對prop做雙向綁定,子組件改變時,會更新到父組件
<br/>
8. v-on(**@**)
```html
<input @keydown.enter="onEnter">
<input @keydown.13="onEnter">
```
- 修飾符
1. .stop = event.stopPropagation(),阻止JS預設的事件傳遞方向**向上冒泡(event bubbling)**
2. .prevent = event.preventDefault(),阻止HTML元素預設事件
3. .{keyCode | keyAlias},如範例,可用keyCode或按鍵名做事件觸發
4. [.left, .middle, .right],分別是滑鼠的左鍵、中鍵、右鍵觸發
5. .once,只能觸發一次
6. .self,只在有事件監聽的HTML元素本身觸發(不含子元素)
7. .capture,將JS預設的事件傳遞方向**向上冒泡(event bubbling)**改為**向下捕獲(event capturing)**
8. .passive,以{ passive : true }的模式增加事件監聽,意思是會無視preventDefault(),用來解決滾動和點擊事件的瞬間卡頓
9. .native,監聽組件根元素的原生事件
<br/>
9. v-pre
```html
<span v-pre>{{ this will not be compiled }}</span>
```
加上v-pre的部分,不會被編譯
<br/>
10. v-cloak
```html
<div v-cloak>
{{ message }}
</div>
<style>
[v-cloak] {
display: none;
}
</style>
```
讓等待渲染資料的地方不顯示{{data}},直到渲染為止。
<br/>
11. v-once
```html
<span v-once>This will never change: {{msg}}</span>
```
只渲染一次,用在父層會影響到子層。
<br/>
### 特例
圖片不能用v-model綁定,必須使用v-on:change綁定。
```html
<div id="app">
<input type="file" @change='fileSelected'>
<img v-if="image" :src="image" width="300">
</div>
<script>
const vm = new Vue({
el: "#app",
data: {
image: ''
},
methods: {
imageLoaded(e){
this.image = e.target.result;
},
fileSelected(e){
const file = e.target.files.item(0);
const reader = new FileReader();
reader.addEventListener('load', this.imageLoaded);
reader.readAsDataURL(file);
}
}
})
</script>
實作
簡單的做個 TodoList 吧! CodePen連結