Vue的開始以及基本指令詳解
為什麼學vue?
- vue是中國大神尤雨溪建立的js框架。
- Vue (讀音 /vjuː/,類似於 view) 是一套用於構建使用者介面的漸進式框架。與其它大型框架不同的是,Vue 被設計為可以自底向上逐層應用。Vue 的核心庫只關注檢視層,不僅易於上手,還便於與第三方庫或既有專案整合。另一方面,當與現代化的工具鏈以及各種支援類庫結合使用時,Vue 也完全能夠為複雜的單頁應用提供驅動。
- 任何描述都不及這個視訊介紹來的有效:How to use Vue?
安裝Vue
- 通過直接飲用線上的js庫
<!-- 開發環境版本,包含了有幫助的命令列警告 -->
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js" ></script>
<!-- 生產環境版本,優化了尺寸和速度 -->
<script src="https://cdn.jsdelivr.net/npm/vue"></script>
- 通過npm包管理器
# 最新穩定版
$ npm install vue
在 NPM 包的 dist/ 目錄你將會找到很多不同的 Vue.js 構建版本:
第一次使用vue
- Hello Vue!
vue通過Vue建構函式建立例項物件,傳遞引數1,el:元素節點ID值,data:資料,最後再通過插值符號將data裡的資料按需渲染到html頁面裡。
<body >
<div id="app">
{{ message }}
</div>
</body>
<script src="https://vuejs.org/js/vue.js"></script>
<script type="text/javascript">
var app = new Vue({
el: '#app',
data: {
message: 'Hello Vue!'
}
})
</script>
資料就是資料,text和html的區別,如果直接在資料裡包裹標籤:
<script type="text/javascript">
var app = new Vue({
el: '#app',
data: {
message: '<h1>Hello Vue!</h1>'//沒有效果
}
})
</script>
Vue基本語法、指令
基本指令
v-text:
-
期望值型別:
string
; -
用法:
用於更新元素的textContent,可以通過
{{}}
插值符號控制。 -
示例:
<!-- 兩種寫法一樣 -->
<span v-text="msg"></span>
<span>{{msg}}</span>
- 完整例項:
<body>
<div id="app" v-text="message"></div>
</body>
<script src="https://vuejs.org/js/vue.js"></script>
<script type="text/javascript">
var app = new Vue({
el: '#app',
data: {
message: 'Hello Vue!'
}
})
</script>
雖然上面兩個用法可以達到相同結果,但是仍然有細節的卻別,如果用插值符號寫在標籤裡面
<span>{{message}}</span>
會出現js檔案沒載入完,{{message}}
直接顯示出來:
就像這樣:
而把message寫在屬性裡,就不會將變數暴露出來。
- 當然插值也可以拼接:
<body>
<div id="app">
The new guy said something:{{message}}
</div>
</body>
<script src="https://vuejs.org/js/vue.js"></script>
<script type="text/javascript">
var app = new Vue({
el: '#app',
data: {
message: 'Hello Vue!'
}
})
</script>
v-html:
-
期望值型別:
string
; -
用法:更新元素的 innerHTML 。注意:內容按普通 HTML 插入 - 不會作為 Vue 模板進行編譯 。如果試圖使用 v-html 組合模板,可以重新考慮是否通過使用元件來替代。
-
禁忌:
禁止在使用者提交資料的內容部分使用v-html這樣會非常容易導致xss攻擊,一些用心不良的使用者會利用指令碼植入到提供給使用者的其他頁面中,在其他使用者使用被篡改的頁面時觸發指令碼,將使用者資訊資料傳送給植入者!
-
示例:
<div v-html="html"></div>
- 完整示例:
<body>
<div id="app">
The new guy said something:{{message}}
<h1 v-text="vText"></h1>
<h1 v-html="vHtml"></h1>
<!-- <h1 v-text=""></h1> -->
</div>
</body>
<script src="./js/vue.js"></script>
<script type="text/javascript">
var app = new Vue({
el: '#app',
data: {
message: 'Hello Vue!',
vText:"<em>This is a v-text</em>,<i>Just like innerText</i>",
vHtml:"<em>This is a v-text</em>,<i>Just like innerText</i>",
// vText2:""
}
})
</script>
v-show:
- 期望值型別:都可;
- 用法:根據表示式的真假值切換display屬性;
- 示例:
<span v-show="vShow">{{}}</span>
<span v-show=true/false>string</span>
- 完整例項:
<body>
<div id="app">
The new guy said something:{{message}}
<h1 v-text="vText"></h1>
<h1 v-html="vHtml"></h1>
<h1 v-show="vShow">vShow控制的元素</h1>
</div>
</body>
<script src="./js/vue.js"></script>
<script type="text/javascript">
var app = new Vue({
el: '#app',
data: {
message: 'Hello Vue!',
vText:"<em>This is a v-text</em>,<i>Just like innerText</i>",
vHtml:"<em>This is a v-text</em>,<i>Just like innerText</i>",
vShow:true//false
}
})
</script>
如果我改成false了:
v-if,v-else,v-else-if:
-
v-if,v-esle-if期望值:都可,v-else無值;
-
用法: 呈兄弟級節點關係,if值為false顯示else的節點,一次類推,與jsif判斷類似。
-
示例:
<div v-if="firstif">This is the if node</div>
<div v-else-if="secondeif">This is the else if node</div>
<div v-else>This is the else node</div>
- 完整例項:
<body>
<div id="app">
The new guy said something:{{message}}
<h1 v-text="vText"></h1>
<h1 v-html="vHtml"></h1>
<h1 v-show="vShow">vShow控制的元素</h1>
<div v-if="firstif">This is the if node</div>
<div v-else-if="secondeif">This is the else if node</div>
<div v-else>This is the else node</div>
</div>
</body>
<script src="./js/vue.js"></script>
<script type="text/javascript">
var app = new Vue({
el: '#app',
data: {
message: 'Hello Vue!',
vText:"<em>This is a v-text</em>,<i>Just like innerText</i>",
vHtml:"<em>This is a v-text</em>,<i>Just like innerText</i>",
vShow:false,
firstif:false,
secondeif:false
}
})
</script>
另外兩個節點不會渲染:
- 同時控制一組元素:
//依舊是剛才的js程式碼:
<div v-if="firstif">This is the if node</div>
<div v-else-if="secondeif">This is the else if node</div>
<template v-else>
<h1>This is the else node</h1>
<h2>This is the else node</h2>
<h3>This is the else node</h3>
<h4>This is the else node</h4>
<h5>This is the else node</h5>
</template>
template並不會被顯示出來:
v-for:
-
期望值型別:
Array
|Object
|number
|string
; -
用法:
基於源資料多次渲染元素或模板塊。此指令之值,必須使用特定語法 alias in expression ,為當前遍歷的元素提供別名
-
示例:
<div v-for="item in items">
{{ item.text }}
</div>
另外也可以為陣列索引指定別名 (或者用於物件的鍵):
<div v-for="(item, index) in items"></div>
<div v-for="(val, key) in object"></div>
<div v-for="(val, key, index) in object"></div>
v-for 預設行為試著不改變整體,而是替換元素。迫使其重新排序的元素,你需要提供一個 key 的特殊屬性:
<div v-for="item in items" :key="item.id">
{{ item.text }}
</div>
- 完整例項:
<ol>
<li v-for="item in items">{{item}}</li>
</ol>
<script type="text/javascript">
var app = new Vue({
el: '#app',
data: {
items:["The","arr","list"]
}
})
</script>
- 但是更高明或者說更標準的用法是給渲染的元素新增Key值,更有效能的提升:
<ol>
<li v-for="(item,index) in items2" :key="index">{{item}}</li>
</ol>
<script type="text/javascript">
var app = new Vue({
el: '#app',
data: {
items2:["The","arr2","list","and","get","keys"]
}
})
</script>
對比上一次的結果:
- 有時候,遍歷物件往往比遍歷陣列多:
<ol>
<li v-for="(item,index) in objPerson" :key="index">name:{{item.name}},age:{{item.name}}</li>
</ol>
<script type="text/javascript">
var app = new Vue({
el: '#app',
data: {
objPerson:[
{name:"Lucy",age:"18"},
{name:"Bob",age:"19"},
{name:"Tom",age:"21"}
]
}
})
</script>
輸出結果:
- 遍歷物件屬性:
<ol>
<li v-for="(value,key,index) in objInfo" :key="index">
value:{{value}},
key:{{key}},
index:{{index}}
</li>
</ol>
<script type="text/javascript">
var app = new Vue({
el: '#app',
data: {
objInfo:{
name:"Lucy",
age:"18",
sex:"girl",
hobby:"ride"
}
}
})
</script>
值得注意的是,vue和react的元件渲染列表時都會有個key值的,這個key是用於元件渲染時的索引,方便的是後續的更多操作,這個在vue的官網展示視訊裡有很好的體現,而這個key值同樣可以根據自己定義id值繫結,只需要寫成這樣就是,{id:1}==>key:“id”
vue的陣列方法
- 雙向資料繫結的vue肯定支援資料的動態渲染!
- 新的程式碼加入,控制一個數組的資料新增:
<input type="button" value="Push" onclick="pushArr()">
<script type="text/javascript">
var app = new Vue({
el: '#app',
data: {
objPerson: [
{ name: "Lucy", age: "18" },
{ name: "Bob", age: "19" },
{ name: "Tom", age: "21" }
]
}
})
function pushArr() {
console.log(app._data.objPerson.push({
name:"Ally",
age:"25"
}));
}
</script>
- 支援變化的元素渲染:
同樣,vue實現了眾多陣列方法改變資料時的渲染:
- push()
- pop()
- shift()
- unshift()
- splice()
- reverse()
資料的篩選重組和排序
-
目前來說,可以將資料通過外部函式更改資料內容,外部函式要麼主動觸發,要麼自動執行,自執行又會涉及到非同步問題!vue為了解決對資料的加工,在例項化vue物件的時候,可以為物件新增一個用於更改資料的方法,這個方法包含在computed屬性裡。
-
來看一個完整的例項:
<ol>
<li v-for="(item,index) in sortedArr" :key="index">{{item}}</li>
</ol>
<script type="text/javascript">
var app = new Vue({
el: '#ap