05 vue 內部指令
Vue2.0 內部指令學習記錄
Hello World
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<script type="text/javascript" src="../assets/js/vue.js"></script>
<title>Hello world</title>
</head>
<body>
<h1>Hello World</h1>
<hr>
<div id="app">
{{message}}
</div>
<script type="text/javascript">
var app = new Vue({
el:'#app' ,
data:{
message:'hello Vue!'
}
})
</script>
</body>
</html>
- 在
script
程式碼中先例項化vue
物件el
選項通過值#app
與id
值為app
的div
標籤進行關聯data
選項作為返回資料- 在關聯的
div
標籤中通過{{}}
來引用返回資料值
v-if & v-else & v-show
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>V-if&V-else&V-show</title>
<script type="text/javascript" src="../assets/js/vue.js"></script>
</head>
<body>
<h1>V-if&V-else&V-show</h1>
<hr>
<div id="app">
<div v-if="isLogin">你好,zhangdd</div>
<div v-else>你好,請先登入</div>
<hr>
<div v-show="isLogin">你好,zhangdd</div>
</div>
<script type="text/javascript">
var app =new Vue({
el:'#app',
data:{
isLogin:true
}
})
</script>
</body>
</html>
v-if
是vue
的一個內部指令,指令用在html
中用來判斷是否載入html
的DOM
- 當
data
選項中isLogin
為true
時顯示你好,zhangdd
- 當為
false
時顯示你好,請先登入
v-show
調整css
中的display
屬性值,根據isLogin
的值來控制是否顯示
v-for
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>V-for 案例</title>
<script type="text/javascript" src="../assets/js/vue.js"></script>
</head>
<body>
<h1>V-for</h1>
<hr>
<div id="app">
<ul>
<li v-for="item in items1">
{{item}}
</li>
</ul>
<hr>
<ul>
<li v-for="item in sortItems">
{{item}}
</li>
</ul>
<hr>
<ul>
<li v-for="student in sortStudents">
{{student.name}}-{{student.age}}
</li>
</ul>
</div>
<script type="text/javascript">
var app =new new Vue({
el:'#app',
data:{
items:[20,23,18,7,32,19,54,56,41],
items1:[20,23,18,7,32,19,54,56,41],
students:[
{name:'jspang',age:33},
{name:'panda',age:30},
{name:'lucky',age:26},
{name:'zhangdd',age:15}
]
},
computed:{
sortItems:function(){
return this.items.sort(sortNumber);
},
sortStudents:function(){
return sortByKey(this.students,'age');
}
}
})
function sortNumber(a,b){
return a-b;
}
//陣列物件方法排序:
function sortByKey(array,key){
return array.sort(function(a,b){
var x=a[key];
var y=b[key];
return ((x<y)?-1:((x>y)?1:0));
});
}
</script>
</body>
</html>
v-for
指令是迴圈渲染data
中的陣列,v-for
指令需要以item in items
的語法去使用items 是源資料陣列並且item是陣列元素迭代的別名。
做了三個迴圈的顯示,分別是
- 無序按照原陣列順序進行顯示
- 數字排序
- 自定義排序
computed
選項中做計算操作,需要注意的是該選項中如果不是對data
選項的資料做賦值操作,需要重新定義一個匿名變數,同時html
中在使用v-for
指定進行迴圈使用時用新定義的這個。
v-text & v-html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<script type="text/javascript" src="../assets/js/vue.js"></script>
<title>V-text & V-html</title>
</head>
<body>
<h1>V-text & V-html </h1>
<hr>
<div id="app">
<span>{{message}}</span>=<span v-text="message"></span>
<hr>
<span v-html="messageHtml"></span>
</div>
<script type="text/javascript">
var app =new Vue({
el:'#app',
data:{
message:'hello world',
messageHtml:"<h1>hello world</h1>"
}
})
</script>
</body>
</html>
在
html
中輸出data
選項中的值可以使用{{xxx}}
來完成,但是這麼做存在一定的弊端,當網速很慢或者javascript
出錯時在html
中顯示的直接就是{{xxx}}
。v-text
就是解決這個問題的。
- 通過
v-text
指定賦值data
選項裡的內容就可以得到對應的值- 同時保證了在
javascript
出錯或者網速慢的時候不會出現不友好的{{xxx}}
現象
如果
data
選項中的值為html
標籤,在通過{{xxx}}
或者v-text
進行輸出時,現象是無法輸出或者原資料輸出,即無法解析。這個時候就需要使用v-html
指定來完成操作了。但是
v-html
指定在使用時有一定的弊端。在生產環境中動態渲染HTML是非常危險的,因為容易導致XSS攻擊。所以只能在可信的內容上使用v-html,永遠不要在使用者提交和可操作的網頁上使用
v-on
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>v-on 事件監聽器</title>
<script type="text/javascript" src="../assets/js/vue.js"></script>
</head>
<body>
<h1>v-on 事件監聽器</h1>
<hr>
<div id="app">
本場比賽得分 {{count}}
<br>
<button v-on:click="addScore">加分</button>
<button @click="descScore">減分</button>
<br>
<input type="text" v-on:keyup.enter="onEnter" v-model="secondScore">
</div>
<script type="text/javascript">
var app=new Vue({
el:'#app',
data () {
return {
count:0,
secondScore:1
}
},
methods: {
addScore:function(){
this.count++;
},
descScore:function(){
this.count--;
},
onEnter:function(){
this.count+=parseInt(this.secondScore)
}
}
})
</script>
</body>
</html>
v-on
就是監聽事件,可以用v-on
指令監聽DOM
事件來觸發一些javascript
程式碼另外
v-on
也有簡寫的方式通過@
代替
v-on:click="addScore"
關聯一個addScore
方法- 在
methods
選項中實現對應方法- 同樣的方式通過
@click="descScore"
關聯descScore
方法- 在
methods
選項中實現對應方法
另外還可以和鍵盤事件進行繫結
v-on:keyup.enter="onEnter"
將回車鍵和onEnter
方法進行關聯- 在
methods
選項中實現對應的方法v-model
是資料來源的繫結即繫結值為data
選項中對應的值
v-model
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>v-model 例項</title>
<script type="text/javascript" src="../assets/js/vue.js"></script>
</head>
<body>
<h1>v-model 例項</h1>
<hr>
<div id="app">
<p>原始文字資訊</p>{{message}}
<p>v-model:<input type="text" v-model="message"></p>
<p>v-model.lazy:<input type="text" v-model.lazy="message"></p>
<p>v-model.number: <input type="text" v-model.number="message"></p>
<p>v-model.trim: <input type="text" v-model.trim="message"></p>
<h3>文字域</h3>
<textarea cols="30" rows="10" v-model="message"></textarea>
<h3>多選按鈕繫結一個值</h3>
<input type="checkbox" id="isTrue" v-model="isTrue">
<label for="isTrue">{{isTrue}}</label>
<h3>多選繫結一個數組</h3>
<input type="checkbox" id="JSPang" value="JSPang" v-model="web_name">
<label for="JSPang">JSPang</label>
<input type="checkbox" id="panda" value="panda" v-model="web_name">
<label for="panda">panda</label>
<input type="checkbox" id="panpan" value="panpan" v-model="web_name">
<label for="panpan">panpan</label>
<p>{{web_name}}</p>
<h3>單選按鈕繫結</h3>
<input type="radio" id="one" value="男" v-model="sex">
<label for="one">男</label>
<input type="radio" id="two" value="女" v-model="sex">
<label for="two">女</label>
<p>{{sex}}</p>
</div>
<script type="text/javascript">
var app = new Vue({
el: '#app',
data() {
return {
message: 'hello world',
isTrue: false,
web_name:[],
sex:'男'
}
}
})
</script>
</body>
</html>
v-model
指定用來完成資料繫結的功能。
v-bind
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>v-bind 例項</title>
<script type="text/javascript" src="../assets/js/vue.js"></script>
</head>
<body>
<h1>v-bind 例項</h1>
<hr>
<div id="app">
<p>
<img v-bind:src="imgSrc" width="200px"></p>
<p><a :href="web_url" target="_blank">百度</a></p>
<hr>
<div :class="className">1. 繫結Class</div>
<div :class="{classA:isOk}">2. 繫結Class中的判斷</div>
<input type="checkbox" id="isOk" v-model="isOk">
<label for="isOk">{{isOk}}</label>
<div :class="[classA,classB]">3. 繫結Class中的陣列</div>
<div :class="isOk?classA:classB">4、繫結class中的三元表示式判斷</div>
<div :style="{color:red,fontSize:font}">5、繫結style</div>
<div :style="styleObject">6、用物件繫結style樣式</div>
</div>
<style>
.classA {
color: red }
.classB {
font-size: 150% }
</style>
<script type="text/javascript">
var app = new Vue({
el: '#app',
data() {
return {
imgSrc: 'https://www.baidu.com/img/bd_logo1.png?where=super',
web_url: 'https://www.baidu.com',
className: 'classA',
isOk: false,
classA: 'classA',
classB: 'classB',
red:'red',
font:'20px',
styleObject:{
color:'green',
fontSize:'24px'
}
}
}
})
</script>
</body>
</html>
v-bind
是處理HTML
中的標籤屬性的,和v-on``v-model
同為繫結,只不過繫結的點不一樣
v-pre & v-cloak & v-once
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>v-pre & v-cloak & v-once 例項</title>
<script type="text/javascript" src="../assets/js/vue.js"></script>
</head>
<body>
<h1>v-pre & v-cloak & v-once 例項</h1>
<hr>
<div id="app">
<div v-pre>{{message}}</div>
<div v-cloak>渲染完成後才會顯示</div>
<p v-once>第一次繫結的值: {{message}}</p>
<input type="text" v-model="message">
<div>{{message}}</div>
</div>
<script type="text/javascript">
var app = new Vue({
el: '#app',
data() {
return {
message: 'hello world'
}
}
})
</script>
</body>
</html>
v-pre
可以跳過vue
的編譯直接輸出原始值即{{xxx}}
v-cloak
在頁面進行載入時,只有載入完成後才會顯示的內容
v-once
在第一次DOM
時進行渲染,渲染完成後視為靜態內容,跳出以後的渲染過程