Vue学习6

生命周期

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

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

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

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

生命周期过程图解

请添加图片描述

常用的生命周期方法:

mounted(): 发送ajax请求, 启动定时器、绑定自定义事件、订阅消息等异步任务【初始化操作】

beforeDestroy(): 做收尾工作, 如: 清除定时器、解绑自定义事件、取消订阅消息等【收尾工作】

关于销毁Vue实例:

销毁后借助Vue开发者工具看不到任何信息,销毁后自定义事件会失效,但原生DOM事件依然有效

一般不会在beforeDestroy操作数据,因为即使操作数据,也不会再触发更新流程了

组件

组件就是实现应用中局部功能的代码和资源的集合

其作用是复用编码,简化项目编码,提高运行效率

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

组件有两种实现方式:非单文件组件和单文件组件

非单文件组件

一个文件中包含多个组件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="../js/vue.js"></script>
</head>
<body>
    <!-- 分为两个组件:school和student -->
    <div class="root">
        <!-- 使用组件 -->
        <school></school>
        <hr>
        <student></student>
    </div>
    <script>
        Vue.config.productionTip=false;
        // 创建组件使用Vue.extend
        // 参数是一个配置对象,几乎和创建vm的配置对象一样
        const school=Vue.extend({
            // 配置对象中没有el配置项,因为最终所有组件都要被一个vm管理,由vm决定服务于哪个容器
            // data要使用函数式
            data:function(){
                return {
                    schoolName:'SCU',
                    Saddress:'SiChuan',
                }
            },
            // template中写组件的结构,要包含在一个div标签中
            template:`
            <div>
                <h2>学校名称:{{schoolName}}</h2>
                <h2>学校地址:{{Saddress}}</h2>
            </div>
            `
        })
        const student=Vue.extend({
            data:function(){
                return {
                    studentName:'lili',
                    Sage:19
                }
            },
            template:`
            <div>
                <h2>学生名称:{{studentName}}</h2>
                <h2>学生年龄:{{Sage}}</h2>
            </div>
            `
        })
       
        // 全局注册组件(所有vm都能使用这个组件了)
        // Vue.component('school',school)
        
        new Vue({
            el:'.root',
            // 注册组件(局部注册)
            // 组件使用components使用
            components:{
                school:school,
                student:student
            }
        })
    </script>
</body>
</html>

三大步骤:定义组件、注册组件、使用组件

定义组件:使用Vue.extend(options)创建,其中options和new Vue(options)时传入的那个options几乎一样,但有以下区别:

        不要写el——最终所有的组件都要经过一个vm的管理,由vm中的el决定服务哪个容器

        data必须写成函数——避免组件被复用时,数据存在引用关系

注意,使用tempalte可以配置组件结构

注册组件:局部注册:new Vue的时候传入components选项;全局注册:Vue.component(‘组件名’, 组件)

使用组件:模版中使用<组件名></组件名>

注意

组件名由一个单词组成时:
        第一种写法(首字母小写):school
        第二种写法(首字母大写):School

组件名由多个单词组成时:
        第一种写法(kebab-case命名):my-school
        第二种写法(CamelCase命名):MySchool(需要Vue脚手架支持)

并且:组件名尽可能回避HTML中已有的元素名称,例如h2、H2,可以使用name配置项指定组件在开发者工具中呈现的名字

使用组件标签时,可以简写为<组件名/>,但要注意,这需要Vue脚手架,否则可能导致后续组件不能渲染

定义组件时,可以简写为 const 变量名=配置对象

组件的嵌套

顾名思义,就是在一个组件中嵌套了其他组件

使用方法就是在父组件中注册子组件,并且使用时,子组件的组件标签要写在父组件的template中

VueComponent

组件本质是一个名为VueComponent的构造函数,且不是程序员定义的,是Vue.extend生成的

我们只需要写<app/>或<app></app>,Vue解析时会帮我们创建app组件的实例对象,即Vue帮我们执行new VueComponent(options)

特别注意:每次调用Vue.extend,返回的都是一个全新的VueComponent

关于this指向:
        组件配置中:data函数、methods中的函数、watch中的函数、computed中的函数 它们的this均是【VueComponent实例对象】
        new Vue(options)配置中:data函数、methods中的函数、watch中的函数、computed中的函数 它们的this均是【Vue实例对象】

VueComponent的实例对象,以后简称vc(也可称之为:组件实例对象)

Vue的实例对象,以后简称为vm

注意:

VueComponent.prototype.__proto__ === Vue.prototype,这使得VC可以访问到vm上的属性和方法

单文件组件

一个文件中只包含一个组件,文件以vue作为后缀

接下来以一个例子说明:

组件文件

School.vue

<template>
  <!-- 组件的结构 -->
  <div class="root">
      <h2>学校名称:{{schoolName}}</h2>
      <h2>学校地址:{{Saddress}}</h2>
  </div>
</template>

<script>
const school=Vue.extend({
    // 组件名
    name:'School',
    data:function(){
        return {
            schoolName:'SCU',
            Saddress:'SiChuan',
        }
    },
    })
// 暴露
export default school
</script>

<style>
/* 组件的样式 */
.root{
    background-color: pink;
}

</style>

Student.vue

<template>
  <!-- 组件的结构 -->
  <div class="root">
      <h2>学生名称:{{studentName}}</h2>
      <h2>学生年龄:{{Sage}}</h2>
  </div>
</template>

<script>
const student=Vue.extend({
    // 组件名
    name:'Student',
    data:function(){
        return {
            studentName:'lili',
            Sage:15,
        }
    },
    })
// 暴露
export default student
</script>

<style>
/* 组件的样式 */
/* 没有可以不写 */
.root{
    background-color: rgb(192, 212, 255);
}

</style>

App.vue(用于汇总组件)

<template>
  <div>
      <School></School>
      <Student></Student>
  </div>
</template>

<script>
//  app.vue负责汇总所有组件
import School from './School.vue'
import Student from './Student.vue'
export default {
    name:'App',
    components:{
        School,
        Student
    },   
}
</script>

<style>

</style>

js文件

import App from './App.vue'

new Vue({
    el:'.root',
    components:{App},
    template:`
    <App></App>
    `
})

html文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="../js/vue.js"></script>
</head>
<body>
    <!-- 准备一个容器 -->
    <div class=".root">
    </div>
    <script src="./main.js"></script>
</body>
</html>
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值