Vue2学习之路 · 六:组件与组件化、模块与模块化

130 阅读4分钟

组件和组件化

组件

定义:实现应用中局部(特定)功能代码和资源的集合

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

组件化

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

模块和模块化

模块

定义:一个模块一般就是一个js文件,用于向外提供特定功能的js程序

作用:复用js、简化js的编写、提高js的运行效率

模块化

定义:当应用中的js都已模块来编写,那这个应用就是一个模块化的应用

非单文件组件

定义:一个文件中包含n个组件,比如一个html文件中包含n个组件

单文件组件

定义:一个文件中只包含1个组件,比如一个vue文件中包含1个组件

组件的使用

三大步骤

第一步:定义组件(也就是创建组件)

第二步:注册组件

第三步:使用组件(写组件标签)

如何定义一个组件

使用Vue.extend(options)创建,其中options和new Vue实例时传入的配置属性几乎一样,但还有有所不同

不同点:

不写el,因为所有的组件都需要被一个vm管理,由vm决定服务于哪个容器

data必须写成函数形式,return一个对象,其中就是具体的属性,避免组件被复用时数据存在引用关系

注意:

使用template可以配置组件结构,使用

如何注册组件

局部注册:使用new Vue的时候传入components配置属性

全局注册:使用Vue.component('组件名',组件)

如何使用组件

在html文档中,把要使用的组件写为一个双标签

如:,<组件名></组件名>

<div id="root">
        <h1>{{msg}}</h1>
        <hr>
        <!-- 第三步:编写组件标签 -->
        <school></school>
        <hr>
        <student></student>
        <hr>
        <hello></hello>
    </div>
    <script>
        // 第一步:创建组件
        // 创建school组件
        const school = Vue.extend({
            // el:'#root',
            // 在定义组件时,不用写el配置属性,因为所有的组件都需要被一个vm管理,由vm决定服务于哪个容器

            data(){
                return {
                    schoolName:'清华大学',
                    address:'北京'
                }
            },
            template:`
                <div>
                    <h2>学校名称:{{schoolName}}</h2>
                    <h2>学校地址:{{address}}</h2>
                    <button @click="showName">点我提示学校名</button>
                </div>
            `,
            methods:{
                showName(){
                    alert(this.schoolName);
                }
            }
        });
        // 创建student组件
        const student = Vue.extend({
            data(){
                return {
                    studentName:'赵云',
                age:18
                }
            },
            template:`
                <div>
                    <h2>学生姓名:{{studentName}}</h2>
                    <h2>学生年龄:{{age}}</h2>
                </div>
            `
        })

        // 创建hello组件
        const hello = Vue.extend({
            template:`
                <div>
                    <h2>你好呀!{{name}}</h2>    
                </div>
            `,
            data(){
                return {
                    name:'张飞'
                }
            }
        }); 

        // 第二步:全局注册组件
        Vue.component('hello',hello);

        // 创建vm
        new Vue({
            el:'#root',
            data:{
                msg:'hello world'
            },
            // 第二步:注册组件(局部注册)
            components:{
                school:school,
                student:student
            }
        })
    </script>

使用组件的几个注意事项

关于组件名

一个单词构成

第一种写法(首字母小写):school

第二种写法(首字母大写):School

多个单词构成

第一种写法(kebab-case命名):my-school

第二种写法(CamelCase命名):MySchool,这种方式必须要在Vue脚手架环境下

备注

组件名中尽可能的回避HTML中已有的元素名称,如h2、H2都不行

可以使用name配置属性指定组件在开发者工具中呈现的名字

关于组件标签

第一种写法:

第二种写法:

备注:在不使用脚手架时,会导致后续组件不能渲染

一个简写方式

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

<div id="root">
        <h1>{{msg}}</h1>
        <hr>
        <!-- <school></school> -->
        <my-school></my-school>
    </div>
    <script>
        // 全写
        const school = Vue.extend({
            name:'xuexiao',
            data(){
                return {
                    name:'清华大学'
                }
            },
            template:`
                <div>
                    <h2>{{this.name}}</h2>    
                </div>
            `
        });

        // 简写
        // const school = {
        //     data(){
        //         return {
        //             name:'清华大学'
        //         }
        //     },
        //     template:`
        //         <div>
        //             <h2>{{this.name}}</h2>    
        //         </div>
        //     `
        // }

        new Vue({
            el:'#root',
            data:{
                msg:'欢迎学习'
            },
            components:{
                // school:school
                'my-school':school
            }
        })

    </script>

组件的嵌套

<body>
    <div id="root">
        <h1>{{msg}}</h1>
        <hr>
        <app></app>
    </div>
    <script>
        // 定义学生组件
         const student = Vue.extend({
            data(){
                return {
                    name:'赵云',
                    age:18
                }
            },
            template:`
                <div>
                    <h2>学生名字:{{this.name}}</h2>    
                    <h2>学生年龄:{{this.age}}</h2>    
                </div>
            `
        });
        // 定义学校组件
        const school = Vue.extend({
            data(){
                return {
                    name:'清华大学',
                    address:'北京'
                }
            },
            template:`
                <div>
                    <h2>学校名称:{{this.name}}</h2>    
                    <h2>学校地址:{{this.address}}</h2>   
                    <student></student>
                </div>
            `,
            components:{
                student
            }
        });
        // 定义hello组件
        const hello = Vue.extend({
            template:`
                <div>
                    <h2>你好呀!{{name}}</h2>    
                </div>
            `,
            data(){
                return {
                    name:'张飞'
                }
            }
        }); 
    //    定义app组件
        const app = Vue.extend({
            template:`
                <div>
                    <hello></hello>
                    <school></school>    
                </div>
            `,
            components:{
                school,
                hello
            }
        });

        new Vue({
            el:'#root',
            data:{
                msg:'欢迎学习'
            },
            components:{app}
        })

    </script>
</body>

关于VueComponent

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

2、所以我们在写组件的标签时(或),Vue解析时会帮我们创建这个组件的实例对象,也就是Vue帮我们执行了new VueComponent(options)

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

4、关于this的指向

组件配置中的this:

data、methods、watch、computed中的函数的this都是VueComponent实例对象

new Vue()配置中的this:

data、methods、watch、computed中的函数的this都是Vue实例对象(vm)

5、VueComponent的实例对象,也可以叫组件实例对象

Vue的实例对象,简称vm

6、VueComponent.prototype.proto=== Vue.protopyte

让组件实例对象可以访问到Vue原型中国的属性和方法