通过上一篇文章,你们感受到了vue的强大之处了吗? 接下来笔者将会谈到关于vue中比较常用的时间处理函数的内容还有处理表单的相关内容,你们的小板凳搬好了吗? are you ready? 奥利给
1-事件
其实无论是原生js还是其他什么封装的第三方类库来说,都有自己的事件对象,说句通俗点来说,换汤不换药而已,而vue中也同样存在,只不过跟其他的大同小异罢了,接下来跟着笔者来领略vue的美好吧哈哈
1.1-事件对象
- 无需给事件处理函数传递参数> 在事件处理函数定义的位置, 直接通过形参接收事件对象即可
<input type="text" @keyup="change" />
new Vue({
el: '#app',
methods:{
change(e) {
console.log(e.target.value);
}
}
})
- 需要给事件处理函数传递参数> 需要使用系统提供的关键字$event手动传递事件对象
<input type="text" @keyup="change($event,'hello')" />
new Vue({
el: '#app',
methods: {
// 在事件处理函数定义的地方直接通过形参接受事件对象即可
change(e,msg) {
console.log(e.target.value,msg);
}
}
});
1.2-事件修饰符
- 作用: 限制事件触发的时机或者条件
- 语法格式
html <div @事件名称.事件修饰符="事件处理函数"></div>
1.2.1-stop
- 作用: 阻止事件冒泡
- 书写位置: 子元素事件注册位置```html
```javascript
new Vue({
el: '#app',
methods: {
handle1(event){
// 阻止事件冒泡
// event.stopPropagation();
console.log('子标签被点击了');
},
handle2(){
console.log('父标签被点击了');
}
}
});
1.2.2-prevent
- 作用: 阻止默认行为```html
百度
```javascript
new Vue({
el: '#app',
methods: {
handle(event){
// 传统方式阻止默认行为
// event.preventDefault();
console.log('a标签被点击了');
}
}
});
1.2.3-capture
- 作用: 修改事件执行顺序, 将事件执行顺序变为捕获模式(由外向内依次触发)
- 书写位置: 父元素的事件注册位置
html <div class="parent" @click.capture="handle2"> <div class="child" @click="handle1"></div> </div>
1.2.4-self
- 作用: 限制事件只能别自己触发, 不能被冒泡行为触发
- 书写位置: 父元素事件注册位置```html
1.2.5-once
- 作用: 限制事件只能被触发一次```html ```
1.3-按键修饰符
- 作用: 修饰键盘事件, 从而限制键盘事件的触发条件(只有在按下按键修饰符对应的键盘按键的时候, 才执行事件处理函数)
- 语法格式
html <div @键盘事件名称.按键修饰符="事件处理函数"></div>
1.3.1-系统内置的按键修饰符
.enter
: 回车键.tab
: tab键.delete
(捕获“删除”和“退格”键).esc
: esc键.space
空格键.up
: 上.down
: 下.left
: 左.right
: 右
1.3.2-自定义按键修饰符
- 按键修饰符名字自定义即可
- 键盘码必须真实有效
// Vue.config.keyCodes.自定义按键修饰符别名 = 按键键盘码
Vue.config.keyCodes.f1 = 112;
2-表单处理(比较重要)
2.0-双向数据绑定
其实对于原生js来说也可以实现数据双向绑定,其实对于vue的v-model来说,它也是基于js做的相关底层处理,对于表单元素来说,用户所输入的内容将会以value的形式与服务端进行交互,所以在vue中,我们只需要关注数据层的变化,而视图层将会根据数据层的变化,来完成页面的更新.这也是vue中比较大的亮点.
2.1-v-model指令
- 作用: 将用户通过表单元素输入或者选择的内容同步到数据层
- 注意: v-model这个指令主要用在表单元素与组件双向数据绑定上.
- 对于v-model来说,其实就是v-bind:value和v-on:input的语法糖,
- 原理: v-bind:value=”something” v-on:input=”something=$event.target.value”
2.2-常见表单元素双向数据绑定
<div id="app">
<div>
用户名: <input v-model="info.username" type="text" />
</div>
<div>
性别: <input v-model="info.sex" type="radio" value="男"/>男
<input v-model="info.sex" type="radio" value="女"/>女
</div>
<div>
爱好: <input v-model="info.hobby" type="checkbox" value="下象棋"/> 下象棋
<input v-model="info.hobby" type="checkbox" value="下围棋"/> 下围棋
<input v-model="info.hobby" type="checkbox" value="五子棋"/> 五子棋
</div>
<div>
编程语言:
<select v-model="info.langs">
<option value="java">java</option>
<option value="C语言">C语言</option>
<option value="python">python</option>
</select>
</div>
<div>
个人简介: <textarea v-model="info.introduce" cols="30" rows="10"></textarea>
</div>
<div>
<button @click="submit">立即提交</button>
</div>
</div>
new Vue({
el:'#app',
data:{
// 和表单元素进行绑定
info:{
username:'admin',
sex:'男',
hobby:['下象棋'],
langs:'java',
introduce:''
}
},
methods:{
submit(){
console.log(this.info);
}
}
});
2.2-表单修饰符
2.2.2-系统表单修饰符
- trim
- 作用: 去除表单元素内容首位的空格
- number
- 作用: 对表单元素的内容进行数据类型的转换, 将表单内容转换成数值类型
- 特点:
- 当表单内容可以被转换成数值类型的时候, 会自动转换
- 当表单内容无法转换成数值类型的时候, 则不会做处理
lazy
动态给数组添加元素
- 动态给对象添加属性
3.2-语法
vm.$set(目标数据,数组的索引/对象的属性名,数组元素的值/对象的属性值)
3.3-别名
Vue.set(目标数据,数组的索引/对象的属性名,数组元素的值/对象的属性值)
4-vue核心原理
4.1-响应式数据
- 数据劫持
Object.defineProperty()
: 一种定义变量的方式, 通过这种方式定义的数据的读取和操作可以被监听到数据的变化.```javascript // Object.defineProperty(数据所属对象,数据名称,{get(){},set(){}}) Object.defineProperty(window,’msg’,{ // 当读取变量的时候, 会自动触发 get(){
}, // 当对变量进行重新赋值的时候, set方法会自动触发, 并且可以通过形参接收用户的赋值 set(value){// 必须有返回值, 变量的值是由get方法的返回值来决定
console.log('get');
return 'hello'
} }); // 读取数据 console.log(msg); // 设置数据 msg=’你好’; ```console.log('set');
console.log(value);
// 通知视图进行更新
4.2-模板编译
- 模板编译的核心原理: 正则替换```javascript
class Vue{
// 构造器方法:系统方法, 会自动执行; 作用: 进行属性初始化
constructor(props){
} // 渲染方法// 将data中的数据解构之后, 挂载到this上
for(let key in props.data){
this[key]=props.data[key];
}
// 将methods中的方法解构之后, 挂载到this上
for(let key in props.methods){
this[key]=props.methods[key];
}
// 将el挂载到this上
this.$el=props.el;
// 调用渲染方法, 对模板进行编译
this.render();
render(){
} } ```// 1-获取模板内容
const html=document.querySelector(this.$el).innerHTML;
const reg=/\{\{(\w+)\}\}/g;
// 2-实现正则替换
// a:完整的正则表达式匹配到的内容
// b:子表达式匹配到的内容
const newHtml=html.replace(reg,(a,b)=>{
// 使用return的结果, 替换完整正则表达式匹配到的内容
return this[b];
});
// 3-更新视图
document.querySelector(this.$el).innerHTML=newHtml;
5-生命周期
- vue在创建, 运行, 销毁阶段的不同时间点, 自动触发的一系列函数, 统称为生命周期钩子函数,每个vue实例在被创建之前都要经历一系列的初始化过程,这个过程就是vue的生命周期.大家看看官方给的图解或许就会有所明白了.具体请查阅 vue官网
5.1-创建阶段
5.1.1-特点 : 只执行1次,并且只会在实例化vue对象后才能被创建.
5.1.2-钩子函数
- beforeCreate: 创建之前(创建数据和方法还没有创建完毕),该阶段会判断是否存在el选项,如果有将会继续向下编译,如若没有,停止编译,但是会继续调用mounted这个钩子函数里面执行的代码.
- 不能调用数据和方法
- created: 创建之后(完成数据和方法的创建)
- 调用数据和方法
- beforeMount: 挂载前
- 还没有完成视图的渲染
- mounted: 挂载后
- 已经完成了视图的渲染
5.2-运行阶段
当vue发现data中的数据发生了改变,会触发对应组件的相应渲染,然后就会调用beforeUpdate和update钩子函数.
5.2.1-钩子函数
- beforeUpdate: 更新之前
- 已经完成了数据更新, 但是还没有完成视图的更新
updated: 更新之后
beforeDestroy: 该钩子函数将会在实例被销毁之前调用,此时,实例仍然完全可用
- destroyed: 在实例销毁后调用,此时,挂载在实例上的所有数据和方法都无法使用,所有的事件监听器都会被移除,所有的子实例也会被销毁.
其实对于vue的生命周期,并不是很难理解,唯一就是在特定的钩子函数中要处理的事件不同.那么它们存在的意义就会有所变化.就像刚出生的婴儿成为一位有妻室的人的过程,每个阶段都有自己该做的事一样,哈哈 笔者这个比喻可还恰当呢? 好了 我们下期见~~
6-结尾
如果觉得本篇文章对您有用的话,可以麻烦您给笔者点亮那个点赞按钮,对于慕筱佳来说,真的真的非常有用,你们的点赞就是笔者最大的动力,我们下期文章见.