Vue学习(五)生命周期、组件

news2024/11/14 21:39:54

生命周期

生命周期,又名生命周期回调函数、生命周期函数、生命周期钩子。

生命周期是Vue在关键时刻帮我们调用的一些特殊名称的函数。

生命周期函数的名字不可更改,但是函数的具体内容是程序员根据需求写的。

生命周期中的this指向的是vm或者组件实例对象

Vue生命周期图示:

详细图示2:

例:mounted生命钩子的使用,使得相应的文字的透明度呈现闪烁效果。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>引出生命周期</title>
    <script type="text/javascript" src="../vue.js"></script>
    <link rel="icon" href="favicon.ico">
</head>
<body>
    <div id="root">
        <h2 :style="{opacity}">欢迎学习Vue</h2>
    </div>
</body>
<script type="text/javascript">
    Vue.config.productionTip = false
    new Vue({
        el:"#root",
        data:{
            opacity:1
        },
        //Vue完成模板的解析并把初始的真实的DOM元素放入页面后(完成挂载)调用mounted
        mounted(){
            setInterval(() => {
            this.opacity -= 0.01
                if (this.opacity <= 0)
                this.opacity = 1
            },20)
        }
    })

</script>
</html>

常用的生命周期钩子:

  • mounted:发送ajax请求、启动定时器、绑定自定义事件、订阅消息等 (初始化工作)
  • beforeDestroy:清除定时器、解绑自定义事件、取消订阅消息等 (收尾工作)

关于销毁Vue实例:

  • 销毁后自定义事件会失效,但是原生DOM事件依然有效。
  • 一般不会在beforeDestroy操作数据,因为即使操作数据,也不会再触发更新流程了。

组件

组件的定义:实现组件应用中局部功能代码和资源的集合。

组件的作用是复用编码,简化项目编码,提高运行效率。

组件化:当应用中的功能都是多组件的方式来编写的,那这个应用就是一个组件化的应用。

非单文件组件

非单文件组件即一个文件中包含有n个组件。

步骤:

  • 定义组件:使用Vue.extend(option)函数创建,组件内容option和new Vue(option)时传入的那个option大致,但是有一些不同:
    • 不要写el属性,因为最终所有的组件都要被一个vm管理,由vm决定服务于哪个容器
    • data在组件中要写做函数的格式,data的数据写作对象的形式return返回,避免组件被复用,数据存在引用关系
    • 组件的html结构写在template属性中(见案例)
    • 其他的属性比如methods、computed等写法一致
  • 注册组件:
    • 局部注册:new Vue的时候传入components选项,其中属性使用 组件名:组件定义时对应的变量名 的kv格式,如果组件名和组件定义时的变量名相同,可以只写一个组件名(见下案例)
  • 编写组件标签:
    • 组件标签写作一个双标签,标签名为组件名

案例:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <script type="text/javascript" src="../vue.js"></script>
    <link rel="icon" href="../favicon.ico">
    <title>非单文件组件</title>
</head>
<body>
    <div id="root">
        <!-- 编写组件标签 -->
        <xuexiao></xuexiao>
        <hr><hr>
        <!-- 编写组件标签 -->
        <student></student>
        <hr><hr>
        <hello></hello>
    </div>
    <br><br>
    <div id="root2">
        <hello></hello>
    </div>
</body>
<script>

    //创建组件
    const school = Vue.extend({
        //不要写el属性,因为最终所有的组件都要被一个vm管理,由vm决定服务于哪个容器
        data(){//data在组件中要写做函数的格式,data的数据写作对象的形式return返回
           return {
            name:'井冈山大学',
            address:'北京昌平',
            }
        },
        template:`
        <div>
            <h2>学校名称:{{name}}</h2>
            <h2>学校地址:{{address}}</h2>
            <button @click="showName">点我提示学校名</button>
        </div>
        `,
        methods:{
            showName(){
                alert(this.name)
            }
        }
    })

        //创建组件
    const student = Vue.extend({
        //不要写el属性,因为最终所有的组件都要被一个vm管理,由vm决定服务于哪个容器
        data(){//data在组件中要写做函数的格式,data的数据写作对象的形式return返回
           return {
            name:'李二狗',
            age:20,
            }
        },
        template:`
        <div>
            <h2>学生姓名:{{name}}</h2>
            <h2>学生年龄:{{age}}</h2>
        </div>
        `
    })

    const hello = Vue.extend({
        data(){
            return{
                name:'二狗'
            }
        },
        template:`
        <div>
            <h2>你好呀,{{name}}</h2>
        </div>
        `
    })

    //全局注册
    Vue.component('hello',hello)

    new Vue({
        el:'#root',
        components:{
            xuexiao:school,
            student
        }
    })

    new Vue({
        el:'#root2'
    })
</script>
</html>

组件定义简写方式:

const school = Vue.extend(options) 可以简写为 const school = options

组件的嵌套

如果想要在一个组件中包含其他组件,则其子组件要在父组件的components属性配置项中进行注册,要注意子组件要在父组件之前定义。例:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <script type="text/javascript" src="../vue.js"></script>
    <link rel="icon" href="../favicon.ico">
    <title>非单文件组件</title>
</head>
<body>
    <div id="root"></div>
</body>
<script>

    //创建子组件,这个子组件要放在父组件之前定义
    const student = Vue.extend({
    //不要写el属性,因为最终所有的组件都要被一个vm管理,由vm决定服务于哪个容器
    data(){//data在组件中要写做函数的格式,data的数据写作对象的形式return返回
        return {
        name:'熊mao',
        age:20,
        }
    },
    template:`
    <div>
        <h2>学生名称:{{name}}</h2>
        <h2>学生年龄:{{age}}</h2>
    </div>
    `
    })

    //创建组件
    const school = Vue.extend({
    //不要写el属性,因为最终所有的组件都要被一个vm管理,由vm决定服务于哪个容器
    data(){//data在组件中要写做函数的格式,data的数据写作对象的形式return返回
        return {
        name:'井冈山大学',
        address:'北京昌平',
        }
    },
    template:`
    <div>
        <h2>学校名称:{{name}}</h2>
        <h2>学校地址:{{address}}</h2>
        <student></student>
    </div>
    `,components:{
        student
    }
    })

    const hello = Vue.extend({
        data(){
            return{
                name:'二狗'
            }
        },
        template:`
        <div>
            <h2>你好呀,{{name}}</h2>
        </div>
        `
    })

    //定义app组件
    const app = Vue.extend({
        components:{
            school,
            hello
        },template:`
        <div>
            <hello></hello>
            <school></school>
        </div>
        `
    })

    new Vue({
        el:'#root',
        components:{
            app
        },template:`
        <app></app>
        `
    })
</script>
</html>

关于VueComponent:

  • school组件本质是一个名为VueComponent的构造函数,且不是程序员定义的,而是由Vue.extend生成的。编写组件标签后Vue解析时会帮我们创建school组件的实例对象,帮我们执行new VueComponent(options)。
  • 在组件中,data、methods中的函数、watch中的函数、computed中的函数,它们的this均是该组件的VueComponent实例对象(简称vc)
  • VueComponent和Vue有一个内置关系:VueComponent.prototype.proto === Vue.prototype,让组件实例对象vc可以访问到Vue原型上的属性、方法。

单文件组件

单文件组件的案例:

<template>
    <div class="demo">
        <h2>学校名称:{{name}}</h2>
        <h2>学校地址:{{address}}</h2>
        <button @click="showName">点我提示学校名</button>
    </div>
</template>

<script>
    export default {
        name:"School",
        //不要写el属性,因为最终所有的组件都要被一个vm管理,由vm决定服务于哪个容器
        data(){//data在组件中要写做函数的格式,data的数据写作对象的形式return返回
           return {
            name:'井冈山大学',
            address:'北京昌平',
            }
        },
        methods:{
            showName(){
                alert(this.name)
            }
        }
    }
    
</script>

<style>
    .demo{
        background-color: orange;
    }
</style>

单文件组件中:

  • template标签是用于写组件的html结构。
  • script中定义vue实例对象,写交互逻辑,其中的export default { option }就是在创建vue实例并默认向外暴露,option中就是new Vue({option})中的option的内容。
  • style标签用于写组件要使用的样式。

Vue脚手架

Vue脚手架的结构:(src下)

  • node_modules:各种依赖的存放
  • public:
    • favicon.ico:页签图标
    • index.html:主页面
  • src
    • assets:用于存放静态资源
    • components:用于存放各个单文件组件
    • App.vue:用于汇集各个组件到一起,为父组件,最后会渲染到脚手架的public目录下的index.html上
    • main.js:配置vm信息,且是程序的入口
  • vue.config.js配置文件:配置一些vue中的参数

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

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

相关文章

NFTScan | 09.16~09.23 NFT 市场热点汇总

欢迎来到由 NFT 基础设施 NFTScan 出品的 NFT 生态热点事件每周汇总。 周期&#xff1a;2024.09.16~ 2024.09.22 NFT Hot News 01/ ​DeGods 推出代币 DEGOD&#xff0c;用户可通过 DeGods、y00ts 或 DUST 进行转换 9 月 16 日&#xff0c;Solana NFT 项目 DeGods 推出代币…

综合题第二题(路由器的配置)

题目 如何计算子网掩码 我们可以观察到上图的IP地址后面有“/26”、“30”。我们都知道子网掩码是由多个连续“1”和多个连续“0”组成的&#xff0c;“、26”表示子网掩码的二进制表达中有26个1。 例如&#xff1a;156.95.9.128/26 1111 1111.1111 1111.1111 1111.1100 0000…

idea插件开发系列1-环境搭建

前言 还记着10多年前有幸接触了eclipse插件开发&#xff0c;10多年后的今天有开发了idea的插件&#xff0c;真是一个轮回&#xff01; 为什么要学习idea插件开发呢&#xff1f; 目前公司使用自己的MVC框架&#xff0c;没有相应的idea插件支持&#xff08;如类似mybatis插件可…

基于51单片机智能家居监控系统设计

文章目录 前言资料获取设计介绍功能介绍设计程序具体实现截图设计获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师&#xff0c;一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对…

计算机毕业设计hadoop+hive航班预测系统 飞机票航班数据分析可视化大屏 机票预测 机票爬虫 飞机票推荐系统 大数据毕业设计

《HadoopHive航班预测系统》开题报告 一、课题背景与意义 随着全球航空业的快速发展&#xff0c;航班数据呈现出爆炸性增长的趋势。这些数据包含了航班时间、航线、价格、乘客量、天气条件等多种信息&#xff0c;对于航空公司来说&#xff0c;如何高效处理和分析这些数据&…

大模型培训讲师叶梓:Llama Factory 微调模型实战分享提纲

LLaMA-Factory ——一个高效、易用的大模型训练与微调平台。它支持多种预训练模型&#xff0c;并且提供了丰富的训练算法&#xff0c;包括增量预训练、多模态指令监督微调、奖励模型训练等。 LLaMA-Factory的优势在于其简单易用的界面和强大的功能。用户可以在不编写任何代码的…

高校大数据实训管理平台怎么选择?

泰迪智能科技大数据实训管理平台分为多个方向包括&#xff1a;人工智能方向、大数据方向、商务数据分析方向&#xff0c;不同高校可以结合高校情况选择合适自己院校的相关产品平台。 高校实训管理平台是实验室模块的核心母平台&#xff0c;对实验室的所有课程及实训资源进行统…

【题解】CF2013A

首先抽自己一巴掌&#xff0c;A题自信提交直接WA&#xff0c;故写此题解警示一下&#xff08;顺便水一水&#xff09;。 翻译 原题链接 思路 显然&#xff0c;若搅拌机单位时间能处理的水果数 x x x小于人每次丢进去的数量 y y y&#xff0c;那人只需要一直扔进去就好了&…

【d48】【Java】【力扣】LCR 123. 图书整理 I

思路 方法1&#xff1a;放进list,将list倒置&#xff0c;利用stream&#xff0c;将list改为int类型 方法2&#xff1a;递归&#xff1a;递归通用思路&#xff1b;明确每一层做什么确定返回值确定什么地方接收下层的返回值 每一层&#xff1a;调用下层&#xff0c;然后把自己…

护理陪护小程序|陪护系统||陪护系统开发

在当今社会&#xff0c;随着人口老龄化的加剧和家庭结构的变化&#xff0c;护理与陪护服务的需求日益增长。为了更好地满足这一市场需求&#xff0c;并提升服务效率与质量&#xff0c;护理陪护小程序应运而生。这类小程序不仅为用户提供了便捷、高效的服务预约与管理平台&#…

DANN GRL

域自适应是指在目标域与源域的数据分布不同但任务相同下的迁移学习&#xff0c;从而将模型在源域上的良好性能迁移到目标域上&#xff0c;极大地缓解目标域标签缺失严重导致模型性能受损的问题。 介绍一篇经典工作 DANN &#xff1a; 模型结构 在训练阶段需要预测如下两个任务…

Redis:持久化

1. Redis持久化机制 Redis 支持 RDB 和 AOF 两种持久化机制&#xff0c;持久化功能有效地避免因进程退出造成数据丢失问题&#xff0c; 当下次重启时利⽤之前持久化的文件即可实现数据恢复。 2.RDB RDB 持久化是把当前进程数据⽣成快照保存到硬盘的过程&#xff0c;触发 RDB…

【第十一章:Sentosa_DSML社区版-机器学习之分类】

目录 11.1 逻辑回归分类 11.2 决策树分类 11.3 梯度提升决策树分类 11.4 XGBoost分类 11.5 随机森林分类 11.6 朴素贝叶斯分类 11.7 支持向量机分类 11.8 多层感知机分类 11.9 LightGBM分类 11.10 因子分解机分类 11.11 AdaBoost分类 11.12 KNN分类 【第十一章&…

Rustrover2024.2 正式发布:个人非商用免费,泰裤辣

如果这个世界本身 已经足够荒唐 那究竟什么才能算是疯狂 爱情就是这样 一旦错过了 就会有另一个人代替 我们知道 jetbrains 在今年的早些时候正式为 rust 语言发布了专用的 IDE &#xff0c;也就是 rustrover。如今 rustrover 也正式跻身为 jetbrains IDE 系列的一员猛将。…

Dynamic Connected Networks for Chinese Spelling Check(ACL2021)

Dynamic Connected Networks for Chinese Spelling Check(ACL2021) 一&#xff0e;概述 文中认为基于bert的非自回归语言模型依赖于输出独立性假设。不适当的独立性假设阻碍了基于bert的模型学习目标token之间的依赖关系&#xff0c;从而导致了不连贯的问题。为些&#xff0c…

如何使用GLib的单向链表GSList

单向链表是一种基础的数据结构&#xff0c;也是一种简单而灵活的数据结构&#xff0c;本文讨论单向链表的基本概念及实现方法&#xff0c;并着重介绍使用GLib的GList实现单向链表的方法及步骤&#xff0c;本文给出了多个实际范例源代码&#xff0c;旨在帮助学习基于GLib编程的读…

docker如何升级MySQL为最新版本

今天安全扫描发现MySQL存在漏洞&#xff0c;不用想别的升级到最新版。本篇文章有两个目的&#xff0c;1&#xff09;为自己做一个记录&#xff0c;下次升级的时候不用再浪费时间查资料&#xff1b;2&#xff09;给大家一点帮助&#xff1b; 因为我是docker部署&#xff0c;所以…

docker 创建showdoc服务 showdoc容器部署教程

1. 下载最新版本镜像 # 按照最新版本 docker pull star7th/showdoc 2. 创建映射文件夹&#xff1a; # 创建文件夹 mkdir -p /data/showdoc_data# 可写权限 chmod 777 /data/showdoc_data 3.创建容器命令&#xff1a; docker run -d --name showdoc --userroot --privileged…

分享一个vue+spring的前后端项目

管理员页面 用户界面 后面的一部分 后端代码

leetcode第二十六题:删去有序数组的重复项

给你一个 非严格递增排列 的数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使每个元素 只出现一次 &#xff0c;返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。 考虑 nums 的唯一元素的数量为 k &#xff0c;你…