简述
Vue.js的指令是以v-开头的,它们作用于HTML元素,指令提供了一些特殊的特性,将指令绑定在元素上时, 指令会为绑定的目标元素添加一些特殊的行为,也可以将指令看作特殊的HTML特性(attribute)。 Vue.js提供了以下几个常用的内置指令:
v-if指令 v-show指令 v-else指令 v-for指令 v-bind指令 v-on指令 Vue.js具有良好的扩展性,我们也可以开发一些自定义的指令。
v-if指令
v-if是条件渲染指令,它根据表达式的真假来删除和插入元素,它的基本语法如下:
v-if=”expression” expression是一个返回bool值的表达式,表达式可以是一个bool属性,也可以是一个返回bool的运算式。 测试则可在控制台中执行测试代码。。。
<div id="test-if">
<h1 v-if="yes">测试标题</h1>
<p v-if="no">测试内容,测试内容。测试内容,测试内容。</p>
<p v-if="textnum >= 110">测试内容可以输入字!</p>
<span v-if="name.indexOf('Jon') >= 0"></span>
</div>
<script>
new Vue({
el: "#test-if",
data: {
yes: true,
no: false,
textnum: 100,
name: 'Jon'
}
});
<script>
这段代码使用了4个表达式:
数据的yes属性为true,所以”Yes!”会被输出; 数据的no属性为false,所以”No!”不会被输出; 运算式age >= 25返回true,所以”测试内容可以输入110字!”会被输出; 运算式name.indexOf(‘Jon’) >= 0返回yes,所以”Jon”会被输出。
注意:v-if指令是根据条件表达式的值来执行元素的插入或者删除行为。 这一点可以从渲染的HTML源代码看出来,面上属性为false的标签元素没有渲染到HTML。
v-show指令
v-show也是条件渲染指令,和v-if指令不同的是,使用v-show指令的元素始终会被渲染到HTML,它只是简 单地为元素设置CSS的style属性。
<div id="app">
<h1>Hello, Vue.js!</h1>
<h1 v-show="yes">Yes!</h1>
<h1 v-show="no">No!</h1>
<h1 v-show="age >= 25">Age: </h1>
<h1 v-show="name.indexOf('jack') >= 0">Name: </h1>
</div>
<script>
var vm = new Vue({
el: '#app',
data: {
yes: true,
no: false,
age: 28,
name: 'keepfool'
}
})
</script>
在Chrome控制台更改age属性,使得表达式age >= 25的值为false,可以看到<h1>Age: 24</h1>元素被设置了 style=”display:none”样式。
v-else指令
可以用v-else指令为v-if或v-show添加一个“else块”。v-else元素必须立即跟在v-if或v-show元素的后面 ——否则它不能被识别。
<div id="test-else">
<span v-if="age >= 10">Age: </span>
<span v-else>name: </span>
<br>
<span v-show="age <= 10">Age: </span>
<span v-else>sex: </span>
</div>
<script>
new Vue({
el: '#test-else',
data: {
age: 4,
name: "Jon",
sex: "男"
}
});
<script>
v-else元素是否渲染在HTML中,取决于前面使用的是v-if还是v-show指令。 这段代码中v-if为true,后面的v-else不会渲染到HTML;v-show为tue,但是后面的v-else仍然渲染到HTML了。
v-for指令
v-for指令基于一个数组渲染一个列表,它和JavaScript的遍历语法相似:
v-for=”item in items” items是一个数组,item是当前被遍历的数组元素。
<div id="test-for">
<ul v-for="list in lists">
<li></li>
<li></li>
</ul>
</div>
new Vue({
el: "#test-for",
data: {
lists: [{
name: 'Jon',
age: 10
},{
name: 'You',
age: 20
},{
name: 'Lida',
age: 30
}]
}
})
在选项对象的data属性中定义了一个lists数组,然后在#test-for元素内使用v-for遍历people数组,输出 每个person对象的姓名、年龄和性别。
v-bind指令
v-bind指令可以在其名称后面带一个参数,中间放一个冒号隔开,这个参数通常是HTML元素的特性(attribute),例如:v-bind:class
v-bind:argument=”expression” 下面这段代码构建了一个简单的分页条,v-bind指令作用于元素的class特性上。 这个指令包含一个表达式,表达式的含义是:高亮当前页。
<div id="test-bind">
<ul class="pagination">
<li v-for="n in pageCount">
<a href="javascripit:void(0)" v-bind:class="activeNumber === n ? 'active' : ''"></a>
</li>
</ul>
</div>
<script>
new Vue({
el: "#test-bind",
data: {
activeNumber: 1,
pageCount: 10
}
});
</script>
v-on指令
v-on指令用于给监听DOM事件,它的用语法和v-bind是类似的,例如监听元素的点击事件:
有两种形式调用方法:绑定一个方法(让事件指向方法的引用),或者使用内联语句。 Greet按钮将它的单击事件直接绑定到greet()方法,而Hi按钮则是调用say()方法。
<div id="app-1">
<p><input type="text" v-model="message"/></p>
<p>
<!-- click直接绑定 -->
<button v-on:click="greet">Greet</button>
</p>
<p>
<!-- click内连语句 -->
<button v-on:click="say('Hi')">Hi</button>
</p>
</div>
var Dom2 = new Vue({
el: "#app-1",
data: {
message: 'Hello, Vue.js!'
},
methods: {
greet: function () {
alert(this.message);
},
say: function (msg) {
alert(msg);
}
}
});
自定义指令
自定义一个1秒切换文字颜色的指令
<p id="con" v-color></p>
<script>
Vue.directive('color', {
inserted: function (el) {
setInterval(function () {
var colors = Math.floor(Math.random()*1000000);
el.style.color = '#' + colors;
//alert('#' + colors);
}, 1000);
}
});
new Vue({
el: "#con",
data: {
text: "测试内容测试内容测试内容"
}
});
</script>
以上代码会让p中的文字随机添加color值;