一、v-model指令的详细用法
基础用法/
你可以用
v-model
指令在表单<input>
、<textarea>
及<select>
元素上创建双向数据绑定。它会根据控件类型自动选取正确的方法来更新元素。尽管有些神奇,但v-model
本质上不过是语法糖。它负责监听用户的输入事件以更新数据,并对一些极端场景进行一些特殊处理。
v-model
会忽略所有表单元素的value
、checked
、selected
attribute 的初始值而总是将 Vue 实例的数据作为数据来源。你应该通过 JavaScript 在组件的data
选项中声明初始值。
v-model 指令,可以实现对数据的双向绑定,v-model指令是 v-bind:value 和 v-on:input 的简写。
1.文本
v-model指令,绑定文本框的内容,实现双向数据绑定。
<div id="app">
<div>
姓名:<input type="text" v-model="name">开始{{name}}结束
</div>
</div>
<script>
new Vue({
el:'#app',
data:{
name:'张三',
}
})
</script>
2.多行文本
v-model指令,绑定多行文本框的内容,实现双向数据绑定。
<div id="app">
<div>
地址:<textarea cols="30" rows="10" v-model="address"></textarea> {{address}}
</div>
</div>
<script>
new Vue({
el:'#app',
data:{
address:"江苏省,南京市,雨花台区,赛虹桥街道,小行路125号",
}
})
</script>
3.复选框
- 单个复选框,绑定到布尔值:
<div id="app">
<div>
是否同意: <input type="checkbox" v-model="isOk">
<span style="color: pink;">【{{isOk}}】</span>
</div>
</div>
<script>
new Vue({
el:'#app',
data:{
isOk:false
}
})
</script>
- 多个复选框,绑定到同一个数组:
<div id="app">
<div>
<!-- v-model绑定多个复选框,绑定同一个数组 -->
爱好:
<input v-model="hobbies" type="checkbox" value="吃饭">吃饭
<input v-model="hobbies" type="checkbox" value="打游戏">打游戏
<input v-model="hobbies" type="checkbox" value="睡觉">睡觉
<input v-model="hobbies" type="checkbox" value="打豆豆">打豆豆
<input v-model="hobbies" type="checkbox" value="看电视">看电视
<input v-model="hobbies" type="checkbox" value="学习">学习
<span style="color: pink;">{{hobbies}}</span>
</div>
</div>
<script>
new Vue({
el:'#app',
data:{
hobbies:['吃饭','睡觉','打豆豆'],
}
})
</script>
4.单选按钮
绑定一组单选框,每个单选框指定相同的name属性。
<div id="app">
<div>
性别:
<input v-model="sex" type="radio" value="男" name="sex">男
<input v-model="sex" type="radio" value="女" name="sex">女
<span style="color: pink;">【{{sex}}】</span>
</div>
</div>
<script>
new Vue({
el:'#app',
data:{
sex:"女"
}
})
</script>
5.选择框
下拉框,绑定一个数组。
单选时:
<div id="app">
<div>
城市:
<select v-model="checkCity">
<option value="北京">北京</option>
<option value="上海">上海</option>
<option value="南京">南京</option>
<option value="武汉">武汉</option>
<option value="深圳">深圳</option>
</select>
<span style="color: pink;">{{checkCity}}</span>
</div>
</div>
<script>
new Vue({
el:'#app',
data:{
checkCity:'南京',
}
})
</script>
多选时 (绑定到一个数组):
下拉框设置multiple属性后,按住ctrl就可以选择多个项
<div id="app">
<div>
喜欢的食物:
<select multiple v-model="checkFoods">
<option value="苹果">苹果</option>
<option value="香蕉">香蕉</option>
<option value="梨子">梨子</option>
<option value="汉堡">汉堡</option>
<option value="薯条">薯条</option>
<option value="咖啡">咖啡</option>
</select>
<span style="color: pink;">{{checkFoods}}</span>
</div>
</div>
<script>
new Vue({
el:'#app',
data:{
checkFoods:['苹果','香蕉','梨子','汉堡','薯条','咖啡']
}
})
</script>
修饰符/
1.添加了.lazy修饰符,可以将input事件转为change事件
在默认情况下,v-model
在每次 input
事件触发后将输入框的值与数据进行同步。你可以添加 lazy
修饰符,从而转为在 change
事件之后进行同步:
姓名:<input type="text" v-model.lazy="name">{{name}}
2.添加了.number修饰符,会自动将你的输入转为number类型
年龄:<input type="text" v-model.number="age">{{age+20}}
3.添加了.trim修饰符,用于去掉内容的首位空格
姓名:<input type="text" v-model.lazy.trim="name">开始{{name}}结束
二、绑定事件
@
是v-on:
的简写,通过v-on:
指令绑定事件,指定一个,methods
选项,里面的,定义的,方法。
-
调用方法时,不传参数,默认会将事件对象作为参数传递。
打印的e就是事件对象。
<div id="app">
<button @click="sayHi">sayHi</button>
</div>
<script>
new Vue({
el:'#app',
data:{
age:20
},
methods: {
sayHi(e){
console.log(e);
alert('Hi')
}
},
})
</script>
-
调用方法时,传的是什么参数,接的就是什么参数。
打印的e就是传的hello。
<div id="app">
<button @click="sayHello('hello')">sayHello</button>
</div>
<script>
new Vue({
el:'#app',
data:{
age:20
},
methods: {
sayHello(e){
console.log(e);
alert('Hello~')
}
},
})
</script>
- 调用方法时,传递一个$event参数,该参数就是事件对象。
<div id="app">
<button @click="sayNice('Nice',$event)">sayNice</button>
</div>
<script>
new Vue({
el:'#app',
data:{
age:20
},
methods: {
sayNice(msg,e){
console.log(e);
alert(msg)
}
},
})
</script>
- 当事件处理的代码比较简单时,可以将代码直接写在行内。
注意:只能操作Vue管理的数据。
<div>
年龄:{{age}}
</div>
<button @click="age++">年龄++</button>
事件修饰符/
Vue官方-事件修饰符
在事件处理程序中调用 event.preventDefault()
或 event.stopPropagation()
是非常常见的需求。尽管我们可以在方法中轻松实现这点,但更好的方式是:方法只有纯粹的数据逻辑,而不是去处理 DOM 事件细节。
为了解决这个问题,Vue.js 为 v-on
提供了事件修饰符。之前提过,修饰符是由点开头的指令后缀来表示的。
.stop
用于阻止事件冒泡
.prevent
用于阻止默认行为
.self
只能在自身元素上触发,不能在子元素身上触发触发的
.once
点击事件将只会触发一次
按键修饰符/
在监听键盘事件时,我们经常需要检查详细的按键。Vue 允许为 v-on 在监听键盘事件时添加按键修饰符:
.enter
只有在回车时,才会调用事件方法
.tab
.delete
(捕获“删除”和“退格”键)
.esc
.space
.up
.down
.left
.right
<div>
<!-- 每次键盘弹起都会调用事件方法 -->
请输入搜索关键字:<input type="text" @keyup="keyup">
</div>
<div>
<!-- 只有在回车时,才会调用事件方法 -->
请输入搜索关键字:<input type="text" @keyup.enter="keyup1">
</div>
new Vue({
el:'#app',
data:{
age:20
},
methods: {
keyup(e){
let {keyCode} = e
// console.log(keyCode);
if (keyCode===13) {
alert('搜索指定的商品')
}
// console.log('111');
// console.log(e);
},
keyup1(){
alert('搜索指定的商品')
}
},
})
三、深度响应式
obj对象里面的每一个属性,都会采用Object.defineProperty去封装,实现响应式。
所谓响应式,指的是,数据发生变化后,页面自动更新。
给对象,后添加的数据不会采用Object.defineProperty去封装,所以,就失去了响应式。
vue通过$set
方法,给对象添加响应式属性 this.$set(this.obj,'sex','男')
vue通过$delete
方法,删除对象的属性,并触发响应式 this.$delete(this.obj,'age')
在vue中,操作数组,并触发页面更新只能使用数组的以下方法:
push,pop,unshift,shift,splice,resolve,sort
=>>> this.arr.push(66)
this.arr.splice(2,1)
如果想通过下标操作数组,也必须要使用$set
和 $delete
方法,
=>>>this.$set(this.arr,5,66)
this.$delete(this.arr,2)
<div id="app">
<div>
姓名:<input type="text" v-model="name">{{name}}
</div>
<div>
学生信息:
<input type="text" v-model="obj.name">
<input type="text" v-model="obj.age">
<button @click="addSex">添加性别</button>
<button @click="delAge">删除年龄</button>
<br>
{{obj}}
<br>
<input type="text" v-model="arr">
{{arr}}
<button @click="addArr">添加数组</button>
<button @click="delArr">删除数组</button>
</div>
</div>
<script>
Vue.config.productionTip = false
new Vue({
el:'#app',
data:{
//基本类型数据
name:'张三',
//对象类型数据
obj:{
name:'张三',
age:20
},
arr:[11,22,33,44,55]
},
methods: {
//添加性别
addSex(){
// obj对象里面的每一个属性,都会采用Object.defineProperty去封装,实现响应式
// 所谓响应式,指的是,数据发生变化后,页面自动更新。
// 给对象后添加的数据不会采用Object.defineProperty去封装,所以,就失去了响应式。
// this.obj.sex='男'
// vue通过$set方法,给对象添加响应式属性
this.$set(this.obj,'sex','男')
},
delAge(){
// 采用delete关键字删除对象的属性后,也没有触发页面更新
// delete this.obj.age
// vue通过$delete方法,删除对象的属性,并触发响应式
this.$delete(this.obj,'age')
},
addArr(){
// this.arr[5] = 66 //注意:采用这种方式,不会触发
// 在vue中,操作数组,并触发页面更新只能使用数组的以下方法:
// push,pop,unshift,shift,splice,resolve,sort
// this.arr.push(66)
// 如果想通过下标操作数组,也必须要使用$set和 $delete方法
this.$set(this.arr,5,66)
},
delArr(){
// this.arr.splice(2,1)
this.$delete(this.arr,2)
}
},
})
</script>