自学内容网 自学内容网

【H2O2|全栈】Vue2(二)

目录

前言

开篇语

准备工作

常用修饰符

v-model修饰符(3个)

事件修饰符(3个)

计算属性

案例

get()和set()

监听属性

案例

初始化监听

深度监听

生命周期

加载阶段

更新阶段

销毁

结束语


前言

开篇语

本系列博客主要讲述Vue2系列的基础语法,本期的内容为常用修饰符,计算属性,监听属性以及生命周期。

Vue的逻辑可能有些复杂,需要反复琢磨。与此同时,由于Vue2是基于JavaScript的,所以我们不要忘记基础的Web相关知识。

准备工作

软件:【参考版本】Visual Studio Code

插件(扩展包):Open in browser, Live Preview, Live Server, htmltagwrap

第三方js库(框架):【参考版本】Vue.js 2.7.9

浏览器版本:Chrome

浏览器插件:Vue.js devtools

系统版本: Win10/11

常用修饰符

v-model修饰符(3个)

在表单输入时,用户可能会在开头或结尾输入多余的空格(输入法误输入空格),这时候就需要去除这些空格。

为此我们可以在v-model后面进行链式操作,添加 .trim 修饰符以去除首尾空格

<input type="text" v-model.trim="value"/>

对于表单的输入值来说,它们默认都是字符串类型的,这样就会导致在进行求和运算时,参与计算的数字可能实际上是以字符串的形式进行了拼接操作。

<input type="text" v-model.trim="value1"/>
+
<input type="text" v-model.trim="value2"/>
=
{{value1+value2}}

这里我们在两个表单中分别输入1和2,我们预期的求和结果是3,但是实际上算出来却是12。

所以,我们可以为v-model继续添加修饰符 .number ,将字符串类型转化为数字类型。

修饰符支持链式操作

<input type="text" v-model.trim.number="value1" />
+
<input type="text" v-model.trim.number="value2" />
=
{{value1+value2}}

由此一来,本例中的计算结果就正常了:

在上一步的计算例子中,我们发现输入的值实时在右侧更新了。有时我们不希望这种双向绑定实时刷新,而是在鼠标离开当前表单(失焦)时才更新,就可以使用懒加载 .lazy ,它的作用相当于表单的onchange事件。

<input type="text" v-model.trim.number.lazy="value1" />
+
<input type="text" v-model.trim.number.lazy="value2" />
=
{{value1+value2}}

在懒加载之后,我们在输入的过程中,只要表单没有失焦,结果就不会更新。

事件修饰符(3个)

在Vue的方法中,使用$event来代表局部事件event代表全局事件

以点击事件为例,我们知道在嵌套的元素之间存在冒泡事件,比如下面的三个嵌套的正方形,每一个都绑定了点击事件,点击可以输出事件处理函数handlerClick()形参中的颜色:

<div style="width: 300px;height: 300px;background-color: red;"@click.stop="handlerClick('red')">
    <div style="width: 200px;height: 200px;background-color: green;"@click.stop="handlerClick('green')">
        <div style="width: 100px;height: 100px;background-color: yellow;"@click.stop="handlerClick('yellow')"></div>
    </div>
</div>

在不阻止事件冒泡时,点击最靠里的黄色方块,触发了三个方块的点击事件。

我们可以添加 .stop 修饰符,阻止当前元素的冒泡事件(相当于event.stopPropagation)。

<div style="width: 300px;height: 300px;background-color: red;"@click.stop="handlerClick('red')">
    <div style="width: 200px;height: 200px;background-color: green;"@click.stop="handlerClick('green')">
        <div style="width: 100px;height: 100px;background-color: yellow;"@click.stop="handlerClick('yellow')"></div>
    </div>
</div>

此时再次点击黄色方块,就没有冒泡事件了。

与之类似的,我们还可以使用 .prevent 来阻止默认事件(相当于event.preventDefault),比如阻止超链接的默认跳转事件。

最后,如果想让一个事件在触发一次之后就失效,可以使用 .once ,相当于事件解绑。

计算属性

案例

在涉及计算的操作中,我们一般会使用Vue实例中的计算属性 computed 。通过视图中传来的数据的状态的改变带来属性的改变。

比如,在下面的案例中,输入框分别输入姓氏和名字,在右侧输出最后的姓名,输出框统一使用懒加载,且默认为单姓(复姓取首字)。

姓: <input type="text" v-model.lazy="lastName"> +
名: <input type="text" v-model.lazy="firstName"> =
姓名: {{lastName+firstName}}

在data中保存lastName和firstName的值:

data: {
    lastName: "",
    firstName: ""
}

现在,我们需要将姓名输出至一个input表单中,其中涉及计算,我们无法直接使用下面的形式来完成需求:

姓名: <input type="text" v-model.lazy="lastName+firstName">

所以,我们需要使用计算属性。在computed中,设置fullName属性为全名,它的值为一个函数,用于返回姓氏和名字拼接的结果。

computed: {
    fullName:function() {
        const {firstName,lastName} = this;
        return firstName + lastName;
    }
}

最后,在视图中以fullName将返回的结果传出,并该结果将缓存在fullName中。

姓名: <input type="text" v-model.lazy="fullName">

get()和set()

目前,我们已经实现了从左侧到右侧的输出。现在,我们希望在右侧输入姓名,反向将其拆分至左侧的姓氏框和名字框。

直接修改左侧的值,发现右侧的值没有更改,检查运行,出现下面的语法错误。

这是因为computed中的属性值默认为get()函数,只能获取值而不能设置值。而此前我们在computed中的写法实际上完整的表述应当是下面的形式:

fullName: {
    get() {
        const { firstName, lastName } = this;
        return firstName + lastName;
    }
}

如果想要实现fullName的拆解,我们还需要为它添加一个set()方法,该方法传入fullName修改之后的最新值——value。利用value,我们可以重新设置data中的数据值。

set(value) {
    this.firstName = value.substr(0, 1);
    this.lastName = value.substr(1);
}

监听属性

监听属性(watch)并不是一个数值,而是一个监听器,实质是监听状态的变化

在Vue实例的watch中,添加需要监听的数据作为方法名,比如姓氏(lastName),监听函数的两个形参curValuepreValue分别代表当前最新的数据和更新之前的数据。

watch: {
    lastName(curValue, preValue) {
        console.log("当前:", curValue, "更新前:", preValue);
    }
}

案例

使用监听属性,我们同样也可以完成上述的姓名正反向拼接操作。

由于监听属性没有缓存,所以我们还需要在data中保存fullName的值。

data: {
    lastName: "",
    firstName: "",
    fullName: ""
}

这里我们需要监听三个值——lastName,firstName和fullName。在它们各自的监听函数中,我们不需要使用到更新前的值,因此我们只需要使用第一个形参curValue即可。

对于姓氏和名字而言,它们之间的状态修改是互相不影响的,所以我们需要分别让它们的curValue和另一半拼接,以此组成需要的全名,注意这种拼接之间的先后顺序。

lastName(curValue) {
    this.fullName = curValue + this.firstName;
},
firstName(curValue) {
    this.fullName = this.lastName + curValue;
},
fullName(curValue) {
    this.lastName = curValue.substr(0, 1);
    this.firstName = curValue.substr(1);
}

初始化监听

与计算属性不同,如果给定了初始的计算参数,那么计算属性将会直接计算出结果,即初始化默认执行。而监听属性是默认不监听的。

比如说我们现在有一个数据msg,我们想要使用监听来查看它的值,但是我们发现监听方法没有被调用。

msg: {
    handler(curValue, preValue) {
        console.log(curValue, preValue);
    }
}

控制台输出情况: 

如果想要监听属性也具有初始化功能,那么我们就不能再使用这种简略的函数写法,而是要将监听的属性作为属性名,然后单独为函数起一个名字放在该属性值的对象中。

在这个对象中,添加immediate属性,并将其设置为true,用来解决不能初始化监听的问题。

msg: {
    handler(curValue, preValue) {
        console.log(curValue, preValue);
    },
    immediate:true
}

此时,我们发现控制台里执行了初始化的监听:

深度监听

对于引用类型的数据而言,我们使用一般的监听只能监听到栈内存中的内容(即地址),而无法监听到内部的数据变化,此时就需要使用到深度监听的功能。

与初始化监听类似,添加deep属性并设置为true,以实现深度监听。

生命周期

Vue的渲染过程分为四个阶段:

①创建Vue实例

②生成数据

③构建虚拟DOM模板template

④将虚拟DOM转为真实的DOM渲染到页面上

对于每个阶段来说,都有它们对应的生命周期函数。而生命周期函数本身也分为了两个阶段——加载阶段更新阶段。此外,还可以进行Vue的销毁

生命周期函数是Vue实例中的方法,与data,methods,computed,watch等并列。

加载阶段

在加载阶段中,Vue获取数据和DOM节点,涉及以下四个生命周期函数: 

生命周期函数加载阶段备注
beforeCreateVue数据创建之前/
createdVue数据创建之后/
beforeMount虚拟DOMVue管理的状态暂时还没有解析
mounted虚拟DOM已转为真实DOMVue管理的状态已经解析完毕

通常来说,在created函数中进行Ajax请求,以获取数据;在mounted函数中进DOM节点的获取

更新阶段

在更新阶段中,状态在页面上进行更新涉及以下两个生命周期函数:

生命周期函数加载阶段备注
beforeUpdate页面更新前/
updated页面更新后/

销毁

在两个阶段完成之后,还可以对Vue进行销毁,涉及以下两个生命周期函数:

生命周期函数加载阶段备注
beforeDestroy销毁前/
destroyed销毁后/

在methods中的处理函数,如果使用this调用$destroy()方法,将会触发销毁。

结束语

本期内容到此结束。关于本系列的其他博客,可以查看我的Vue2专栏。

本系列的博客主要是记录学习经历,并总结阶段的知识点。全篇的操作过程由笔者完成并核验,在部分定义上有参考其他的内容。本身也是新手,多多包涵。

==期待与你在下一期博客中再次相遇==

——分解的【H2O2】


原文地址:https://blog.csdn.net/ZC13786305863/article/details/144378667

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!