Vue 组件化编程 和 生命周期

news2024/10/7 12:18:15

目录

一、组件化编程

        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------------------------------------------------------");

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

保密利器:迅软科技助力企业解决员工泄露风险

事件回顾 本周&#xff0c;四川省安全向社会公布了一起近期成功破获的案件。涉案人王某某&#xff0c;原本是西南某大型国企在海外的驻扎负责人。他利用单位管理中的漏洞&#xff0c;私自获取并向境外提供了14份属于我国法律定义的情报。在经过审理后&#xff0c;被告人王某某因…

css3文字环绕旋转

目录 固定数量文字环绕旋转不固定数量文字环绕旋转效果图 固定数量文字环绕旋转 <!-- 文字旋转测试 --> <template><div class"page"><div><div v-for"(item, index) in [...Array(20).keys()]" :key"index" style&…

pytorch优化器详解

1 什么是优化器 1.1 优化器介绍 在PyTorch中&#xff0c;优化器&#xff08;Optimizer&#xff09;是用于更新神经网络参数的工具。它根据计算得到的损失函数的梯度来调整模型的参数&#xff0c;以最小化损失函数并改善模型的性能。 即优化器是一种特定的机器学习算法&#…

2014年计网408

第一题 在 OSI 参考模型中, 直接为会话层提供服务的是()A. 应用层B. 表示层C. 传输层D. 网络层 运输层是会话层的相邻下层&#xff0c;它为会话层直接提供服务。运输层也称为传输层。 第二题 某以太网拓扑及交换机当前转发表如下图所示, 主机 00-e1-d5-00-23-a1 向主机 00−…

Postman小白安装和注册入门教程

近期在复习Postman的基础知识&#xff0c;在小破站上跟着百里老师系统复习了一遍&#xff0c;也做了一些笔记&#xff0c;希望可以给大家一点点启发。 一&#xff09;安装 访问官网https://www.getpostman.com/downloads/&#xff0c;直接下载安装。 二&#xff09;注册和登录…

金蝶云星空表单插件实现父窗体打开子窗体,并携带参数到子窗体

文章目录 金蝶云星空表单插件实现父窗体打开子窗体&#xff0c;并携带参数到子窗体父窗体打开子窗体准备设置携带参数打开子窗体子窗体接收参数 金蝶云星空表单插件实现父窗体打开子窗体&#xff0c;并携带参数到子窗体 父窗体打开子窗体准备 BillShowParameter OtherInAdd n…

使用PE U盘在VM Workstation中安装系统

VM Workstation中虚拟机的启动项如下图&#xff0c;发现不能支持U盘启动&#xff0c;需要使用PE盘在虚拟机中安装系统怎么办呢&#xff01; 喜欢使用ISO镜像安装系统的小伙伴可以放弃这种方法了。但是这种方法可以测试你的PE盘是否正常工作&#xff0c;模拟在物理服务器上的安…

十进制转换成2进制

十进制转换成2进制 参考链接&#xff1a;https://blog.csdn.net/qq_44755403/article/details/89279970?ops_request_misc%257B%2522request%255Fid%2522%253A%2522169960944816800227457337%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id…

Zabbix深入解析与实战

1.Zabbix 1.1.监控概述 监控是指对行为、活动或其他变动中信息的一种持续性关注&#xff0c;通常是为了对人达成影响、管理、指导或保护的目的 监控 监视主机架构状态控制&#xff0c;事后追责目标&#xff1a;早发现早处理(故障、性能、架构) 网站扩容(用数据说话) 为什么要…

OC-编译错误

明明包含了头文件&#xff0c;但是还是显示未知的类型 可能这个头文件被某个宏包住了 #if defined(__cplusplus) 在 C 代码中包含了一个 C 的头文件会显示这个错误“the util lib only be used in c”&#xff0c;此时用 #if defined(__cplusplus) #endif 包一下就行了&…

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

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

TCC分布式事务----以Hmily框架为例

插曲&#xff1a;RocketMQ的Half Message 先引入一个插曲&#xff0c;RocketMQ为什么要有Half Message 为什么不在本地事务提交之后&#xff0c;直接发一个commit消息不就行了&#xff0c;为什么还要先发一个可以撤回的、不能被消费的half message&#xff0c;再执行本地事务…

FindMy网络帮助您找到电动车

随着科技的发展&#xff0c;我们的生活变得越来越智能化。而现在&#xff0c;这项技术已经深入到了我们的出行方式中。如果你是一位电动车主&#xff0c;那么你可能会遇到一个常见的问题&#xff1a;忘记你的电动车停在了哪里。这种情况在日常生活中时有发生&#xff0c;而现在…

磁盘的分区、格式化、检验与挂载 ---- fdisk,mkfs,mount

磁盘的分区、格式化、检验与挂载 磁盘管理是非常重要的&#xff0c;当我们想要再系统里面新增一块磁盘使用时&#xff0c;应执行如下几步&#xff1a; 对磁盘进行划分&#xff0c;以建立可用的硬盘分区 &#xff08;fdisk / gdisk&#xff09;对硬盘分区进行格式化&#xff0…

【微信公众号开发】1.1 微信公众号开发课程内容介绍

一、微信公众号介绍 1、公众号类型及基本介绍 服务号、订阅号、小程序之间的关联及区别 2、编辑模式的使用 非开发者使用微信公众号的方式&#xff0c;通过微信公众号提供的平台来编辑 3、开发模式及预备知识介绍 如果我们不想使用默认的编辑模式&#xff0c;可以在具备一…

首周 Web3 开发者激励开启!数据与钱包新锐派送福利

如何在 Web3 时代汇聚更多开发者的力量&#xff0c;寻找全新的技术发展机遇和突破点&#xff1f;打造生态繁荣、高度协作的社区生态是不二路径。现在&#xff0c;一系列更为开放、活跃、包容的开发者社区活动正向大家发起邀请&#xff0c;你确定不来看看吗&#xff1f; 为了吸…

Power Automate-创建审批流

提前在SharePoint上创建好对应的表 在创建中选择自动化云端流 选择当创建项时触发 选择站点和列表&#xff0c;再点击添加新步骤 搜索审批&#xff0c;点击进入 操作里的选项区别&#xff1a; 1&#xff09;创建审批&#xff1a;创建一个审批任务 2&#xff09;等待审批&…

【Linux】 mdir命令使用

mdir 为mtools工具指令&#xff0c;模拟MS-DOS的dir指令&#xff0c;可显示MS-DOS文件系统中的目录内容。 语法 mdir [参数][目录] mdir命令 -Linux手册页 命令选项及作用 执行令 mdir--help 执行命令结果 参数 -a  显示隐藏文件。-f  不显示磁盘所剩余的可用空间。-w…

踹他GPT 之 弄个大乐透助手

11月7日凌晨的OpenAI第一次开发者大会&#xff0c;除了速度提升、服务使用费用的减少、开发者生态以外&#xff0c;最让我震撼的是&#xff0c;GPTS是ChatGPT的定制版本&#xff0c;是通过简单配置就可以完成一个使用ChatGPT、集成系统和数据服务的智能助手。比如OpenAI开发者体…

用Go实现网络流量解析和行为检测引擎

1.前言 最近有个在学校读书的迷弟问我:大德德, 有没有这么一款软件, 能够批量读取多个抓包文件,并把我想要的数据呈现出来, 比如:源IP、目的IP、源mac地址、目的mac地址等等。我说&#xff1a;“这样的软件你要认真找真能找出不少开源软件, 但毕竟没有你自己的灵魂在里面,要不…