Vue学习笔记01
Vue结构
</html>
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>document</title>
</head>
<body>
<div id="app">
<h2>{{name}}</h2>
</div>
<script src="../js/vue.js"></script>
<script>
const app = new Vue({
el:'#app',
data:{
name:'jackfruitxx'
},
computed:{},
methods:{},
...(){
},
...
})
</script>
</body>
</html>
插值操作
- Mustache语法
- 使用{{变量名|表达式}}将值渲染到DOM元素中
- 当data中的值发生改变时,会重新渲染
- 存在插值闪烁问题
<div id="app">
<h2>{{message}}</h2>
<h2>{{firstName +' '+ lastName}}</h2>
<h2>{{firstName}} {{lastName}}</h2>
<h2>{{counter * 2}}</h2>
<div>
<script src="../js/vue.js"></script>
<script>
const app = new Vue({
el:"#app",
data:{
message:'你好啊',
firstName:"kobe",
lastName:"bryant",
counter:100
}
})
</script>
- 插值闪烁问题:
网速较慢时,数据未完全加载时,页面会显示出原始的{{}},加载完成后菜显示正确的数据 - 解决插值闪烁的方法:
- 使用 v-text
- 使用 v-html
- 使用 v-cloak
- v-once指令
<div id="app">
<h2 v-once>{{message}}</h2>
<h2 >{{message}}</h2>
<div>
- v-html
- 当data中的属性是标签时,如果使用{{}}来进行插值操作,显示字符串
- 使用v-html,会将标签插入到绑定的标签中,成为绑定标签的子元素
- 无插值闪烁问题
<h2 v-html="url"></h2>
<h2>{{url}}</h2>
- v-text
- 将内容插入到绑定的标枪中
- 无插值闪烁问题
- 会覆盖标签中的原内容
<h2>{{message}}hhh</h2>
<h2 v-text="message">hhhh</h2>
- v-pre
<h2>{{message}}</h2>
<h2 v-pre>{{message}}</h2>
- v-cloak
- 在vue实例编译完成后,该属性会被移出
- 可用用于解决插值闪烁问题
<style>
[v-cloak] {
display: none;
}
</style>
<div id="app" v-cloak>
<h2>{{message}}</h2>
</div>
动态绑定属性 v-bind
- 基本使用
- 在需要动态绑定内容的属性前使用**v-bind:**修饰
- 被修饰的属性的值为data中的属性名
<img v-bind:src="imgURL" alt="">
<a v-bind:href="aURL">{{message}}</a>
<img :src="imgURL" alt="">
<a :href="aURL">{{message}}</a>
- v-bind动态绑定class属性-对象语法
- 格式:{className1: boolean, className2: boolean, …}
- boolean值为true的类将被添加
- 可用与不被v-bind修饰的类名混用,两者会合并,一般用法是固定的类写在不被修饰的class中
<style>
.active{
color: red;
}
.line{
color: green;
}
</style>
<h2 class="title" :class ="{active:isActive, line:isLine}">{{message}}</h2>
<script>
const app = new Vue({
el:'#app',
data:{
message:"hello",
isActive:true,
isLine:true,
},
})
</script>
<h2 class="title" :class ="getClasses()">{{message}}</h2>
<script>
const app = new Vue({
el:'#app',
data:{
message:"hello",
isActive:true,
isLine:true,
},
methods:{
getClasses:function(){
return {active:this.isActive, line:this.isLine}
}
}
})
</script>
- v-bind动态绑定class属性-数组语法
- 数组中的类名如果不是字符串类型,会被解析为变量,取变量的值
- 也可用通过方法调用返回值
<h2 class="title" :class="[active,line]">{{message}}</h2>
<h2 class="title" :class="['active','line']">{{message}}</h2>
<h2 class="title" :class="getClasses()">{{message}}</h2>
<script>
const app = new Vue({
el:'#app',
data:{
message:'hello',
active:'aaaa',
line:'bbbb'
},
methods:{
getClasses:function(){
return [this.active,this.line];
}
}
})
</script>
- v-bind动态绑定style(对象语法)
<div id="app">
<h2 :style="{fontSize:'50px'}">{{message}}</h2>
<h2 :style="{fontSize:finalSize}">{{message}}</h2>
<h2 :style="{fontSize:finalSize2 + 'px'}">{{message}}</h2>
</div>
<script src="../js/vue.js"></script>
<script>
const app = new Vue({
el:'#app',
data:{
message:'hello',
finalSize:'100px',
finalSize2:100
}
})
</script>
计算属性
- 基本用法:
- 在Vue实例中的computed对象中创建
- 本质为函数,有返回值
- 调用时直接写函数名
- 也可以用于计算一些复杂的值,如求和等
<div id="app">
<h2>{{firstName}} {{lastName}}</h2>
<h2>{{fullName}}</h2>
</div>
<script>
const app = new Vue({
el:'#app',
data:{
firstName:"kobe",
lastName:"bryant",
},
computed:{
fullName:function(){
return this.firstName +' '+ this.lastName;
}
},
methods:{
getFullName:function(){
return this.firstName + this.lastName;
}
}
})
</script>
- setter函数和getter函数
- 计算方法被调用时,默认调用getter函数
- 一般只需要实现get函数
computed:{
fullName:{
set:function(){
},
get:function(){
return this.firstName +' '+ this.lastName;
}
}
}
- 计算属性与方法的区别
事件监听
- 基本使用:
<div id="app">
<h2>{{counter}}</h2>
<button @click="counter++">+</button>
<button @click="counter--">-</button>
</div>
- 参数传递
- 不进行传参时可以省略括号
- 方法定义时需要一个参数,但调用时省略了括号,会将event事件作为参数传入方法中
- 方法定义时需要一个参数,但调用未传参,会传入undefined
- 当参数是event事件时,可以通过’$event’获得事件
<div id="app">
<button @click = "btn1Click">按钮1</button>
<button @click = "btn1Click()">按钮2</button>
<button @click = "btn2Click(123)">按钮3</button>
<button @click = "btn2Click()">按钮4</button>
<button @click = "btn2Click">按钮5</button>
<button @click = "btn3Click(123,$event)">按钮6</button>
</div>
<script src="../js/vue.js"></script>
<script>
const app = new Vue({
el:'#app',
data:{},
methods:{
btn1Click(){
console.log("btn1Click")
},
btn2Click(event){
console.log("------",event)
},
btn3Click(abc,event){
console.log("------",abc,event)
}
}
})
</script>
- 修饰符
- .stop:阻止事件冒泡
- .prevent:阻止默认事件
- .once:只监听一次
- 监听keyup或其他事件时,可以通过修饰符指定某个键位或某个特殊的操作,如:@keyup.enter
条件判断
- v-if=“boolean”
- v-else
- v-if-else
- v-show的区别:
v-show会给隐藏的标签添加一个行内属性:display:none,而v-if会直接从dom中删除
循环遍历
- 遍历数组
<ul>
<li v-for="item in names">{{item}}</li>
</ul>
<ul>
<li v-for="(item,index) in names">{{index+1}},{{item}}</li>
</ul>
- 遍历对象
info:{
name:'jackFruitxx',
age:18,
height:1.88
}
<ul>
<li v-for="item in info">{{item}}</li>
</ul>
· jackFruitxx
· 18
· 1.88
<ul>
<li v-for="(value,key) in info">{{key}}:{{value}}</li>
</ul>
<ul>
<li v-for="(value,key,index) in info">{{index}}.{{key}}:{{value}}</li>
</ul>
· 0.name:jackFruitxx
· 1.age:18
· 2.height:1.88