第十七节:Vue组件:Vue组件的认识,创建并使用

1. 认识Vue组件

组件系统是 Vue 的另一个重要概念,因为它是一种抽象,允许我们使用小型、独立和通常可复用的组件构建大型应用。
仔细想想,几乎任意类型的应用界面都可以抽象为一个组件树:

组件树.png


1.1 组件是什么

组件就是一段独立的,能代表页面某一个部分的代码片段, 拥有自己独立的数据,JavaScript脚本,以及样式的 标签.


1.2 组件的好处:
  1. 提高开发效率
  2. 方便重复使用
  3. 便于协同开发
  4. 更容易被管理和维护


1.3 组件创建的基本步骤

Vue.js的组件的使用有3个步骤:创建组件构造器、注册组件和使用组件

组件的创建过程.png


1.4 示例

通过一个示例来了解组件的使用

使用Vue的component方法注册全局组件

<div id="app-one">
    <!-- 3.在实例中使用组件 -->
    <greeting></greeting>
</div>

<script>
    
    // 1. 组件构造器
    let MyComponent= Vue.extend({
        // 配置对象
        // 因为组件没有挂在点,所以使用模板,只有一个根节点
        template: `
            <div>
                <p>大家好,我叫{{name}}</p>
                <button @click="changeName">点击换名字</button>
            </div>
        `,
        data: function(){
            return {
                name:"渣渣辉"
            }
        },
        methods:{
            changeName(){
                this.name = "古天乐"
            }
        }
    })

    // 2. 通过Component方法,将构造器扩展的构造函数创建组件实例
    Vue.component("Greeting",MyComponent)
    
   
   // Vue 实例
    const vm = new Vue({
        el:"#app-one",
    })

</script>

显示结果:

通过构造器创建组件.png


1.5 理解组件的创建和注册
  1. Vue.extend()是Vue构造器扩展,调用Vue.extend()创建的是一个组件构造器,而不是具体的组件实例。
  2. Vue.extend()构造器有一个选项对象,选项对象的template属性用于定义组件要渲染的HTML模板。
  3. 使用Vue.component()注册组件时,需要提供2个参数,第1个参数时组件的名,第2个参数是组件构造器。
  4. Vue.component()方法内部会调用组件构造器,创建一个组件实例。
  5. 组件应该挂载到某个Vue实例下,否则它不会生效。


1.6 Vue构造器扩展直接创建Vue实例

Vue.extend 方法相当于是对于原有的Vue 构造函数进行了扩展, 本质上核心还是Vue的构造函数,所以我们可以直接通过扩展的构造函数创建Vue实例

<div id="app"></div>
<script>
   
    // 1. 通过组件构造器扩展构造函数
    let MyComponent= Vue.extend({
        // 配置对象
        // 因为组件没有挂在点,所以使用模板,只有一个根节点
        template: `
            <div>
                <p>大家好,我叫{{name}}</p>
                <button @click="changeName">点击换名字</button>
            </div>
        `,
        data: function(){
            return {
                name:"渣渣辉"
            }
        },
        methods:{
            changeName(){
                this.name = "古天乐"
            }
        }
    })

    // 2. 通过扩展的构造函数创建Vue实例
    new MyComponent({
        el:'#app'
    })
</script>

示例说明:

  1. Vue组件其实也是Vue实例,只不过没有挂在点, 通过template处理需要渲染的DOM
  2. 但是组件实例必须有一个名字, 通过这个名字在Vue实例中使用, 通过自定定义标签方式使用组件


在vue中,一个自定义标签 vue就会把它看成一个组件,vue可以给这些标签赋予一定的意义


1.7 直接通过选项对象创建组件

其实所有的Vue的组件同时也都是Vue的实例.
所以组件可接受的相同选项对象.
因此我们在创建组件的过程中也就没有必要每次都通过构造器扩展Vue构造函数

直接把构造器的选项对象作为第二个参数传递给Vue.component就可以

示例如下:

// 创建组件
Vue.component("Greeting",{
    template: `
        <div>
            <p>大家好,我叫{{name}}</p>
            <button @click="changeName">点击换名字</button>
        </div>
    `,
    data: function(){
        return {
            name:"渣渣辉"
        }
    },
    methods:{
        changeName(){
            this.name = "古天乐"
        }
    }
})

使用组件

<div id="app-one">
    <greeting></greeting>
</div>

推荐使用这种方式创建组件.

注意事项:

  1. 组件名称不能起和HTML合法标签相同 的名字,如p,
  2. 如果组件名跟HTML合法标签同名, 会默认解析为合法的标签,
  3. 因此会将p识别为普通的标签,而不是自定义标签,因此就不会被当成组件处理, 同时还会报错


1.8 组件的分类
  1. 全局组件 : 可以声明一次在任何地方使用(一般写插件的时候全局使用的多一点)
  2. 局部组件: 必须告诉这个组件属于谁(一般用局部比较好)

那么接下来就让我们好好理解一些全局组件和局部组件的使用


2. 全局组件

通过刚才的实例,对于全局组件相信你们已经有了一定的了解

调用Vue.component()注册组件时,组件的注册是全局的,这意味着该组件可以在任意Vue示例下使用。

通过示例了解全局组件的使用


2.1 创建全局组件

通过Vue.component 方法注册全局组件, 组件名称建议使用大驼峰命名

//  在js中定义组件名时使用大驼峰式命名,
// 但是在标签html中里使用时尽量用连字符-
Vue.component('MyCom', {   
    template: `
        <div>这是全局组件的内容</div>
     `
})


2.2 创建多个Vue实例
// 实例一
new Vue({
    el:"#app-one",
})

// 实例二
new Vue({
    el:"#app-two",
})


2.3 在多个Vue实例中使用全局组件
<div id="app-one">
    <!-- 是使用组件的时候要把大驼峰转为连字符的方式使用 -->
    <my-com></my-com>
    
    <!-- 
        如果使用了如下的方式就会报错,
    -->
    <!-- <MyCom></MyCom> -->
    
    
</div>
<div id="app-two">
    <!-- 如果自定义标签里面没有嵌套内容可以写成单标签的形式 -->
    <my-com />
</div>


2.4 注意事项

相信你们看到了我们注册组件的时候使用的组件名是一个驼峰写法的方式,此时使用组件时的自定义标签中不能使用驼峰写法会报错的, 因为HTML不能识别大小写, 会将你写的<MyCom>识别为<mycom>这样就找不到组件了,因此会在控制台报错

但是我们可以在定义组件的使用使用连字符的方式定义组件名

示例代码如下:

<div id="app-two">
    <!-- 使用组件 -->
    <my-com />
</div>

<script>

    //  使用连字符定义组件名
    Vue.component('my-com', {   
        template: `
            <div>这是全局组件的内容</div>
        `
    })

    // Vue实例化
    new Vue({
        el:"#app",
    })
</script>

通过示例,我们了解了定义组件是使用连字符和驼峰命名都可以,但是在HTML标签里使用组件的使用一定只能写成连字符的方式.



关于组件名说明:

  1. 虽然在定义组件时我们可以使用连字符命名,但是不推荐,
  2. 推荐的使用方式是,定义组件使用驼峰方式, 使用组件使用连字符方法.

至于为什么, 您接着往下看.


3. 局部组件

有的时候我们并不希望组件在所有的实例中都能使用, 那么我们就可以将组件定义为局部组件

3.1 局部组件使用三步曲
  1. 创建局部配置,
  2. 注册局部组件
  3. 使用局部组件


3.2 使用构造器创建并使用局部组件

我们可以使用构造器创建局部组件,

示例代码如下:

<div id="app-one">
    <!-- 3. 在注册了局部组件的实例中使用局部组件 -->
    <my-component></my-component>

</div>
<div id="app-two">
    <!-- 当前的这个实例并没有注册局部组件,所以会报错 -->
    <my-component></my-component>
</div>


<script>
    // 1. 使用构造器创建组件配置
    let MyComponent = Vue.extend({
        template: `
            <div>
                <h2>我想被创建为局部组件</h2>
            </div>
        `,

    })


    // 注册局部组件的实例
    const vm = new Vue({
        el:"#app-one",
        
        // 2. 注册为只能在当前实例中使用的局部组件
        components: {
            "my-component": MyComponent
        }

    })

    // 没有注册局部组件的实例
    new Vue({
        el:"#app-two",
    })
</script>

示例说明:

  1. 通过extend方法创建Vue构造器
  2. 在Vue选项对象中,通过components选项将构造器创建为局部组件,
  3. components选项值是一个对象,对象的属性是组件的名称,值是将要被创建为组件的构造器或选项对象
  4. 没有注册局部组件的实例对象是不能使用其它实例中的局部组件,

因此示例的实例中app-two中是不能使用组件my-component的,会报错


3.3 直接通过选项对象来创建组件

前一小节有讲过我们可以直接将选项对象注册为全局组件, 同样的我们也可以直接将选项对象注册为局部组件,Vue内部会将选项对象进行处理

示例代码如下:

<div id="app-one">
    <!-- 3. 在注册了局部组件的实例中使用局部组件 -->
    <my-component></my-component>
</div>


<script>
    // 1. 创建局部组件的选项对象
    let MyComponent = {
        template: `
            <div>
                <h2>我想被创建为局部组件</h2>
            </div>
        `,

    }


    const vm = new Vue({
        el:"#app-one",
        // 2. 将选项对象注册为局部组件
        components: {
            "my-component": MyComponent
        }

    })


</script>

通过对比我们就会发现直接将选项对象注册为局部组件要来的简单一点,所以推荐使用选项对象创建组件的方式,无论是全局组件还是局部组件

这种使用选项对象直接注册为组件的方式被称作为组件注册语法糖

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342