目录
样式绑定
事件处理器
vue表单
组件通信
1. 样式绑定
1.1 class绑定
使用方式:v-bind:class="expression"
expression的类型:字符串、数组、对象
1.2 style绑定
v-bind:style="expression"
expression的类型:字符串、数组、对象
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<!-- 1.导入vue依赖 -->
<script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.10/vue.js"></script>
<style type="text/css">
.a{
font-size:36px;
}
.b{
color:red;
}
</style>
</head>
<body>
<div id="app">
<p>基本样式绑定</p>
<span class="a">好好学习</span>
<span class="b">天天向上</span><br />
<span :class="c">好好学习</span>
<span :class="d">天天向上</span>
<p>样式2</p>
<span style="font-size: 60px;">好好学习,天天向上</span><br />
<span :style="{fontSize:e}">好好学习,天天向上</span>
</div>
<script type="text/javascript">
new Vue({
el:'#app',
data(){
return{
c:'a',
d:'b',
e:'60px'
}
}
})
</script>
</body>
</html>
cd引用了ab的样式
2. 事件处理器
事件监听可以使用v-on 指令
2.1 事件修饰符
Vue通过由点(.)表示的指令后缀来调用修饰符,
.stop .prevent .capture .self .once
2.2 按键修饰符
Vue允许为v-on在监听键盘事件时添加按键修饰符:
<!-- 只有在 keyCode 是 13 时调用 vm.submit() -->
<input v-on:keyup.13="submit">
Vue为最常用的按键提供了别名
<input v-on:keyup.enter="submit">
全部的按键别名:
.enter .tab .delete (捕获 "删除" 和 "退格" 键) .esc.space .up
.down .left .right .ctrl .alt .shift .meta
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<!-- 1.导入vue依赖 -->
<script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.10/vue.js"></script>
<!-- 冒泡事件 -->
<style type="text/css">
.one{
height: 400px;
width: 400px;
background-color:blueviolet;
}
.two{
height: 300px;
width: 300px;
background-color:blue;
}
.three{
height: 200px;
width: 200px;
background-color:aquamarine;
}
.four{
height: 100px;
width: 100px;
background-color:beige;
}
</style>
</head>
<body>
<div id="app">
<div class="one" @click="do_one">
<div class="two" @click.stop="do_two">
<div class="three" @click.stop="do_three">
<div class="four" @click.stop="do_four"></div>
</div>
</div>
</div>
<!-- 只有前面的点击生效,后面点击无效,发请求 -->
<input v-model="msg"/>
<button type="button" @click="funa">点我</button>
<button type="button" @click.once="funa">你只有一次机会</button>
</div>
<script type="text/javascript">
new Vue({
el:'#app',
data(){
return{
msg:'默认值'
}
},
methods:{
do_one(){
alert("one");
},
do_two(){
alert("two");
},
do_three(){
alert("three");
},
do_four(){
alert("four");
},
funa(){
alert(this.msg);
}
}
})
</script>
</body>
</html>
点我按钮可以反复点击 只有一次机会按钮只能点击一次弹出框
3. vue表单
用v-model指令在表单控件元素上创建双向数据绑定
3.1 常用控件
文本框/密码框/文本域/隐藏域/单选复选框/多选复选框/单选按钮/下拉框
3.2 修饰符
.lazy
默认情况下, v-model在input事件中同步输入框的值与数据,但你可以添加一个修饰符lazy,从而转变为在change事件中同步
.number
将用户的输入值转为 Number 类型(防止计算时发生字符串拼接)
.trim
自动过滤用户输入的首尾空格
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<!-- 1.导入vue依赖 -->
<script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.10/vue.js"></script>
</head>
<body>
<div id="app">
姓名<input type="text" v-model="name" ><br />
密码<input type="password" v-model="pwd" ><br />
年纪<input type="text" v-model.number="age" ><br />
性别<input type="radio" name="sex" value="1" v-model="sex" >男
<input type="radio" name="sex" value="0" v-model="sex">女<br />
爱好<span v-for="n in likes">
<!-- mylike装数据 -->
<input type="checkbox" :value="n.id" v-model="myLike"/>{{n.name}}
</span><br />
类别<select v-model="myType">
<option v-for="n in types" :value="n.id">{{n.name}}</option>
</select><br>
<!-- 使用的是计算属性 -->
备注<textarea row="10" cols="20" v-model="remark"></textarea><br />
确认<input type="checkbox" v-model="ok" value="ok"/>
<span v-if="ok">
<button type="button" @click="do_sub">提交</button>
</span>
<span v-else="">
<button type="button" @click="do_sub" disabled="disabled">提交</button>
</span>
</div>
<script type="text/javascript">
new Vue({
el:'#app',
data(){
return{
name:null,
pwd:null,
age:10,
sex:1,
likes:[
{id:1,name:'吃饭'},
{id:2,name:'睡觉'},
{id:3,name:'喝水'},
{id:4,name:'打豆豆'}
],
types:[
{id:1,name:'A'},
{id:2,name:'B'},
{id:3,name:'C'},
{id:4,name:'D'}
],
remark:'成年人不做选择',
ok:0,
myLike:[],
myType:null
}
},
methods:{
do_sub(){
var obj = {
name:this.name,
pwd:this.pwd,
age:this.age+10,//类似于字符串拼接,不会以数字形式相加
sex:this.sex,
likes:this.myLike,
type:this.myType,
remark:this.remark
}
console.log(obj);
}
},
computed: {
disabled() {
return this.ok ? 'disabled' : '';
}
}
})
</script>
</body>
</html>
4. 组件通信
监听事件:$on(eventName)
触发事件:$emit(eventName)
注1:Vue自定义事件是为组件间通信设计
vue中父组件通过prop传递数据给子组件,而想要将子组件的数据传递给父组件,则可以通过自定义事件的绑定
父Vue实例->Vue实例,通过prop传递数据
子Vue实例->父Vue实例,通过事件传递数据
注2:事件名
不同于组件和prop,事件名不存在任何自动化的大小写转换。而是触发的事件名需要完全匹配监听这个事件所用的名称
建议使用“短横线分隔命名”,例如:three-click
4.1组件通信(父传子)my-button 自定义按钮
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<!-- 1.导入vue依赖 -->
<script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.10/vue.js"></script>
</head>
<body>
<div id="app">
<!-- 没有这种按键,自定义一个 -->
<!-- 父传子 -->
<my-button m='zs'></my-button>
<my-button m='ww'></my-button>
</div>
<script type="text/javascript">
new Vue({
el:'#app',
// 添加组件
components:{
'my-button':{
props:['m'],
template:'<button @click="do_sub">{{m}}提交审核{{n}}次</button>',
data(){
return{
n:0
}
},
methods:{
do_sub(){
this.n++;
}
}
}
},
data(){
return{
e:'60px'
}
}
})
</script>
</body>
</html>
4.2组件通信(子传父)
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<!-- 1.导入vue依赖 -->
<script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.10/vue.js"></script>
</head>
<body>
<div id="app">
<!-- 没有这种按键,自定义一个 -->
<!-- 父传子 -->
<my-button m='zs' @three-click="funca"></my-button>
<my-button m='ww' @four-click="funcb"></my-button>
</div>
<script type="text/javascript">
new Vue({
el:'#app',
// 添加组件
components:{
'my-button':{
props:['m'],
template:'<button @click="do_sub">{{m}}提交审核{{n}}次</button>',
data(){
return{
n:0
}
},
methods:{
do_sub(){
let name = '张三';
let sex = '男';
let hobby = 'rap';
this.n++;
// debugger;//前端断点
// 通过自定义事件来完成
if(this.n % 3 ==0)
this.$emit('three-click',name,sex,hobby);
if(this.n % 4 ==0)
this.$emit('four-click',name,hobby);
}
}
}
},
data(){
return{
e:'60px'
}
},
methods:{
funca(a,b,c){
console.log(a,b,c);
},
funcb(a,b){
console.log(a,b);
}
}
})
</script>
</body>
</html>
zs事件点击三次或三次的倍数触发$emit()得到name,sex,hobby
ww事件点击四次或四次的倍数触发$emit()得到name,sex