Vue 组件化编程 和 生命周期

目录

一、组件化编程

        1.基本介绍 : 

        2.原理示意图 : 

        3.全局组件示例 : 

        4.局部组件示例 : 

        5.全局组件和局部组件的区别 : 

二、生命周期

        1.基本介绍 : 

        2.生命周期示意图 : 

        3.实例测试 : 


一、组件化编程

        1.基本介绍 : 

        (1) 开发大型应用的时候,页面往往划分成很多部分,不同的页面时常会有相同的部分,例如可能会有相同的头部导航条。

        (2) 如果每个页面都独自开发,无疑增加了开发的成本。因此,可以将页面的不同部分拆分成独立的组件,然后在不同的页面共享这些组件,避免重复开发。

        (3) 组件化编程与之前的“模块化编程”相比,范围和目标更加精准。

        2.原理示意图 : 

                组件化编程基本原理示意图如下 :  

                PS :
                (1) 组件(Component)是Vue.js最强大的功能之一。
                (2) 组件也是一个Vue实例,拥有自己的data数据池和methods,生命周期函数等。
                (3) 组件渲染需要HTML模板,所以增加了template属性,值就是HTML模板。
                (4) 对于全局组件,任何Vue实例都可以直接在HTML中通过组件名称来使用组件。
                (5) data不再是一个对象,而是一个函数,这样保证了每次引用组件都是独立的对象/数据

        3.全局组件示例 : 

                overall_components.html代码如下 : 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Demonstrate overallComponents</title>
    <script type="text/javascript" src="../vue.js"></script>
</head>
<body>
    <div id="app">
        <h2>组件化编程———全局组件</h2>
        <!-- ... -->
        <!-- 利用全局组件的名称来引用全局组件 -->
        <counter></counter>
        <br/> <br/>
        <counter></counter>
    </div>

    <script type="text/javascript">
        /*
            (1) 定义一个全局组件,第一个参数表示该组件的名称,此处为“counter”;
            (2) 第二个参数———{}中表示的就是该组件相关的内容。
            (3) template用于指定该组件的View,由于要用到data数据池中的数据,
                因此要使用到ES6新特性———模板字符串``.(方便操作数据)
            (4) 组件也是一个Vue实例,拥有自己的data数据池和methods,生命周期函数等。
            (5) 对于组件来说,数据池中的数据要以函数/方法的形式来返回,与传统返回形式不同,
                这么做的目的是保证每个组件的数据都是独立的。
         */
        Vue.component("counter", {
            template: `<button v-on:click="clickTest()">这个按钮被点了{{ count }}次🌶</button>`,
            // data: {
            //     count: 5,
            // },
            data() {
                return {
                    count: 5
                }
            },
            methods: {
                clickTest() {
                    this.count++;
                }
            }
        })

        //传统Vue示例方式
        let vm = new Vue({
            el: "#app",
            data: {
                count: 5
            },
            methods: {
                // clickTest() {
                //     this.count++;
                // }
            }
        })
    </script>
</body>
</html>

                运行效果 : (如下GIF图)

        4.局部组件示例 : 

                local_components.html代码如下 : 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Demonstrate localComponents</title>
    <script type="text/javascript" src="../vue.js"></script>
</head>
<body>
<div id="app">
    <h2 style="color: deepskyblue">组件化编程———局部组件</h2>
    <!--
        因为引入局部组件的Vue实例挂载到了该div上,因此可以在该div中使用定义的局部组件。
    -->
    <counter></counter>
    <br/> <br/>
    <counter></counter>
</div>

<script type="text/javascript">
    //1.定义一个局部组件(组件本质就是一个Vue实例)
    let buttonCounter = {
        template: `<button v-on:click="clickTest()">这个按钮被点了{{count}}次🌶</button>`,
        data() {
            return {
                count: 11
            }
        },
        methods: {
            clickTest() {
                this.count++;
            }
        }
    }

    //2.若想使用局部组件,需要在Vue实例中引入
        //此时局部组件的使用范围在当前Vue
    let vm = new Vue({
        el: "#app",
        data: {

        },
        methods: {

        },
        components: {
            "counter": buttonCounter
        }
    })
</script>
</body>
</html>

                运行结果 : (如下GIF)

        5.全局组件和局部组件的区别 : 

        (1) 全局组件属于所有Vue实例,可以在所有Vue实例挂载的元素上使用[全局组件本质也是依赖于Vue实例],通过组件名就可以直接使用全局组件。

        (2) 局部组件需要引入才能使用,只有引入了局部组件的Vue实例,其挂载的元素上才能使用定义的局部组件。

        (3) 共性——组件的定义,必须在Vue实例的定义之前,否则无法识别。


二、生命周期

        1.基本介绍 : 

        (1) Vue实例有一个完整的生命周期,从开始创建、初始化数据、编译模板、挂载DOM、渲染-更新-渲染、卸载等一系列过程,称为Vue实例的生命周期

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

        2.生命周期示意图 : 

                如下图所示 : 

        (1) new Vue():
                new了一个Vue实例对象,此时就会进入组件的创建过程。
        (2) Init Events & Lifecycle:
                初始化组件的事件和生命周期函数。
        (3)
beforeCreate:
                组件创建之后遇到的第一个生命周期函数,这个阶段data和methods以及dom结构都未被初始化,即获取不到data的值,也不能调用methods中的函数。
        (4) Init injections & reactivity:
                这个阶段会
初始化data和methods中的方法
        (5)
created:
                这个阶段组件的data和methods中的方法已初始化结束,可以访问,但是DOM结构未初始化,页面未渲染。
                PS :
往往在“created”这个阶段发出Ajax请求,因为下一步就是编译模板。
        (6) 编译模板结构
        (7)
beforeMount:
                当模板在内存中编译完成时,此时内存中的模板结构还未渲染至页面上,看不到真正的数据。
        (8) Create vm.$el and replace `el` with it:
                把内存中渲染好的模板结构
替换至真实的DOM结构,也就是页面上
        (9)
mounted:
                此时,页面已渲染好,用户看到的是真实的页面数据,
生命周期创建阶段完毕,进入运行阶段
        (10) 生命周期运行中
        (10.1)
beforeUpdate:
                当执行此钩子函数时,数据池的数据是新的,但是
页面是旧的
        (10.2) Virtual DOM re-render and patch:
                根据最新的data数据,
重新渲染内存中的模板结构,并把渲染好的模板结构替换至页面上
        (10.3)
updated:
                页面已经完成了更新,此时,data数据池和
页面的数据都是新的。
        (11) beforeDestroy:
                当执行此函数时,组件即将被销毁,但是还没有真正开始销毁,此时组件的data,methods数据或方法还可被调用。
        (12) Teardown......:
                注销组件和事件监听
        (13) destroyed:
                组件已经完成了销毁。

        3.实例测试 : 

                在各个钩子函数中尝试打印出data数据池中的数据,调用methods中的方法,并获取DOM对象;以查看当前生命周期中能否使用data数据池中的数据,能否调用methods中的方法,能否获取到渲染后的DOM对象。
                life_cycle.html代码如下 : 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Life cycle Demonstration</title>
    <script type="text/javascript" src="../vue.js"></script>
</head>
<body>
    <div id="app">
        <span id="num">{{num}}</span>
        <!-- @是v-on:的简写 -->
        <button @click="num++">Like</button>
        <h2>{{name}} has {{num}} likes</h2>
    </div>
    <script type="text/javascript">
        let vm = new Vue({
            el: "#app",
            data: {
                name: "Cyan_RA9",
                num: 5
            },
            methods: {
                getName() {
                    return this.name;
                }
            },
            //组件创建后,遇到的第一个钩子函数
            beforeCreate() {
                console.log("beforeCreate~能否得到数据池中的数据?",this.name,this.num);
                //不能,在beforeCreate阶段调用methods中的方法会报错。
                // console.log("beforeCreate~能否使用methods中的方法?",this.getName());
                console.log("beforeCreate~能否得到渲染后的DOM对象",document.getElementById("num"));
            },
            //(4)Init injections & reactivity:这个阶段会初始化data和methods中的方法
            //(5)created:
            created() {
                console.log("created~能否得到数据池中的数据?",this.name,this.num);
                console.log("created~能否使用methods中的方法?",this.getName());
                console.log("created~能否得到渲染后的DOM对象",document.getElementById("num"));
            },
            //挂载DOM之前
            beforeMount() {
                console.log("beforeMount~能否得到数据池中的数据?",this.name,this.num);
                console.log("beforeMount~能否使用methods中的方法?",this.getName());
                console.log("beforeMount~能否得到渲染后的DOM对象",document.getElementById("num"));
            },
            //挂载DOM之后
            mounted() {
                console.log("mounted~能否得到数据池中的数据?",this.name,this.num);
                console.log("mounted~能否使用methods中的方法?",this.getName());
                console.log("mounted~能否得到渲染后的DOM对象",document.getElementById("num"));
            },
            //数据变化前,不会调用beforeUpdate钩子函数
            //只有当数据发生变化后,才会调用beforeUpdate钩子函数。
            beforeUpdate() {
                console.log("beforeUpdate~能否得到数据池中的数据?",this.name,this.num);
                console.log("beforeUpdate~能否使用methods中的方法?",this.getName());
                console.log("beforeUpdate~能否得到渲染后的DOM对象",document.getElementById("num"));
                console.log("beforeUpdate~能否得到渲染后的DOM对象",document.getElementById("num").innerText);
            },
            //调用beforeUpdate钩子时,还没更新页面。
            //需要等下一步Virtual DOM re-render and patch:
            //根据最新的data数据,重新渲染内存中的模板结构,并把渲染好的模板结构替换至页面上。
            //接着调用updated钩子时,页面已经更新。
            updated() {
                console.log("updated~能否得到数据池中的数据?",this.name,this.num);
                console.log("updated~能否使用methods中的方法?",this.getName());
                console.log("updated~能否得到渲染后的DOM对象",document.getElementById("num"));
                console.log("beforeUpdate~能否得到渲染后的DOM对象",document.getElementById("num").innerText);
            },
        })
    </script>
</body>
</html>

                运行效果 : (如下GIF图)

                控制台打印出的结果如下 : 

                此时由于num属性的值还未变化,因此不会调用beforeUpdate钩子函数和updated钩子函数
                点击按钮修改num属性的值,会看到新的钩子函数被调用,如下图所示 : 

        System.out.println("END------------------------------------------------------");

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/128686.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

行情分析——加密货币市场大盘走势(11.10)

大饼今日继续上涨&#xff0c;正如预期&#xff0c;跌不下来&#xff0c;思路就是逢低做多。现在已经上涨到36500附近&#xff0c;目前从MACD日线来看&#xff0c;后续还要继续上涨&#xff0c;当然稳健的可以不做。昨日的策略已经达到止盈&#xff0c;也是顺利的落袋为安啦。一…

局域网下搭建SVN服务器

文章目录 1. 下载SVN服务器(VisualSVN Server)2. 安装SVN服务器(VisualSVN Server)3. 下载并安装TortoiseSVN4. 搭建SVN服务器 1. 下载SVN服务器(VisualSVN Server) 下载地址 2. 安装SVN服务器(VisualSVN Server) 默认安装即可 Location&#xff1a;VisualSVN Server的安装…

【chat】2:vs2022 连接远程ubuntu服务器远程cmake开发

大神们是使用vs远程连接和调试的:C++搭建集群聊天室(三):配置远程代码编辑神器 VScode我尝试过vs++ 和 clion 都不错。在 Visual Studio 中配置 Linux CMake 项目 比较麻烦的就是要配置CMakeSettings.json ,而且会自动做复制指定远程 Linux 目标,则会将源复制到远程系统 …

《单链表》的实现(不含哨兵位的单向链表)

目录 ​编辑 前言&#xff1a; 链表的概念及结构&#xff1a; 链表的实现&#xff1a; 1.typedef数据类型&#xff1a; 2.打印链表 &#xff1a; 3.创建新节点&#xff1a; 4.尾插 &#xff1a; 5.头插&#xff1a; 6.尾删 &#xff1a; 7.头删&#xff1a; 8.查找节…

刚安装的MySQL使用Navicat操作数据库遇到的问题

刚安装的MySQL使用Navicat操作数据库遇到的问题 一、编辑连接保存报错二、打开数据表很慢三、MySQL的进程出现大量“sleep”状态的进程四、执行sql脚本报错&#xff0c;部分表导不进去五、当前MySQL配置文件 一、编辑连接保存报错 连接上了数据库&#xff0c;编辑连接保存报错…

winform打包默认安装路径设置

点击安装程序的 Application Folder 修改属性中的 DefaultLocation

竞赛选题 深度学习疲劳驾驶检测 opencv python

文章目录 0 前言1 课题背景2 实现目标3 当前市面上疲劳驾驶检测的方法4 相关数据集5 基于头部姿态的驾驶疲劳检测5.1 如何确定疲劳状态5.2 算法步骤5.3 打瞌睡判断 6 基于CNN与SVM的疲劳检测方法6.1 网络结构6.2 疲劳图像分类训练6.3 训练结果 7 最后 0 前言 &#x1f525; 优…

云效流水线docker部署 :node.js镜像部署VUE项目

文章目录 引言I 流水线配置1.1 项目dockerfile1.2 Node.js 镜像构建1.3 docker 部署引言 云效流水线配置实现docker 部署微服务项目:https://blog.csdn.net/z929118967/article/details/133687120?spm=1001.2014.3001.5501 配置dockerfile-> 镜像构建->docker部署。 …

linux中使用arthas进行jvm内存分析

1. 安装下载 首先在官方github地址选择合适的版本&#xff0c;下载后上传到对于服务器。 使用unzip arthas-bin.zip 解压文件。进入目录中&#xff0c;执行./install-local.sh进行安装。执行完成后提示succeed&#xff0c;即可使用。 2. 启动 进入目录&#xff0c;执行java…

【优选算法系列】【专题七分治】第一节.75. 颜色分类和912. 排序数组

文章目录 前言一、颜色分类 1.1 题目描述 1.2 题目解析 1.2.1 算法原理 1.2.2 代码编写二、排序数组 2.1 题目描述 2.2 题目解析 2.2.1 算法原理 2.2.2 代码编写总结 前言 一、颜色分类 1.1 题目描述 描述&…

续:将基于Nasm汇编的打字小游戏,移植到DOSBox

续&#xff1a;将基于Nasm汇编的打字小游戏&#xff0c;移植到DOSBox 文章目录 续&#xff1a;将基于Nasm汇编的打字小游戏&#xff0c;移植到DOSBox前情提要细说1 编译2 程序入口3 定位段 运行体验 前情提要 上一篇&#xff1a;【编程实践】黑框框里的打字小游戏&#xff0c;但…

我的月光宝盒初体验失败了

哈哈哈&#xff0c;我爱docker, docker 使我自由&#xff01;&#xff01;&#xff01; docker make me free! 菠萝菠萝蜜口号喊起来。 https://github.com/vivo/MoonBox/ windows上安装好了docker之后&#xff0c;docker-compose是自带的。 docker-compose -f docker-compo…

SpringBoot核心知识点总结【Spring Boot 复习】

文章目录 Spring Boot 精要1. 自动配置2. 起步依赖3. 命令行界面4. Actuator 开发SpringBoot程序1. 启动引导Spring2. 测试Spring Boot应用程序3. 配置应用程序属性2.2 使用起步依赖2.3 使用自动配置专注于应用程序功能 Spring Boot 精要 Spring Boot将很多魔法带入了Spring应…

KiB、MiB与KB、MB的区别

KiB、MiB与KB、MB的区别

智安网络|数据库入门秘籍:通俗易懂,轻松掌握与实践

在现代信息化时代&#xff0c;数据库已成为我们日常生活和工作中不可或缺的一部分。然而&#xff0c;对于非专业人士来说&#xff0c;数据库这个概念可能很抽象&#xff0c;难以理解。 一、什么是数据库&#xff1f; 简单来说&#xff0c;数据库是一个存储和管理数据的系统。它…

城市内涝积水监测,万宾科技内涝预警监测系统

每一个城市的排水体系都是一个复杂的网络系统&#xff0c;需要多个部分配合协调&#xff0c;预防城市排水管网带来安全隐患&#xff0c;也因此才能在一定程度上缓解城市内涝带来的安全问题。在海绵城市建设过程中不仅要解决大部分道路硬化导致的积水无法渗透等问题&#xff0c;…

抢抓泛娱乐社交出海新风口!Flat Ads深圳沙龙活动引爆海外市场

随着全球化进程的加速&#xff0c;中国的应用类APP不断走向国际市场。作为产品和服务的提供者&#xff0c;中国开发者围绕社交泛娱乐创新&#xff0c;开启直播出海、短视频出海、游戏社交出海、1V1 视频出海、音频社交出海等出海热潮。“社交、泛娱乐”融合成为行业主流发展趋势…

Redis的内存淘汰策略分析

概念 LRU 是按访问时间排序&#xff0c;发生淘汰的时候&#xff0c;把访问时间最久的淘汰掉。LFU 是按频次排序&#xff0c;一个数据被访问过&#xff0c;把它的频次 1&#xff0c;发生淘汰的时候&#xff0c;把频次低的淘汰掉。 几种LRU策略 以下集中LRU测率网上有很多&am…

TensorFlow2.0教程3-CNN

` 文章目录 基础CNN网络读取数据卷积层池化层全连接层模型配置模型训练CNN变体网络简单的深度网络添加了其它功能层的深度卷积NIN网络文本卷积基础CNN网络 读取数据 import numpy as np import tensorflow as tf import tensorflow.keras as keras import tensorflow.keras.la…

python 字典Dict

一种序列类型&#xff0c;使用键-值&#xff08;key-value&#xff09;存储&#xff0c;具有极快的查找速度。 目录 key的特性 创建字典 元素的访问 Get获取 修改 是否存在key 删除 删除单个 删除全部 遍历 遍历key与值 只遍历值 遍历key,value方法2 结合enumera…