指令修饰符
通过‘.’指明一些指令后缀,不同后缀封装了不同的处理操作——>简化代码
- 按键修饰符
@keyup.enter="",键盘回车监听keyup键盘弹起,加上enter就是回车弹起
- v-model修饰符
v-model.trim,去除首尾空格v-model.number,转数字
- 事件修饰符 冒泡是默认存在的(点击子盒子,父盒子也会触发)
@事件名.stop,阻止冒泡@事件名.prevent,阻止默认行为
v-bind操作class和style
可针对 class类名 和 style行内样式 进行控制
操作class
- :class="传对象/数组"
- 传对象:适用于一个类名,来回切换
- 传数组:适用于批量添加或删除类
传对象:京东导航栏点击高亮显示
<div id="app">
<ul>
<li v-for="(item,index) in list" :key="item.id" @click="activeIndex=index"><a :class="{active:index===activeIndex}" href="#">{{item.name}}</a></li>
</ul>
</div>
<script src="./vue.js"></script>
<script>
const app = new Vue({
el: '#app',
data: {
activeIndex:0,
list: [
{ id: 1, name: '京东秒杀' },
{ id: 2, name: '每日特价' },
{ id: 3, name: '品类秒杀' }
]
}
})
操作style
- :style="样式对象"
- 适用于:某个具体属性的动态设置
进度条样式
<div id="app">
<div class="progress">
<div class="inner" :style="{width:percent+'%'}">
<span>{{percent}}%</span>
</div>
</div>
<button @click="percent=25">设置25%</button>
<button @click="percent=50">设置50%</button>
<button @click="percent=75">设置75%</button>
<button @click="percent=100">设置100%</button>
</div>
<script src="./vue.js"></script>
<script>
const app = new Vue({
el: '#app',
data: {
percent:30
}
})
</script>
计算属性
计算属性默认的简写
- 基于现有的数据,计算出来的新属性。当其中依赖的数据变化,自动重新计算。
- 语法:
- 1.声明在computed配置项中,一个计算属性对应一个函数
- 计算属性这个函数内部,可以直接通过this访问到data里实例
- 2.使用起来和普通属性一样使用{{计算属性名}}
- 1.声明在computed配置项中,一个计算属性对应一个函数
computed:{
totalCount(){
// 需求:对this.list数组里的num进行求和,用reduce
let total=this.list.reduce((sum,item)=>sum+item.num,0)
}
}
计算属性的完整写法
计算属性默认简写,只能读取访问,不能“修改”
- 默认简写是将属性写成了一个方法,而完整写法则需将属性写成一个对象
一旦修改赋值,执行set,set括号里要传参
综合案例——成绩表单
<div id="app" class="score-case">
<div class="table">
<table>
<thead>
<tr>
<th>编号</th>
<th>科目</th>
<th>成绩</th>
<th>操作</th>
</tr>
</thead>
<tbody v-if="list.length>0">
<tr v-for="(item,index) in list" :key="item.id">
<td>{{index+1}}</td>
<td>{{item.subject}}</td>
<td :class="{red:item.score<60}">{{item.score}}</td>
<td><a href="#" @click.prevent="del(item.id)">删除</a></td>
</tr>
</tbody>
<tbody v-else>
<tr>
<td colspan="5">
<span class="none">暂无数据</span>
</td>
</tr>
</tbody>
<tfoot>
<tr>
<td colspan="5">
<span>总分:{{totalCount}}</span>
<span style="margin-left: 50px">平均分:{{average}}</span>
</td>
</tr>
</tfoot>
</table>
</div>
<div class="form">
<div class="form-item">
<div class="label">科目:</div>
<div class="input">
<input
type="text"
placeholder="请输入科目"
v-model.trim="subject"
/>
</div>
</div>
<div class="form-item">
<div class="label">分数:</div>
<div class="input">
<input
type="text"
placeholder="请输入分数"
v-model.number="score"
/>
</div>
</div>
<div class="form-item">
<div class="label"></div>
<div class="input">
<button class="submit" @click="add">添加</button>
</div>
</div>
</div>
</div>
<script src="../vue.js"></script>
<script>
const app = new Vue({
el: '#app',
data: {
list: [
{ id: 1, subject: '语文', score: 50 },
{ id: 7, subject: '数学', score: 95 },
{ id: 12, subject: '英语', score: 70 },
],
subject: '',
score: ''
},
methods:{
del(id){
this.list=this.list.filter(item=>item.id != id)
},
add(){
if(!this.subject){
alert("请输入科目")
return
}
if(typeof this.score !=='number'){
alert("请输入正确的成绩")
}
this.list.unshift({
id:+new Date(),
subject:this.subject,
score:this.score
})
this.subject=''
this.score=''
}
},
computed:{
totalCount(){
return this.list.reduce((sum,item)=>sum+item.score,0)
},
average(){
if(this.list.length===0){
return 0
}
return (this.totalCount/this.list.length).toFixed(2)
}
}
})
</script>
watch侦听器(监视器)
- 作用:监视数据变化,执行一些业务逻辑或异步操作
- 语法结构:
- 简单写法
- 如果只需要新值,也可以只写一个参数
- 需要监视谁,就往watch里写谁
- 如果需要监视一个子属性,在watch里打点的时候就必须用引号括住
- 完整写法——>添加额外配置项
- deep:true,对复杂类型深度监视
- immediate:true,立刻执行,初始化立刻执行一次handler方法
- 简单写法