0
点赞
收藏
分享

微信扫一扫

【Vue】Vue2.0+Vue3.0学习笔记day06

悲催博士僧 2022-01-07 阅读 64

目录

048.引出生命周期

049.生命周期挂载流程

050.生命周期更新流程

051.生命周期销毁流程

052.生命周期总结

053.对组件的理解

054.非单文件组件--基本使用

055.组件的几个注意点

056.组件的嵌套

057.VueComponent构造函数

058.Vue实例与组件实例

059.一个重要的内置关系

060.单文件组件


048.引出生命周期

<!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>引出生命周期</title>
    <!-- 引入Vue -->
    <script src="../js/vue.js"></script>
</head>

<body>
    <!-- 
         生命周期:
           1.又叫:生命周期回调函数、生命周期函数、生命周期钩子
           2.是什么:Vue在关键时刻帮我们调用的一些特殊名称函数
           3.生命周期函数名字不可更改,但函数的具体内容是程序员根据需求编写的
           4.生命周期函数中的this指向是vm或组件实例对象                            
    -->

    <!-- 准备好一个容器 -->
    <div id="root">
        <h2 :style="{opacity}">欢迎学习vue</h2>
    </div>
</body>

<script>
    Vue.config.productionTip = false //以阻止 Vue 在启动时生成生产提示
    new Vue({
        el: '#root', //el用于指定当前vue实例为哪个容器服务,值通常为CSS选择器字符串
        data: { // data用于存储数据,数据供el所指定的容器去使用,值我们暂时先写成一个对象
            opacity:1
        },
        // Vue完成模板的解析并把初始的真实DOM元素放入页面后(完成挂载)调用mounted
        mounted(){
            setInterval(() => {
            this.opacity-=0.01
            if(this.opacity<=0)this.opacity=1
        }, 16);
        }
    })
    // 通过外部的定时器实现(不推荐)
    /* setInterval(() => {
        vm.opacity-=0.01
        if(vm.opacity<=0)vm.opacity=1
    }, 16); */
</script>

</html>

049.生命周期挂载流程

  

050.生命周期更新流程

051.生命周期销毁流程

052.生命周期总结

<!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>总结生命周期</title>
    <!-- 引入Vue -->
    <script src="../js/vue.js"></script>
</head>

<body>
    <!-- 
         常用的生命周期钩子:
           1.mounted:发送ajax请求、启动定时器、绑定自定义事件、订阅消息等【初始化操作】
           2.beforeDestroy:清楚定时器、解绑自定义事件、取消订阅等【收尾工作】
         关于销毁Vue实例:
           1.销毁后借助vue开发者工具看不到任何信息
           2.销毁后自定义事件会失效,但原生DOM事件依然有效
           3.一般不会再beforeDestroy操作数据,因为即便操作数据也不会再触发更新流程了                         
    -->

    <!-- 准备好一个容器 -->
    <div id="root">
        <h2 :style="{opacity}">欢迎学习vue</h2>
        <button @click="stop">点我停止变换</button>
    </div>
</body>

<script>
    Vue.config.productionTip = false //以阻止 Vue 在启动时生成生产提示
    new Vue({
        el: '#root', //el用于指定当前vue实例为哪个容器服务,值通常为CSS选择器字符串
        data: { // data用于存储数据,数据供el所指定的容器去使用,值我们暂时先写成一个对象
            opacity:1
        },
        methods: {
            stop(){
             // 销毁vm 
                this.$destroy()
            }
        },
        // Vue完成模板的解析并把初始的真实DOM元素放入页面后(完成挂载)调用mounted
        mounted(){
            this.timer=setInterval(() => {
            this.opacity-=0.01
            if(this.opacity<=0)this.opacity=1
        }, 16);
        },
        // 销毁之前
        beforeDestroy() {
            // 清楚定时器
            clearInterval(this.timer)
        },
    })
</script>

</html>

053.对组件的理解

 

054.非单文件组件--基本使用

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

 单文件组件:一个文件中只包含有1个组件

<!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>基本使用</title>
    <!-- 引入Vue -->
    <script src="../js/vue.js"></script>
</head>

<body>
    <!-- 
          Vue中使用组件的三大步骤:
            1.定义组件(创建组件)
            2.注册组件
            3.使用组件(写组件标签)
          如何定义一个组件:
            使用Vue.extend(options)创建,其中options和new Vue(options)时传入的options几乎一样,但也有区别:
               1 el不要写,为什么? 最终所有的组件都要经过一个vm管理,由vm中的el决定服务哪个容器
               2 data必须写成函数,为什么? 避免组件被复用时,数据存在引用关系
            备注:使用template可以配置组件结构
          如何注册组件:
              1 局部注册:靠new Vue的时候传入components选项
              2 全局注册:靠Vue.component('组件名',组件)   Vue.component('School',school) 
          编写组件标签:
              <组件名></组件名>    <School></School>                             
    -->

    <!-- 准备好一个容器 -->
    <div id="root">
        <!-- 3 编写组件标签 -->
        <School></School>    
        <School></School>    
        <hr> 
        <!-- 3 编写组件标签 -->
       <Studet></Studet>     
    </div>
</body>

<script>
    Vue.config.productionTip = false //以阻止 Vue 在启动时生成生产提示
    // 1 创建school组件
    const school= Vue.extend({
        template:`
        <div>
            <h2>学校名称:{{schoolName}}</h2>
            <h2>学校地址:{{address}}</h2>  
        </div>
        `,
        data(){
            return{
                schoolName: '西西歪',
                address: '广州'
            }
        }
    })
    // 1 创建studet组件
    const studet= Vue.extend({
        template:`
        <div>
            <h2>学生姓名:{{studetNtname}}</h2>   
            <h2>学生年龄:{{age}}</h2> 
        </div>
        `,
        data(){
            return{
                studetNtname: '张三',
                age:'18' 
            }
        }
    })

    new Vue({
        el: '#root', //el用于指定当前vue实例为哪个容器服务,值通常为CSS选择器字符串
        // 2 注册组件
        components:{
            School:school,
            Studet:studet
        }
    })
</script>

</html>

055.组件的几个注意点

<!-- 
          几个注意点:
             1 关于组件名:
                一个单词组成:
                  第一种写法(首字母小写):school 
                  第二种写法(首字母大写):School  
                多个单词组成: 
                  第一种写法(kebab-case命名):my-school
                  第二种写法(CamelCase命名): MySchool(需要vue脚手架支持) 
                备注:
                   组件名尽可能回避HTML中已有的元素名称,例如:h2/H2都不行
                   可以使用name配置项指定组件开发者工具中呈现的名字  
             2 关于组件标签:
                第一种写法: <School></School>                                
                第二种写法: <School/>    
                备注:不使用脚手架时,<School/>会导致后续组件不能渲染
             3 一个简写方式:
                   const school= Vue.extend({options}) 可简写为:const school= options                             
    -->

056.组件的嵌套

<!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>组件的嵌套</title>
    <!-- 引入Vue -->
    <script src="../js/vue.js"></script>
</head>

<body>
    <!-- 
                                      
    -->

    <!-- 准备好一个容器 --> 
    <div id="root">
        <!--  编写组件标签 -->
                   
    </div>
</body>

<script>
    Vue.config.productionTip = false //以阻止 Vue 在启动时生成生产提示
        //  创建studet组件
        const studet= Vue.extend({
        template:`
        <div>
            <h2>学生姓名:{{studetNtname}}</h2>   
            <h2>学生年龄:{{age}}</h2> 
        </div>
        `,
        data(){
            return{
                studetNtname: '张三',
                age:'18' 
            }
        }
    })
    //  创建school组件
    const school= Vue.extend({
        template:`
        <div>
            <h2>学校名称:{{schoolName}}</h2>
            <h2>学校地址:{{address}}</h2> 
            <Studet></Studet>  
        </div>
        `,
        data(){
            return{
                schoolName: '西西歪',
                address: '广州'
            }
        },
        //  注册组件
        components:{
            Studet:studet
        }
    })
    //  创建hello组件
    const hello =Vue.extend({
        template:`
        <div>
            <h1>{{msg}}</h1>
        </div>
        `,
        data(){
            return{
                msg:'欢迎来西西歪学习'
            }
        }
    })
    //  创建app组件
    const app =Vue.extend({
        template:`
        <div>
            <Hello></Hello>
            <School></School> 
        </div>
        `,
        components:{
            Hello:hello,
            School:school          
        }
    })

    new Vue({
        template:` <App></App> `,
        el: '#root', //el用于指定当前vue实例为哪个容器服务,值通常为CSS选择器字符串
        //  注册组件
        components:{
            App:app          
        }
    })
</script>

</html>

057.VueComponent构造函数

   <!-- 
          关于VueComponent:
             1.school组件本质是一个名为VueComponent的构造函数,且不是程序员定义的,是Vue.extend生成的
             2.我们只需要写<school/>或 <school></school>,Vue解析时会帮我们创建school组件的实例对象,
               即Vue帮我执行:new VueComponent(options)     
             3.特别注意:每次调用Vue.extend返回的都是一个全新的VueComponent
             4.关于this指向:
                组件配置中:
                   data函数、methods中的函数、watch中的函数、computed中的函数,它们的this均是【VueComponent实例对象】
                new Vue()配置中:
                    data函数、methods中的函数、watch中的函数、computed中的函数,它们的this均是【Vue实例对象】   
             5.VueComponent的实例对象,以后简称VC(也可称之为:组件实例对象)
                Vue的实例对象,以后简称vm                      
    -->

058.Vue实例与组件实例

059.一个重要的内置关系

一个重要的内置关系:VueComponent.prototype._proto_===Vue.prototype

为什么要有这个关系:让组件实例对象(vc)可以访问到Vue原型上的属性、方法

<!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>一个重要的内置关系</title>
    <!-- 引入Vue -->
    <script src="../js/vue.js"></script>
</head>

<body>
    <!-- 
          一个重要的内置关系:VueComponent.prototype._proto_===Vue.prototype
          为什么要有这个关系:让组件实例对象(vc)可以访问到Vue原型上的属性、方法
                                   
    -->

    <!-- 准备好一个容器 --> 
    <div id="root">
        <!-- 3 编写组件标签 -->
        <School></School>        
    </div>
</body>

<script>
    Vue.config.productionTip = false //以阻止 Vue 在启动时生成生产提示
    Vue.prototype.x = 99
    // 1 创建school组件
    const school= Vue.extend({
        template:`
        <div>
            <h2>学校名称:{{schoolName}}</h2>
            <h2>学校地址:{{address}}</h2> 
            <button @click="showx">点我输出</button> 
        </div>
        `,
        data(){
            return{
                schoolName: '西西歪',
                address: '广州'
            }
        },
        methods: {
            showx(){
                console.log(this.x);
            }
        },
    })

    new Vue({
        el: '#root', //el用于指定当前vue实例为哪个容器服务,值通常为CSS选择器字符串
        // 2 注册组件
        components:{
            School:school,
        }
    })
</script>

</html>

 

060.单文件组件

单文件组件后缀是.vue,在浏览器中不能运行.vue文件,所以单文件组件要用脚手架运行

首先建立一个单文件组件School.vue,template写结构,script写脚本,style写样式

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

<script>
    export default {
        name:'School',
        data(){
            return{
                schoolName: '西西歪',
                address: '广州'
            }
        },
        methods: {
            showName(){
                alert(this.schoolName)
            }
        },
    }
</script>

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

然后建立一个App.vue组件(汇总所有组件),在App.vue里引入、注册、使用School.vue,运行解析模板

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

<script>
    import { School } from "./School.vue";
    export default {
        name:'App',
        components:{
            School
        }
    }
</script>

<style>

</style>

接着新建一个入口文件main.js,里面引入、注册、使用App.vue;创建vue实例,指明为哪个容器服务

import App from "./App.vue";

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

最后打来一个index.html文件,里面准备好一个容器,引入vue和入口文件main.js

<!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>练习一下单文件组件的语法</title>
</head>
<body>
    <!-- 准备一个容器 -->
    <div id="root"></div>
    <script src="../js/vue.js"></script>
    <script src="./main.js"></script>
</body>
</html>
举报

相关推荐

0 条评论