首页 > 其他分享 >光脚丫思考Vue3与实战:第03章 Vue实例

光脚丫思考Vue3与实战:第03章 Vue实例

时间:2023-07-02 11:01:26浏览次数:44  
标签:count 03 Vue console log color 实例 Vue3 data


下面是本文的屏幕录像的在线视频:


03-Vue实例


04-生命周期示意图+钩子函数


温馨提示:

1、视频下载:线上视频被压缩处理,可以下载高清版本:

03-Vue实例:https://pan.baidu.com/s/1O9lUFm2jRIlBeFrBjXPZIA 提取码:nbzt

03-生命周期示意图+钩子函数:https://pan.baidu.com/s/1D4ndTSgPBNGE8D4_Hcx-1A 提取码:jst4 

2、示例代码https://pan.baidu.com/s/1OcZ_ZPwxIlEoYRD7coc4gQ 提取码:y9we 

下图是文章大纲:

光脚丫思考Vue3与实战:第03章 Vue实例_前端

一、概述

本章介绍如何创建Vue实例,以及实例的数据、方法和生命周期钩子函数等内容。

二、创建Vue实例

每个Vue应用程序都通过使用以下功能创建一个新的应用程序实例:

 

光脚丫思考Vue3与实战:第03章 Vue实例_前端_02

该应用程序实例用于注册“全局变量”,然后可由该应用程序内的组件使用。下面是一个快速实例:

光脚丫思考Vue3与实战:第03章 Vue实例_HTML_03

应用程序实例公开的大多数方法都返回相同的实例,从而允许链式调用:

光脚丫思考Vue3与实战:第03章 Vue实例_生命周期_04

示例代码:01-HelloWorld.html

三、根实例

传递给createApp()的选项用于配置根组件,该组件将用作渲染的起点。需要将应用程序安装到DOM元素中。如下代码所示:

 

光脚丫思考Vue3与实战:第03章 Vue实例_前端_05


与大多数应用程序方法不同,mount它不返回应用程序,而是返回根组件实例。大多数实际应用程序都被组织为嵌套的可重用组件树。

光脚丫思考Vue3与实战:第03章 Vue实例_生命周期_06

 

每个组件都有自己的组件实例vm,此应用程序中的所有组件实例将共享同一应用程序实例。根组件与其他组件并没有什么不同,配置选项与相应组件实例的行为相同。

四、组件实例属性

1、属性+响应

光脚丫思考Vue3与实战:第03章 Vue实例_Vue.js_07


示例代码:02-Attribute.html

当一个Vue实例被创建时,它将data对象中的所有的属性加入到Vue的响应式系统中。当这些属性值发生改变时,视图将会产生“响应”,即匹配更新为新的值。

光脚丫思考Vue3与实战:第03章 Vue实例_前端_08

示例代码:03-Attribute.html

无论如何定义组件实例的所有属性,都可以在组件的模板中访问它们。值得注意的是只有当实例被创建时就已经存在于data中的属性才是响应式的。如果你知道你会在晚些时候需要一个属性,但是一开始它为空或不存在,那么你仅需要设置一些初始值。

 

光脚丫思考Vue3与实战:第03章 Vue实例_Vue3_09

2、Object.freeze()

方法Object.freeze()会阻止修改现有的属性,也意味着响应系统无法再追踪变化。
如下代码所示:

光脚丫思考Vue3与实战:第03章 Vue实例_HTML_10

示例代码:04-Freeze.html

控制台同时也会出现如下的错误提示:

光脚丫思考Vue3与实战:第03章 Vue实例_Vue.js_11

3、实例属性+方法

Vue实例还暴露了一些有用的实例属性与方法。它们都有前缀$,以便与用户定义的属性区分开来。

光脚丫思考Vue3与实战:第03章 Vue实例_Vue3_12

示例代码:05-InstanceAttribute.html

五、实例生命周期钩子

每个Vue实例在被创建时都要经过一系列的初始化过程。例如,需要设置数据监听、编译模板、将实例挂载到DOM并在数据变化时更新DOM等。同时在这个过程中也会运行一些叫做生命周期钩子的函数,这给了用户在不同阶段添加自己的代码的机会。

光脚丫思考Vue3与实战:第03章 Vue实例_前端_13

示例代码:06-LifecycleHooks.html
生命周期钩子的this上下文指向调用它的Vue实例。
在实例生命周期的不同阶段还会调用其他挂钩。
温馨提醒:不要在选项属性或回调上使用箭头函数,比如:
created: () => console.log(this.a)

vm.$watch('a', newValue => this.myMethod())
因为箭头函数并没有this,this会作为变量一直向上级词法作用域查找,直至找到为止,经常导致:
Uncaught TypeError: Cannot read property of undefined 或 Uncaught TypeError: this.myMethod is not a function之类的错误。

六、生命周期示意图

下面是实例生命周期的示意图。

光脚丫思考Vue3与实战:第03章 Vue实例_Vue.js_14

后续需要专门的文章进行这方面的描述。

1、beforeCreate

在实例初始化之后,数据观察和事件/观察者设置之前立即同步调用,执行beforeCreate()函数时,data和methods中的数据还都没有被初始化。

2、created

创建实例后同步调用。在此阶段,实例已完成对选项的处理,这意味着已设置以下内容:数据、计算的属性、方法、监视/事件回调。但是,安装阶段尚未开始,该$el属性尚不可用。如果要调用methods中的方法和data中的数据,最早只能在created()函数中操作。

3、beforeMount

当执行beforeMount()函数时,表示模板已经在内存中渲染好了,但是并没有真正的挂载到页面中去,此时页面还是旧的。

4、mouted

执行到mounted()函数,就表示整个Vue实例初始化完毕了,组件也已经挂载到页面上了。
但需要注意的是:mounted()这并不保证所有子组件也都已安装,如果你想等到整个组件都已经挂载到页面上,可以使用$nextTick()机制,如下代码所示:

光脚丫思考Vue3与实战:第03章 Vue实例_Vue.js_15

5、beforeUpdate

当执行beforeUpdate()函数的时候,页面中显示的数据还是旧的。此时data里的数据已经更新完毕,但是页面尚未和最新的数据保持同步。
这是在更新之前访问现有DOM的好地方,例如,删除手动添加的事件侦听器。

6、updated

当updated()事件执行的时候,页面和data数据已经保持同步了,都是最新的。
调用此挂钩时,组件的DOM将已更新,因此您可以在此处执行与DOM相关的操作。
请注意,updated()这并不保证所有子组件也都已被重新渲染。如果你想等到整个视图都已经重新呈现,可以使用$nextTick(),如下代码所示:

7、beforeUnmount

在卸载组件实例之前立即调用。在此阶段,实例仍然可以正常运行。实例身上所有的data和所有的methods以及过滤器、指令等,都处于可用状态,此时还没有真正执行卸载过程。

8、unmounted

在卸载组件实例后调用。调用unmounted()钩子函数后,组件实例的所有指令均已解除绑定,所有事件侦听器均已删除,所有子组件实例也已卸载。
此时,组件中的所有数据、方法、过滤器、指令等,都已经不可用了。
此时Vue实例的生命周期已经全部结束。

9、示例代码

<html>

<head>
    <title>Lifecycle Hooks</title>
    <script src="https://unpkg.com/vue@next"></script>
</head>

<body>
    <div id="attribute">
        this.data = {{ count }}
        <br>
        <input type="button" value="修改数据" v-on:click="change"></input>
        <input type="button" value="销毁" v-on:click="destroy"></input>
    </div>
</body>

<script>
    const app = Vue.createApp({
        data() {
            return {
                count: 1,
                show: true
            };
        },
        methods: {
            change() {
                this.count = this.count + 1; // 修改数据。
            },
            destroy() {
                app.$destroy(); // 销毁组件。
            }
        },
        beforeCreate() {
            console.info("=================================================");
            console.info("beforeCreate");
            console.log("%c%s", "color:red", "el=" + this.$el);
            console.log("%c%s", "color:red", "data=" + this.$data);
            console.info(this.$data);
            console.log("%c%s", "color:red", "count=" + this.count);
        },
        created() {
            console.info("=================================================");
            console.info("created");
            console.log("%c%s", "color:red", "el=" + this.$el);
            console.log("%c%s", "color:green", "data=" + this.$data);
            console.info(this.$data);
            console.log("%c%s", "color:green", "count=" + this.count);
        },
        beforeMount() {
            console.info("=================================================");
            console.info("beforeMount");
            console.log("%c%s", "color:red", "el=" + (this.$el));
            console.log("%c%s", "color:green", "data=" + this.$data);
            console.info(this.$data);
            console.log("%c%s", "color:green", "count=" + this.count);
        },
        mounted() {
            console.info("=================================================");
            console.info("mounted");
            console.log("%c%s", "color:green", "el=" + (this.$el));
            console.info(this.$el);
            console.log("%c%s", "color:green", "data=" + this.$data);
            console.info(this.$data);
            console.log("%c%s", "color:green", "count=" + this.count);
            this.$nextTick(function() {
                // 整个界面都被渲染之后执行此处的代码。
                console.info("mounted next tick.");
            });
        },
        beforeUpdate() {
            debugger;
            console.info("=================================================");
            console.info("beforeUpdate, this.count=" + this.count);
            console.log("%c%s", "color:green", "el=" + (this.$el));
            console.log("%c%s", "color:green", "data=" + this.$data);
            console.log("%c%s", "color:green", "count=" + this.count);
        },
        updated() {
            console.info("=================================================");
            console.info("updated, this.count=" + this.count);
            console.log("%c%s", "color:green", "el=" + (this.$el));
            console.log("%c%s", "color:green", "data=" + this.$data);
            console.log("%c%s", "color:green", "count=" + this.count);
        },
        beforeUnmount() {
            console.info("=================================================");
            console.info("beforeUnmount");
            console.log("%c%s", "color:green", "el=" + (this.$el));
            console.log("%c%s", "color:green", "data=" + this.$data);
            console.log("%c%s", "color:green", "count=" + this.count);
        },
        unmounted() {
            console.info("=================================================");
            console.info("unmounted");
            console.log("%c%s", "color:green", "el=" + (this.$el));
            console.log("%c%s", "color:green", "data=" + this.$data);
            console.log("%c%s", "color:green", "count=" + this.count);
        }
    });
    let vm = app.mount("#attribute"); // 需要执行这句代码。
</script>

</html>

七、参考资料

https://v3.vuejs.org/guide/instance.html

https://cn.vuejs.org/v2/guide/instance.html

标签:count,03,Vue,console,log,color,实例,Vue3,data
From: https://blog.51cto.com/u_3319687/6603814

相关文章

  • 光脚丫思考Vue3与实战:第02章 安装Vue.js
    下面是本文的屏幕录像的在线视频:02-安装Vue.js温馨提示:1、视频下载:线上视频被压缩处理,可以下载高清版本:https://pan.baidu.com/s/16594YUpNNrkjZfrCx7e5kQ 提取码:hws62、示例代码:https://pan.baidu.com/s/1oYV0Lej_E3ufyEUMxq1S2Q 提取码:ikhe 下图是文章大纲: 一、概述Vue.js......
  • 03-Vue.js环境准备-使用vue-cli快速搭建项目(cli3+)
    一、文章大纲二、安装环境本文基于如下的环境进行试验的:Windows10中文64位专业版。v12.18.3版本的Node.js。@vue/cli4.5.4的Vue.js和cli。三、安装vue-cli使用npm全局安装vue-cli:npminstall-g@vue/cli可以使用如下的创建项目的命令,查看vuecli的安装情况:按照上面的提示,先卸载......
  • 前端Vue自定义注册界面模版 手机号邮箱账号输入框 验证码输入框  包含手机号邮箱账号
    前端Vue自定义注册界面模版手机号邮箱账号输入框验证码输入框 包含手机号邮箱账号验证,下载完整代码请访问uni-app插件市场地址:https://ext.dcloud.net.cn/plugin?id=13306效果图如下:......
  • 前端Vue基于腾讯地图Api实现的选择位置组件 返回地址名称详细地址经纬度信息
    前端Vue基于腾讯地图Api实现的选择位置组件返回地址名称详细地址经纬度信息, 下载完整代码请访问uni-app插件市场地址:https://ext.dcloud.net.cn/plugin?id=13310效果图如下:使用方法<!--leftTitle:左边标题name:输入框名字value:输入框选择值 placeholder:占位符@clic......
  • vue 学习
    1.vue基础2.vue-cli3.vue-router4.element-ui5.vue3vue是什么?是一套用于构建用户界面的渐进式(vue可以自底向上的逐层的应用简答应用只需要一个轻量小巧的核心库复杂应用可以引入各式各样的vue插件)的javascript的框架。尤雨溪开发的。vue特点1.组件化模式,提高......
  • Vue:组件拖拽
    vue-drag-resize组件拖拽库vue-drag-resize支持拖拽和缩放两个大动作,轻量级,无依赖,功能扎实,适合需要缩放的应用场景。无依赖,轻量级操作可联动支持触摸,对移动端友好元素可定义拖拽及缩放可限制拖拽的最大或最小值可限制拖动的方向按照文档安装并引入之后,报错:Couldnotfi......
  • Vue:$parent
    什么是$parent在Vue.js中,this.$parent是组件实例的一个属性,用于访问当前组件的直接父组件实例。它提供了一种在子组件中与父组件进行通信和交互的方式。当一个组件被创建时,Vue.js会在内部为该组件创建一个组件实例,并建立组件之间的父子关系。每个组件实例都具有$parent属......
  • Vue封装组件并发布到npm仓库
    前言使用Vue框架进行开发,组件封装是一个很常规的操作。一个封装好的组件可以在项目的任意地方使用,甚至我们可以直接从npm仓库下载别人封装好的组件来进行使用,比如iview、element-ui这一类的组件库。但是每个公司的业务场景可能不同,开发人员还是得必须封装自己得组件,如果换了一个......
  • 多端全栈项目实战:大型商业级代驾业务全流程落地SpringCloudAlibaba+Mysql+Redis+Docke
    多端全栈项目实战:大型商业级代驾业务全流程落地SpringCloudAlibaba+Mysql+Redis+Docker+Uniapp+Vue3随着移动互联网的快速发展和智能手机的普及,代驾服务成为了一个日益火热的行业。在这个行业中,如何构建一个具备商业级可靠性和扩展性的代驾业务系统成为了关键问题。本文将介绍一......
  • 03常用pytorch剪枝工具
    常用剪枝工具pytorch官方案例importtorch.nn.utils.pruneaspruneimporttorchfromtorchimportnnimporttorch.nn.utils.pruneaspruneimporttorch.nn.functionalasFprint(torch.__version__)device=torch.device("cuda"iftorch.cuda.is_available()els......