前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Vue 组件基础

Vue 组件基础

作者头像
RiemannHypothesis
发布2022-11-05 16:58:15
2930
发布2022-11-05 16:58:15
举报
文章被收录于专栏:ElixirElixir

组件基础

什么是组件

需求: 如果页面中有多个一样结构的控件,比如

代码语言:javascript
复制
<div id="app">
    <!-- 页面中有多个一样结构的标签: span+button -->
        <span>{{count1}}</span> <button @click="changeCount1">按钮</button> <br>
        <span>{{count2}}</span> <button @click="changeCount2">按钮</button> <br>
        <span>{{count3}}</span> <button @click="changeCount3">按钮</button> <br>
        <span>{{count4}}</span> <button @click="changeCount4">按钮</button> <br>
        <span>{{count5}}</span> <button @click="changeCount5">按钮</button> <br>
</div>
<script src="./vue.js"></script>
<script>
    new Vue({
        el: '#app',
        data: {
            count1: 0,
            count2: 0,
            count3: 0,
            count4: 0,
            count5: 0
        },
        methods: {
            changeCount1() {
                this.count1++;
            },
            changeCount2() {
                this.count2++;
            },
            changeCount3() {
                this.count3++;
            },
            changeCount4() {
                this.count4++;
            },
            changeCount5() {
                this.count5++;
            }
        }
    });
</script>

问题:

  1. 代码重复 冗余
  2. 不利于维护

解决方案: 使用Vue中一个十分重要的特性-组件

体验组件的使用

代码语言:javascript
复制
<div id="app">
    <!-- 2. 使用组件 -->
    <span-btn></span-btn>
    <span-btn></span-btn>
    <span-btn></span-btn>
    <span-btn></span-btn>
</div>
<script src="./vue.js"></script>
<script>
    // 注册全局组件
    Vue.component('span-btn', {
        template: `
<div>
<span>{{count}}</span> 
<button @click="changeCount">按钮</button>
    </div>
`,
        data() {
            return {
                count: 0
            }
        },
        methods: {
            changeCount() {
                this.count++;
            }
        }
    });
​
    new Vue({
        el: '#app'
    });
</script>

什么是组件:

组件系统是 Vue 的另一个重要概念,允许我们使用小型、独立和通常可复用的组件构建大型应用。

仔细想想,几乎任意类型的应用界面都可以抽象为一个组件树:

例如,你可能会有页头、侧边栏、内容区等组件,每个组件又包含了其它的像导航链接、博文之类的组件。

  • 组件是可复用的 Vue 实例,且带有一个名字
  • 组件的选项:
    • 组件与 new Vue 接收相同的选项:例如 datacomputedwatchmethods 以及生命周期钩子等。
    • 仅有的例外是像 el 这样根实例特有的选项
  • 另外, 组件也有自己的选项 template components等

组件的特点

  • 组件是一种封装
  • 组件能够让我们复用已有的html、css、js
  • 可复用
  • 是一个特殊的Vue实例
  • 可以任意次数的复用
  • 每用一次组件,就会有一个它的新实例被创建
  • 组件中的data要求必须是一个函数,且需要返回一个对象
    • 组件有自己的作用域
  • template 每个组件模板有且只有一个根元素

建议: 在实际开发中,尽可能使用各种第三方组件

组件的分类和使用

  • 分类: 全局注册和局部注册
  • 使用(步骤): 1. 注册组件 2. 通过组件名字使用组件
全局注册
  1. 使用Vue.component(组件名,组件选项) 进行注册 组件名:推荐小写加减号的命名方式
  2. 用在其被注册之后的任何 (通过 new Vue) 新创建的 (一个或者多个)Vue 实例
代码语言:javascript
复制
      Vue.component('组件名', {
            // 组件选项: data methods template等(没有el)
            // data 的值是一个函数, 需要返回一个对象
      });
代码语言:javascript
复制
<div id="app">
    <!-- 2. 使用组件 -->
    <span-btn></span-btn>
    <span-btn></span-btn>
    <span-btn></span-btn>
    <span-btn></span-btn>
</div>
<hr>
<div id="app1">
    <span-btn></span-btn>
    <My-Component></My-Component>
</div>
<hr>
<div id="app2">
    <span-btn></span-btn>
​
</div>
<hr>
<div id="app3">
    <span-btn></span-btn>
</div>
<script src="./vue.js"></script>
<script>
    // 1. 注册组件
    // Vue.component('组件名', {
    //     // 组件选项: data methods template等
    // });
    Vue.component('span-btn', {
        // template: 页面字符串,有且仅有一个根元素
        template: `
<div>
<span>{{count}}</span> 
<button @click="changeCount">按钮</button>
    </div>
`,
        data() {
            return {
                count: 0
            }
        },
        methods: {
            changeCount() {
                this.count++;
            }
        }
    });
​
    Vue.component('myComponent', {
        template: `
<div>
<h1>{{num}}</h1> 
<button @click="changeTitle">按钮</button>
    </div>
`,
        style: './style.css',
        data() {
            return {
                num: 0
            }
        },
        methods: {
            changeTitle() {
                this.num++;
            }
        }
    });
​
    new Vue({
        el: '#app'
    });
​
    new Vue({
        el: '#app1'
    });
    new Vue({
        el: '#app2'
    });
    new Vue({
        el: '#app3'
    });
</script>

注意:

  1. 全局组件必须写在Vue实例创建之前,才在该根元素下面生效
  2. 在不同的Vue实例中可以使用多个不同的全局组件
  3. 每个组件有自己的作用域
局部注册
  • 直接在Vue实例里面通过 components选项进行注册
  • 对于 components 对象中的每个属性来说,
    • 其属性名就是自定义元素的名字,其属性值就是这个组件的选项对象。
代码语言:javascript
复制
<!DOCTYPE html>
<html lang="en">
​
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>Document</title>
    </head>
​
    <body>
        <div id="app">
            <!-- 2 使用组件 -->
            <com-A></com-A>
            <com-B></com-B>
            <com-C></com-C>
        </div>
        <script src="./vue.js"></script>
        <script>
            // 局部组件的选项
            const comA = {
                template: `<div>{{titleA}}</div>`,
                data() {
                    return {
                        titleA: 'comA中的data里的titleA'
                    }
                }
            };
            const comB = {
                template: `<div>{{titleB}}</div>`,
                data() {
                    return {
                        titleB: 'comB中的data里的titleB'
                    }
                }
            };
​
            const comC = {
                template: `<div>{{titleC}}</div>`,
                data() {
                    return {
                        titleC: 'comC中的data里的titleC'
                    }
                }
            };
​
            new Vue({
                el: '#app',
                // 1. 在Vue实例中设置components选项{组件名:组件选项}
                components: {
                    // 在页面中的组件名:组件选项
                    'comA': comA,
                    'comB': comB,
                    'comC': comC
                }
            });
        </script>
    </body>
​
</html>

组件嵌套

我们可以在new Vue()实例中使用自定义组件, 也可以在注册自定义组件时,嵌套另一个自定义组件,也就是父子组件的关系

父子组件-写法一
代码语言:javascript
复制
<div id="app">
    <!-- 2. 通过组件名使用组件 -->
    <parent-Com></parent-Com>
</div>
<script src="./vue.js"></script>
<script>
    // 1. 注册全局组件
    Vue.component('childCom', {
        template: `
<div>
<h1>childCom全局组件</h1>
    </div>
`
    });
​
    Vue.component('parentCom', {
        // 在parentCom中嵌入childCom组件
        // parentCom和childCom属于父子组件
        // 父组件是parentCom
        // 子组件是childCom
        template: `
<div>
<h1>parentCom全局组件</h1>
<child-Com></child-Com>
    </div>
`
    });
​
    new Vue({
        el: '#app'
    });
</script>
父子组件-写法二
代码语言:javascript
复制
<div id="app">
    <!-- 2. 通过组件名使用组件 -->
    <parent-Com></parent-Com>
</div>
<script src="./vue.js"></script>
<script>
    // 1. 局部组件的选项
    const childCom = {
        template: `
<div>
<h1>childCom局部组件</h1>
    </div>
`
    };
​
    // 在parentCom组件选项中 使用components选项设置其子组件
    // 在template中使用该子组件
    const parentCom = {
        template: `
<div>
<h1>parentCom局部组件</h1>
<child-Com></child-Com>
    </div>
`,
        components: {
            'childCom': childCom
        }
    };
​
    new Vue({
        el: '#app',
        components: {
            'parentCom': parentCom
        }
    });
</script>
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-10-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 组件基础
    • 什么是组件
      • 组件的特点
        • 组件的分类和使用
          • 全局注册
          • 局部注册
        • 组件嵌套
          • 父子组件-写法一
          • 父子组件-写法二
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档