基本指令02
2021-02-08 本文已影响0人
孤星Erwin
v-show
v-show 指令通过改变元素的 css 属性(display)来决定元素是显示还是隐藏,根据表达式的真假,切换元素的display css属性
<div id="app">
<h3 v-show="flag">
{{ message }}
</h3>
</div>
<script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.12/vue.js"></script>
<script type="text/javascript">
var vm = new Vue({
el: "#app",
data: {
message: "v-show展示",
flag: false
}
})
</script>
v-show.png
v-if
v-if控制元素的显示隐藏方式是直接删除和添加DOM元素
<div id="app">
<h3 v-if="flag">
{{ message }}
</h3>
</div>
<script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.12/vue.js"></script>
<script type="text/javascript">
var vm = new Vue({
el: "#app",
data: {
message: "v-if展示",
flag: false
}
})
</script>
表达式的值为假时,页面并不添加此DOM元素
v-if.png结合v-else和v-else-if使用
<h3 v-if="age >= 30 && age < 40">中年</h3>
<h3 v-else-if="age < 25 && age >= 18">青年</h3>
<h3 v-else-if="age < 10 && age >= 0">小孩</h3>
<h3 v-else>要相信光</h3>
v-if和v-show的区别
一、功能区别
同样的实现控制元素的显示和隐藏,v-show严格意义上是“条件隐藏”,把HTML元素先渲染起来,符合条件就显示,不符合条件display就为none,不显示,但是元素还在那。而v-if是真正意义上的“条件渲染”,浏览器先判断符不符合条件,符合了再渲染,否则不渲染DOM,浏览器中找不到这个DOM
二、vue生命周期区别
v-if由于是重新渲染,所以每次切换一次会重新走一次生命周期,v-show由于只是控制显示隐藏,所以除了初始化渲染,其他时候都不会再走相关生命周期了
三、性能区别
1、v-if有更高的切换开销,v-show有更高的初始渲染开销。如果需要频繁的切换,使用v-show比较好,如果运行条件很少改变,使用v-if比较好
2、v-show比v-if性能更高,因为v-show只能动态的改变样式,不需要增删DOM元素。所以当程序不是很大时候,v-if和v-show区别都不大,如果项目很大,推荐多用v-show,较少浏览器后期操作的性能。
v-for
遍历普通数组
v-for中可以使用in 和 of来遍历,在v-for中,这两个没什么区别,都可以使用
在es5/6中,for in 遍历对象,for of 遍历数组
<div id="app">
<ul>
<li v-for="(item,index) in arr">索引值:{{index}}------每一项{{item}}</li>
<hr>
<li v-for="(item,index) of arr">索引值:{{index}}------每一项{{item}}</li>
</ul>
</div>
<script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.12/vue.js"></script>
<script type="text/javascript">
var vm = new Vue({
el: "#app",
data: {
arr: [1,2,3,4,5,6]
}
})
</script>
v-for1.png
遍历对象
v-for="(值,键,索引) in 原对象"
<div id="app">
<ul>
<li v-for="(val,key,i) in user">键:{{key}}------值:{{val}}------索引{{i}}</li>
</ul>
</div>
<script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.12/vue.js"></script>
<script type="text/javascript">
var vm = new Vue({
el: "#app",
data: {
user: {
id: 1,
name: 'lisa',
age: 22
}
}
})
</script>
v-for2.png
遍历对象数组
<div id="app">
<ul>
<li v-for="(val,i) in user">id:{{val.id}}------name:{{val.name}}------age: {{val.age}}-----索引: {{i}}
</li>
</ul>
</div>
<script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.12/vue.js"></script>
<script type="text/javascript">
var vm = new Vue({
el: "#app",
data: {
user:[
{
id: 1,
name: 'lisa',
age: 22
},
{
id: 2,
name: 'bigbang',
age: 23
},
{
id: 3,
name: '三毛',
age: 24
}
]
}
})
</script>
v-for3.png
遍历数字和字符串
<div id="app">
<ul>
<li v-for="n in num">数字: {{n}}</li>
<hr>
<li v-for="s in str">字符串:{{s}}</li>
</ul>
</div>
<script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.12/vue.js"></script>
<script type="text/javascript">
var vm = new Vue({
el: "#app",
data: {
num: 9,
str: "今天放假啦"
}
})
</script>
v-for4.png
嵌套循环
<div id="app">
<ul v-for="(item, index) in list">
<li>
{{item.name}}
<ul v-for="(item, index) in item.cList">
<li>{{item.cname}}</li>
</ul>
</li>
</ul>
</div>
<script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.12/vue.js"></script>
<script type="text/javascript">
var vm = new Vue({
el: "#app",
data: {
list: [
{
name: '用户管理',
cList: [{cname: "添加",},{cname: "删除"}]
}, {
name: '商品管理',
cList: [{cname: "添加",},{ cname: "删除"}]
}, {
name: "分类管理"
}
]
}
})
</script>
v-for5.png
v-bind
v-bind 用于绑定数据和元素属性
语法:
<a v-bind:href="uhref"></a>
简写:
<a :href="uhref"></a>
动态绑定HTML Class
<style type="text/css">
.red{
color: red;
}
.italic{
font-style: italic;
}
.bor{
border: 1px solid blue;
}
</style>
<div id="app">
<h3 class="red italic">普通class</h3>
<h2 :class="['red','italic']">使用数组</h2>
<h2 :class="['red',{'italic': flag}]">数组中使用对象代替三元表达式</h2>
<h2 :class="[flag ? 'italic' : 'red']">数组中使用三元表达式</h2>
<h2 :calss="classObj">使用对象</h2>
<h2 :calss="{bor:true, italick: flag}">使用对象</h2>
</div>
<script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.12/vue.js"></script>
<script>
let vm = new Vue({
el: "#app",
data:{
flag: true,
classObj:{
red: true,
italic: true,
bor: false
}
}
})
</script>
动态绑定HTML style
<div id="app">
<div :style="{color: 'green'}">绑定Style</div>
<div :style="[sObj1, sObj2]">数组</div>
<div :style="{color: 'red', fontSize: fz + 'px'}">绑定Style</div>
</div>
<script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.12/vue.js"></script>
<script>
let vm = new Vue({
el: '#app',
data: {
sObj1:{
color: "pink"
},
sObj2: {
fontSize: "50px",
"font-size": "60px"
},
fz: 10
}
})
</script>
v-on
v-on 用于绑定事件
语法:
<button type="button" v-on:click = "num()">+1</button>
简写:
<button type="button" @click = "num()">+1</button>
不传参时,可以直接写函数名
<button type="button" @click = "num">+1</button>
使用{{}}时,必须写圆括号
<button type="button" @click = "{{num()}}">+1</button>
<div id="app">
<div>点击次数: {{num}}</div>
<button type="button" v-on:click = "num++">点击+1</button>
<button type="button" v-on:dblclick = "num--">双击-1</button>
<button type="button" @click = "clicktwo()">只能加两次</button>
<p>{{msg}}</p>
<button type="button" @click = "rString">反转</button>
<span>{{testString()}}</span>
</div>
<script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.12/vue.js"></script>
<script>
let vm = new Vue({
el: "#app",
data:{
num: 0,
msg: 'abcdefg'
},
methods: {
testString: () => {
let hobby = ["王者荣耀", "绝地求生", "跑跑卡叮叮车"];
return hobby;
},
clicktwo: () => {
console.log('this == vm=======>',this == vm);
let n = vm.num;
vm.num = Math.min(++n,2)
},
rString(){
this.msg = this.msg.split('').reverse().join('');
}
}
})
</script>
v-on传参
<div id="app">
<!-- 不加括号绑定事件,默认情况下第一个形参就是事件对象 -->
<button @click="test">没加括号</button>
<!-- 加了括号,无论你传不传实参,形参默认就是要接收你传递的实参 -->
<button @click="test()">加了括号</button>
<button @click="test(123)">传参</button>
<button @click="rev($event, '手动传递事件对象')">手动传递时间对象</button>
</div>
<script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.12/vue.js"></script>
<script>
let vm = new Vue({
el: "#app",
data: {
num: 0,
msg: "abcdefg"
},
methods:{
test(ev){
console.log('ev=======>',ev);
},
rev(ev,str){
console.log('str=======>',str);
console.log('ev=======>',ev);
}
}
})
</script>
v-on绑定多个事件
<div id="app">
<button v-on="{click:click, dblclick:dbclick}">绑定了多个事件</button>
</div>
<script>
new Vue({
data(){
return{
num: 0,
msg: 'dddd'
}
},
methods: {
click(){
console.log('时间出发了=======>');
},
dbclick(){
console.log('双=======>');
}
},
}).$mount('#app')
</script>
按键修饰符
<div id="app">
<input type="text" @keyup = "show($event)">
<p>键盘事件@keydown</p>
<input type="text" @keydown="show($event)" />
<p>.enter</p>
<input type="text" @keydown.enter="show($event)" />
</div>
<script>
new Vue({
data(){
return{
msg: '',
}
},
methods:{
show(e){
console.log('e.keyCode=======>',e.keyCode);
console.log('e=======>',e);
}
}
}).$mount("#app")
</script>