1、基本指令
1.1、v-cloak
v-cloak作用:解决初始化慢导致页面闪动的指令,简单点来说防止页面加载时出现 vue.js 的变量名而设计的,这个指令通常与display:none进行结合使用。
(1)、 v-cloak 的用法:
<head>
<meta charset="UTF-8">
<title>Document</title>
<style>
[v-cloak] {
display: none; //结合使用
}
</style>
</head>
<body>
<div id="app">
<p v-cloak>{{msg}}</p> //vue.js的变量名
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
<script>
var app = new Vue({
el: "#app",
data: {
msg: "我是某某"
}
})
</script>
</body>
但有时添加完毕后仍有部分变量会显示,通过控制台查看,原来是 v-cloak 的display属性被优先级别高的样式覆盖所导致,处理方案是可以添加 !important ,新css样式如下:
[v-cloak] {
display:none !important;
}
1.2、v-once
定义它的元素和组件只渲染一次
(1)、v-once的用法:
<div id='app'>
<span>{{oncedata}}</span>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
<script>
var app = new Vue({
el: "#app", //注意id对应的要加个#
data: {
oncedata: "我想吃苹果"
}
})
</script>
通过浏览器控制台修改app.oncedata="我想运动"
,发现不能重新渲染,说明once属性只能渲染一次。
2、 条件渲染指令
2.1、 v-if, v-else-if ,v-else
条件判断语句,
<div v-if='6<3'>{{apple}}</div>
,注意v-if后面接的是等号(=),等号内容是一个布尔值。其中v-if, v-else-if ,v-else三者可以结合使用。
(1)、 v-if, v-else-if ,v-else的用法:
<div id='app'>
<!-- 判断6<3的真假,返回一个布尔值,如为真则执行
该语句后面else的表达式不执行,否则跳到一条表达式 -->
<div v-if='6<3'>{{apple}}</div>
<div v-else-if='9>5'>{{banana}}</div>
<div v-else>{{peach}}</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
<script>
var app = new Vue({
el: "#app",
data: {
apple:'apple',
banana:'banana',
peach:'peach'
}
})
</script>
实例如下:
<div id='app'>
<div v-if="type==='name'">
用户名:<input type='text' placeholder="请输入用户名" key='123'>
</div>
<div v-else>
密码:<input type='text' placeholder="请输入密码" key='456'>
</div>
<button v-on:click="switchType">点我,切换</button>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
<script>
var app = new Vue({
el: "#app",
data: {
type: "name" //初始化用户名输入框值
},
methods: {
switchType: function () {
// 三元运算符优先级要高于赋值预算符
this.type = (this.type === 'name' ? 'password' : 'name')
}
}
})
</script>
v-if的弊端 :Vue 在渲染元素时 ,出于效率考虑,会尽可能地复用已有的元素而非重新渲染, 因此会出现乌龙只会渲染变化的元素,也就是说,input元素被复用了。
解决方法:加key,提供key值可以来决定是否复用该元素,key值不重复就行,值随意定义。
2.2、v-show
条件判断语句,
<p v-show='9>5'>我被渲染了</p>
,注意v-show后面接的是等号(=),等号内容是一个布尔值。v-show的用法几乎和v-if用法一样
<div id='app'>
<p v-show='9>5'>我被渲染了</p>
</div>
v-if和v-show的具体比较:
1、v-if: 实时渲染:页面显示就渲染,不显示。我就给你移除
2、v-show: v-show的元素永远存在也页面中,只是改变了css的display的属性
举个例子,当你的页面需要实时渲染的效果,就要用到v-if指令,但当你只需要频繁切换页面的话,就用v-show指令即可。
3 列表渲染指令v-for
当需要将一个数组遍历或枚举一个对象属性的时候循环显示时,就会用到列表渲染指令 v-for。
两种使用场景:
1、遍历多个对象
2、遍历一个对象的多个属性
(1)、遍历多个对象
用法:
<li v-for='value in VueMethods'>{{value.name}}</li>
v-for一定是写在要遍历的元素上(如要遍历列表的对象,就要写在li标签上)v-for后接等号,写法类似于item in items,其中value是变量,VueMethods是遍历的数组,注意遍历多个对象一定是遍历的数组。
示例1:
<div id='app'>
<ul>
<li v-for='value in VueMethods'>{{value.name}}</li>
</ul>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
<script>
var app = new Vue({
el: "#app",
data: {
VueMethods:[
{name:'多思考'},
{name:'多练习'},
{name:'多做题'}
]
},
})
</script>
带索引的写法:括号的第一个变量,代表遍历对象,第二个是index
示例2:
<div id='app'>
<!-- 带索引的写法:括号的第一个变量,代表遍历对象,第二个代表index -->
<ul>
<li v-for='(value,index) in VueMethods'>{{index}}--{{value.name}}</li>
</ul>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
<script>
var app = new Vue({
el: "#app",
data: {
VueMethods: [
{ name: '多思考' },
{ name: '多练习' },
{ name: '多做题' }
]
},
})
</script>
(2)、遍历一个对象的多个属性
示例1:
<div id='app'>
<span v-for='value in nvshen'> {{value}} </span>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
<script>
var app = new Vue({
el: "#app",
data: {
nvshen: {
girl1: '李冰冰',
girl2: '范诗诗',
girl3: '赵婷婷'
}
},
})
</script>
带索引的写法:括号的第一个是变量,代表遍历对象,第二个是key值,第三个是index,顺序不能弄乱。
<div id='app'>
<span v-for='(value,key,index) in nvshen'> 第{{index}}女神
--{{key}}--{{value}} </span>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
<script>
var app = new Vue({
el: "#app",
data: {
nvshen: {
girl1: '李冰冰',
girl2: '范诗诗',
girl3: '赵婷婷'
}
},
})
</script>
4、 数组更新,过滤与排序
改变数组的一系列方法:
• push()在末尾添加元素
• pop()将数组的最后一个元素移除
• shift()删除数组的第一个元素
• unshift()在数组的第一个元素位置添加一个元素
• splice() :可以添加或者删除函数—返回删除的元素
splice三个参数:
第一个参数 表示开始操作的位置;
第二个参数表示:要操作的长度(如果是0表示要添加,否则就是删除操作)
第三个为可选参数(第二个参数是0,第三参数就是要添加内容)
• sort():排序
<div id="app">
<div v-for='study in arr'>{{study}}</div>
<button @click='sortArr'>点我排序</button>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
<script>
var app = new Vue({
el: '#app',
data: {
arr: ['book', 'pen', 'pencil']
},
methods: {
sortArr: function () {
this.arr.sort(function (a, b) {
return a.length - b.length
})
}
}
})
</script>
JS 数组sort方法升序是a-b详解点击查看
• reverse():翻转
<div id="app">
<div v-for='study in arr'>{{study}}</div>
<button @click='reverseArr'>点我翻转</button>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
<script>
var app = new Vue({
el: '#app',
data: {
arr: ['book', 'pen', 'pencil']
},
methods: {
reverseArr:function(){
this.arr.reverse()
}
}
})
</script>
两个数组变动vue检测不到:
- 改变数组的指定项(常规做法是检测不到,如下例)
<body>
<div id="app">
<div v-for='study in arr'>{{study}}</div>
<button @click='changeOne'>改变数组指定项</button>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
<script>
var app = new Vue({
el: '#app',
data: {
arr: ['book', 'pen', 'pencil']
},
methods: {
changeOne: function () {
this.arr[0] = 'car' //Vue这样是不能实现改变数组的指定项
},
}
})
</script>
</body>
解决方法:改变指定项:Vue.set(app.arr,1,”car”)
--Vue相当于全局变量,利用set方法,参数1是对象,参数2是改变位置下标,参数3是替换内容
<body>
<div id="app">
<div v-for='study in arr'>{{study}}</div>
<button @click='changeOne'>改变数组指定项</button>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
<script>
var app = new Vue({
el: '#app',
data: {
arr: ['book', 'pen', 'pencil']
},
})
Vue.set(app.arr,1,'car') //Vue相当于全局变量
</script>
</body>
- 改变数组长度(常规做法是检测不到,如下例)
<body>
<div id="app">
<div v-for='study in arr'>{{study}}</div>
<button @click='changeArrLength'>改变数组长度</button>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
<script>
var app = new Vue({
el: '#app',
data: {
arr: ['book', 'pen', 'pencil']
},
methods:{
changeArrLength:function(){
this.arr.length=1
}
}
})
</script>
</body>
解决方法:
上述例子中的this.arr.length=1
改成this.arr.splice(1)
数组长度将变成1,或者在浏览器控制台调试代码为app.arr.splice(1)
• filter():过滤
需求:找到数组中含有字符串OO的项
<body>
<div id="app">
{{matchOO}}
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
<script>
var app = new Vue({
el: '#app',
data: {
arr: ['book', 'pen', 'pencil']
},
computed: {
matchOO: function () {
return this.arr.filter(function (book) {
return book.match(/oo/)
})
}
}
})
</script>
</body>
match() 方法可在字符串内检索指定的值,或找到一个或多个正则表达式的匹配。
5.5 方法和事件
1 、基本用法
v-on绑定的事件类似于原生 的onclick等写法
<body>
<div id="app">
点击次数:{{count}}
<button @click='handle()'>每次点击加1</button>
<button @click='handle(8)'>每次点击加8</button>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
<script>
var app = new Vue({
el: '#app',
data: {
count: 0
},
methods: {
handle: function (count) { //方法带有参数count
count = count || 1;
this.count += count
}
}
})
</script>
</body>
注意如果方法中带有参数,但是你没有加括号,默认传原生事件对象event,所以当方法带有参数时要带上括号。
2、修饰符
(1)、stop:阻止单击事件向上冒泡
<body>
<div id="app">
<div @click='divButton' style="width:100px;height:100px;background-color:blue">
<button @click.stop='btn'>button</button>
</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
<script>
var app = new Vue({
el: '#app',
data: {
},
methods: {
divButton: function () {
alert('div被点击了')
},
btn: function () {
alert('button被点击了')
},
}
})
</script>
</body>
当我们点击子元素btn时候,如果没有加上stop,事件就会向上冒泡导致父元素也会出现弹框。我们可以通过添加和删去stop来测试具体效果。
(2)、self:只是作用在元素本身而非子元素的时候调用
<body>
<div id="app">
<div @click.self='divButton' style="width:100px;height:100px;background-color:blue">
<button @click='btn'>button</button>
</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
<script>
var app = new Vue({
el: '#app',
data: {
},
methods: {
divButton: function () {
alert('div被点击了')
},
btn: function () {
alert('button被点击了')
},
}
})
</script>
</body>
self一定是写在父元素身上,当点击父元素还是子元素都会只作用自身,不会发生向上冒泡情况。
(3)、prevent:提交事件并且不重载页面
<body>
<div id="app">
<form action="" @submit.prevent>
<button type='submit'>提交表单</button>
</form>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
<script>
var app = new Vue({
el: '#app',
data: {
},
})
</script>
</body>
当我们表单提交时不想,进行刷新页面,就需要添加prevent,因为是不想表单刷新,所有应该写在form标签中。
(4)、once: 只执行一次的方法
<body>
<div id="app">
<button @click='onceButton'>多次点击</button>
<button @click.once='onceButton'>一次点击</button>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
<script>
var app = new Vue({
el: '#app',
data: {
},
methods: {
onceButton: function () {
alert('可以进行多少次点击')
},
}
})
</script>
</body>
点击多次点击按钮,可以一直出现弹框,点击一次点击按钮(添加了once)只出现一次,后面再次点击就会起作用了。
(5)、监听鼠标事件
<body>
<div id="app">
<input @keyup.13='submitMe'> //13就是代表enter键,常规写法
<input @keyup.enter='submitMe'> //vueJS提供便捷方式写法
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
<script>
var app = new Vue({
el: '#app',
data: {
},
methods: {
submitMe: function () {
alert('你按下了enter键')
}
}
})
</script>
</body>
当我们按下enter键,就能监听该事件发生了。但是vueJS给我们提供很多便捷方式写法如直接就可以.enter
、.tab
、.delete
等这样写法就行。