Vue内置指令
1 v-show:根据表达式的真假值来显示和隐藏元素
v-show
根据表达式的真假值来显示和隐藏元素,它通过样式的display
控制标签的显隐。
在下面的示例中,第一个p
标签不设置该属性,第二个p
标签设置v-show
为true
,第三个p
标签设置v-show
为false
,最后的结果是显示前两个p
标签,第三个不显示,示例代码如下:
<div id="app">
<p>我是橘猫吃不胖</p>
<p v-show="show">AAAAA</p>
<p v-show="hide">BBBBB</p>
</div>
<script>
var vm = new Vue({
el: '#app',
data: {
show: true, // 显示AAAAA
hide: false // 隐藏AAAA
}
})
</script>
除此之外,可以动态的修改v-show
的属性值,示例代码如下:
<div id="app">
<p>我是橘猫吃不胖</p>
<p v-show="show">AAAAA</p>
<p v-show="hide">BBBBB</p>
</div>
<script>
var vm = new Vue({
el: '#app',
data: {
show: true,
hide: false
}
})
// 每隔1秒修改hide的值,达到在屏幕上闪烁的效果
window.setInterval(function () {
vm.hide = !vm.hide
}, 1000)
</script>
2 v-html:插入标签
v-html
会向指定节点中渲染包含html
结构的内容,它与插值语法的区别是:v-html
会替换掉节点中所有的内容,插值语法则不会,并且v-html
可以识别html
结构。
示例代码:
<div id="app">
<div v-html="str"></div>
</div>
<script>
var vm = new Vue({
el: "#app",
data: {
str: "<h3>橘猫吃不胖</h3>"
}
})
</script>
3 v-text:在元素当中插入值
v-text
向其所在的节点中渲染文本内容,它与插值语法{{}}
的区别是:v-text
会替换掉元素中所有的内容,但是插值语法不会。
示例代码:
<div id="app">
<!-- 插值语法 -->
<div>{{name}}</div>
<!-- 即使元素中有内容,但是仍旧会被替换掉 -->
<div v-text="name">aaaaaaa</div>
</div>
<script>
var vm = new Vue({
el: "#app",
data: {
name: "橘猫吃不胖"
}
})
</script>
4 v-if和v-else:根据表达式的真假值来动态插入和移除元素
v-if
和v-else
可以根据表达式的真假值来动态插入和移除元素。
示例:根据不同的表达式真假值显示不同的效果,当role设置为0的时候,显示超级管理员
<div id="app">
<p v-if="role == 0">超级管理员</p>
<p v-else-if="role == 1">普通管理员</p>
<p v-else>账户已停用</p>
</div>
<script>
var vm = new Vue({
el: "#app",
data: {
role: 0 // 设置role的值
}
})
</script>
当设置role为1时,显示普通管理员
<div id="app">
<p v-if="role == 0">超级管理员</p>
<p v-else-if="role == 1">普通管理员</p>
<p v-else>账户已停用</p>
</div>
<script>
var vm = new Vue({
el: "#app",
data: {
role: 1 // 设置role的值
}
})
</script>
当role不为0或者1时,显示账户已停用
<div id="app">
<p v-if="role == 0">超级管理员</p>
<p v-else-if="role == 1">普通管理员</p>
<p v-else>账户已停用</p>
</div>
<script>
var vm = new Vue({
el: "#app",
data: {
role: 3 // 设置role的值
}
})
</script>
5 v-for:根据变量的值来循环渲染元素
v-for
可以根据变量的值来循环渲染元素。
示例:v-for
指令遍历数组
<div id="app">
<span v-for="i in arr"> {{ i }} </span>
</div>
<script>
var vm = new Vue({
el: "#app",
data: {
arr: [11, 22, 33, 44] // 定义arr数组
}
})
</script>
示例:v-for
遍历数组及数组中元素的索引
<div id="app">
<span v-for="(i , index) in arr"> {{ index }} : {{ i }} </span>
</div>
<script>
var vm = new Vue({
el: "#app",
data: {
arr: [11, 22, 33, 44] // 定义arr数组
}
})
</script>
示例:v-for
指令遍历对象
<div id="app">
<span v-for="i in obj"> {{ i }} </span>
</div>
<script>
var vm = new Vue({
el: "#app",
data: {
obj: { // 定义对象
"a": 1,
"b": 2,
"c": 3
}
}
})
</script>
示例:
v-for
遍历对象的属性名及属性值
<div id="app">
<span v-for="(item,key) in obj">
{{ key }}:{{ item }}
</span>
</div>
<script>
var vm = new Vue({
el: "#app",
data: {
obj: { // 定义对象
"a": 1,
"b": 2,
"c": 3
}
}
})
</script>
示例:v-for
遍历对象的索引、属性名及属性值
<div id="app">
<span v-for="(item,key,index) in obj">
{{ index }}—{{ key }}:{{ index }}
</span>
</div>
<script>
var vm = new Vue({
el: "#app",
data: {
obj: { // 定义对象
"a": 1,
"b": 2,
"c": 3
}
}
})
</script>
示例:v-for
遍历对象数组
<div id="app">
<span v-for="item in obj">
{{ item }}
</span>
</div>
<script>
var vm = new Vue({
el: "#app",
data: {
obj: [
{ name: "张三", age: 20 },
{ name: "李四", age: 21 },
{ name: "王五", age: 22 }
]
}
})
</script>
示例:v-for
指令遍历对象数组的具体内容
<div id="app">
<span v-for="item in obj">
{{ item.name }}
{{ item.age }}
</span>
</div>
<script>
var vm = new Vue({
el: "#app",
data: {
obj: [
{ name: "张三", age: 20 },
{ name: "李四", age: 21 },
{ name: "王五", age: 22 }
]
}
})
</script>
示例:v-for
遍历常量
<div id="app">
<span v-for="i in 5">
{{ i }}
</span>
</div>
<script>
var vm = new Vue({
el: "#app"
})
</script>
6 v-bind:单向绑定绑定元素的属性
v-bind
可以绑定元素的属性并执行相应的操作,它可以简写为:
。未使用v-bind
绑定之前,属性后面的内容是普通字符串,比如<a href="link">去百度</a>
,href
后的link
是一个字符串,达不到跳转的目的;使用v-bind
绑定属性之后,href
属性之后的link
是一个表达式,例如<a v-bind:href="link">去百度</a>
,这样就可以进行跳转。
示例:使用v-bind
绑定a标签的href
属性,使链接生效
<div id="app">
<!-- 另一种写法:<a :href="link">去百度</a> -->
<a v-bind:href="link">去百度</a>
</div>
<script>
var vm = new Vue({
el: "#app",
data: {
link: "https://www.baidu.com"
}
})
</script>
7 v-on:监听元素事件,并执行相应的操作
v-on
用来监听元素事件,并执行相应的操作,它可以简写为@
,语法如下:
<!-- 不传递参数 -->
<button v-on:click="事件名"></button>
<!-- 需要传递参数 -->
<button v-on:click="事件名($event, 参数1, 参数2...)"></button>
<!-- $event表示事件对象 -->
注意:
(1)事件的回调需要配置在methods
对象中,最终会在Vue实例上;
(2)methods
中配置的函数,不可以使用箭头函数,否则会改变this
的指向;
(3)methods
中配置的函数,都是被Vue管理的函数,this
指向Vue实例或组件实例对象;
(4)如果需要传递参数,可以使用$event
对事件对象event
来进行占位;
示例:使用v-on
绑定一个事件
<div id="app">
<button v-on:click="myClick">点击</button>
</div>
<script>
var vm = new Vue({
el: "#app",
methods: {
myClick: function () {
console.log("点击了按钮");
}
}
})
</script>
示例:v-on
绑定多个事件
<div id="app">
<button v-on="{
click: myClick,
mouseenter: mouseEnter,
mouseleave: mouseLeave
}">点击</button>
</div>
<script>
var vm = new Vue({
el: "#app",
methods: {
myClick: function () {
console.log("点击了按钮");
},
mouseEnter: function () {
console.log("鼠标进入按钮");
},
mouseLeave: function () {
console.log("鼠标移出按钮");
}
}
})
</script>
8 v-model:实现了数据和视图的双向绑定
v-model
可以实现数据和视图的双向绑定,它只能应用在表单类元素上(输入类元素),如input
、select
等。v-model:value
可以简写为v-model
,因为v-model
默认收集的就是value
值。
Vue中有两种数据绑定的方式:
- 单向绑定
v-bind
,数据只能从data
流向页面。- 双向绑定
v-model
,数据不仅能从data
流向页面,还可以从页面流向data
示例:v-model
与input
进行绑定,选择性别后在下方显示选择
<div id="app">
<p>请选择你的性别:</p>
<input type="radio" value="男" v-model="gender">男
<input type="radio" value="女" v-model="gender">女
<p>您选择的性别是:{{ gender }}</p>
</div>
<script>
var vm = new Vue({
el: "#app",
data: {
gender: ""
}
})
</script>
示例:v-model
与选择器绑定,在下方显示选择的值
<div id="app">
<p>请选择你的幸运数字:</p>
<select v-model="number">
<option>1</option>
<option>2</option>
</select>
<p>你的选择是:{{ number }}</p>
</div>
<script>
var vm = new Vue({
el: "#app",
data: {
number: ""
}
})
</script>
示例:与textarea
绑定,当textarea
中的值变化时,也同步显示在页面上
<div id="app">
<textarea v-model="content"></textarea>
<p>文本框中内容:{{ content }}</p>
</div>
<script>
var vm = new Vue({
el: "#app",
data: {
content: "今天是个好日子" // 设置textarea初始就是有值的
}
})
</script>
9 v-once:让元素或组件只渲染一次
v-once
指令可以让元素或组件只渲染一次,并跳过之后的更新。
示例代码:
<div id="app">
<h3>v-once</h3>
<input type="text" v-model="voncetext" />
<p>{{voncetext}}</p>
<p v-once>{{voncetext}}</p>
</div>
<script>
new Vue({
el: '#app',
data: {
voncetext: "测试v-once"
}
})
</script>
两个p
标签,input
中使用了v-model
双向绑定了对象属性voncetext
,
(1)在没有使用v-once
的时候,输入框的值改变了,p
标签的内容也会随之改变
(2)在使用v-once
的时候,输入框的值改变了,p
标签的内容不会改变
10 v-pre:跳过这个元素和它的子元素的编译过程
v-pre
指令用于跳过这个元素和它的子元素的编译过程。对于大量没有指令的节点使用v-pre
指令可以加快编译速度。换句话说,我们的代码写了什么样,页面上就显示什么样。
示例:给h1
使用v-pre
指令,导致插值语法不再编译
<div id="app">
<h1 v-pre>{{ message }}</h1>
</div>
<script>
new Vue({
el: '#app',
data: {
message: '橘猫吃不胖'
}
})
</script>
11 v-cloak:解决初始化慢而导致页面闪动
插值表达式存在“闪动”的问题:vue.js文件没有加载完成时,在页面上上会出现 “{{message}}
”的字样,等到vue创建实例、编译模板时,DOM就会被替换掉,过程中屏幕上会出现闪动一下。v-cloak
指令可以解决初始化慢而导致页面闪动的问题,隐藏尚未完成编译的 DOM 模板。
v-cloak
会保留在所绑定的元素上,直到相关组件实例被挂载后才移除。配合像[v-cloak] { display: none }
这样的CSS规则,它可以在组件编译完毕前隐藏原始模板。具体如下:
<div v-cloak>
{{ message }}
</div>
[v-cloak] {
display: none;
}
示例代码:
<div id="app" v-cloak>{{message}}</div>
<style>
[v-cloak] {
display: none;
}
</style>
<script>
var app = new Vue({
el: "#app",
data: {
message: "this is a book"
}
})
</script>