当前位置: 首页 > news >正文

孙卫琴的《精通Vue.js》读书笔记-注册全局组件和局部组件

本文参考孙卫琴,杜聚宾所创作的 <<精通Vue.js: Web前端开发技术详解>>一书
在这里插入图片描述
普通Vue组件按照使用范围,可以分为两种:
(1)全局组件:通过Vue应用实例的component()方法注册,可以直接被其他Vue组件访问。
(2)局部组件:只有父组件通过components选项注册了一个局部组件,父组件才能访问该局部组件。

无论是全局组件还是局部组件,都具有data、methods、computed和watch等选项,而且和根组件一样,也具有类似的生命周期以及生命钩子函数。

1.注册全局组件

全局组件可以直接被其他Vue组件访问。例程1的global.html通过Vue应用实例的component()方法注册了一个名为“counter”的全局组件,在根组件的模板中,插入了三个组件,由此可见,组件可以被多次重用。

例程1 global.html

    <div id="app">
      <p>计数器1:<counter></counter> </p>
      <p>计数器2:<counter></counter> </p>
      <p>计数器3:<counter></counter> </p>
    </div>

    <script>
      const app=Vue.createApp({ })

      //注册一个名为counter的组件
      app.component('counter', {
        data() {
          return {   count: 0  }
        },
        template: '<button @click="count++">{{ count }} 次</button>'
      })
      app.mount('#app')
   </script>

通过浏览器访问global.html,会得到如图1所示的网页。多次点击网页上的三个按钮,会看到每个计数器的取值都不一样。这是因为每个组件都有独立的count变量。
在这里插入图片描述

图1 global.html的网页

在例程2的globalscope.html中,有两个全局组件和。组件插入到组件的模板中,组件又插入到根组件的模板中。

例程2 globalscope.html

    <div id="app">
      <wrapper></wrapper>
    </div>

    <script>
      const app=Vue.createApp({ })

      //定义一个名为counter的组件
      app.component('counter', {
        data() {
          return {   count: 0  }
        },
        template: '<button @click="count++">{{ count }} 次</button>'
      })

      //定义一个名为wrapper的组件
      app.component('wrapper', {
        template: `<p>计数器1:<counter></counter></p>
                     <p>计数器2:<counter></counter></p>
                     <p>计数器3:<counter></counter></p>`
      })
      app.mount('#app')
   </script>

在JavaScript中,单行字符串可以用符号“'”或“”来引用。如果是多行字符串,只能用符号“”来引用。例如globalscope.html中组件的template选项的模板字符串就用符号“`”来引用。

2.注册局部组件

在介绍局部组件之前,先分析全局组件的优势和劣势,从而揭示Vue引入局部组件的必要性和它的优势。全局组件可以直接插入到其他组件的模板中,这使得其他组件可以很方便地访问全局组件。但是全局组件也有一个弊端:当浏览器访问一个网页时,会把所有全局组件的代码也下载到客户端。假定某个网页并不包含所有的全局组件,那么下载所有全局组件的代码是多余的,会给网络传输带来额外的负担,降低网站的访问性能。

为了克服全局组件的弊端,Vue引入了局部组件,局部组件只有在需要被访问的情况下才会下载到客户端,这样就能减轻网络的传输负荷,提高网站的访问性能。

定义以及注册局部组件的步骤如下。
(1)定义局部组件的内容,例如以下代码定义了三个变量,它们分别表示三个局部组件的内容:

const ComponentA = {
  /* ... */
}
const ComponentB = {
  /* ... */
}
const ComponentC = {
  /* ... */
}

(2)在需要访问局部组件的父组件中通过components选项来注册局部组件。例如以下代码在根组件中注册了三个局部组件,这三个局部组件仅对根组件可见,因此根组件就是这三个局部组件的父组件:

const app = Vue.createApp({
  components: {   //根组件的components选项
    'component-a': ComponentA,
    'component-b': ComponentB,
    'component-C': ComponentC,
  }
})

例程3的local.html演示了局部组件的基本用法。在local.html中,根组件作为父组件,注册了一个子组件“counter”,在根组件的模板中就能使用这个子组件。

例程3 local.html

    <div id="app">
      <p>计数器1:<counter></counter></p>
      <p>计数器2:<counter></counter></p>
      <p>计数器3:<counter></counter></p>
    </div>

    <script>
      //定义一个局部组件的内容
      const localComponent={
        data() {
          return {   count: 0  }
        },
        template: '<button @click="count++">{{ count }} 次</button>'
      }

      const app=Vue.createApp({
        components: {  //注册counter局部组件
          'counter' : localComponent  
        }
      })

      const vm=app.mount('#app')
   </script>

局部组件只有注册到一个父组件中,才能被这个父组件访问。例如在以下代码中,组件ComponentBase中注册了组件ComponentSub,组件ComponentBase就是组件ComponentSub的父组件,在组件ComponentBase的模板中就能插入组件ComponentSub:

const ComponentSub = {
  /* ... */
}

const ComponentBase = {
  components: {  //注册ComponentSub组件
    'ComponentSub': ComponentSub
  },
  template: '<ComponentSub></ComponentSub>'
}

在例程4的localscope.html中,是局部组件,是全局组件。

例程4 localscope.html

    <div id="app">
      <wrapper />
    </div>

    <script>
      //定义一个局部组件的内容
      const localComponent={……}

      const app=Vue.createApp({
        components: {  //注册counter局部组件,仅对根组件可见
          'counter' : localComponent  
        }
     })
    
      //定义一个名为wrapper的全局组件
      app.component('wrapper', {
        template: `<p>计数器1:<counter></counter> </p>
                     <p>计数器2:<counter></counter> </p>
                     <p>计数器3:<counter></counter> </p>`
      })
      const vm=app.mount('#app')
   </script>

尽管在根组件中注册了组件,但是在组件中并没有注册组件。组件的模板试图插入组件,这会导致Vue在编译组件的模板时产生错误。修改这个错误的方法是在组件中先注册组件:

      app.component('wrapper', {
        components: {  //注册counter局部组件,仅对<wrapper>组件可见
          'counter' : localComponent  
        },  
        ……
      })

相关文章:

  • 28、iNeRF
  • 相关性 与 独立性
  • set和map的模拟
  • window环境下安装大数据环境
  • 解决navicat premium连接数据库自动断开问题
  • 学历提升中的我,入职产品经理之路
  • 网络安全专家,这5本入门秘籍人手一套
  • 智源AI日报(2022-08-30): 华为谢凌曦:关于视觉识别领域发展的个人观点
  • 示波器十大基础知识你都了解多少
  • 【经典算法学习-排序篇】冒泡排序
  • Nacos系列【26】源码分析篇之客户端自动注册
  • DBeaver常用快捷键(含复制当前行)
  • Java ThreadPoolExecutor的拒绝策略
  • 操作系统——磁盘操作
  • DSPE-PEG-FSHB,FSHB-PEG-DSPE,磷脂-聚乙二醇-靶向多肽FSHB
  • Android开发 - 掌握ConstraintLayout(四)创建基本约束
  • Apache Spark Streaming 使用实例
  • C学习-枚举(九)
  • docker python 配置
  • HTTP那些事
  • java B2B2C 源码多租户电子商城系统-Kafka基本使用介绍
  • k个最大的数及变种小结
  • laravel with 查询列表限制条数
  • React Transition Group -- Transition 组件
  • RxJS: 简单入门
  • swift基础之_对象 实例方法 对象方法。
  • Vue 重置组件到初始状态
  • 浮动相关
  • 如何用Ubuntu和Xen来设置Kubernetes?
  • 入口文件开始,分析Vue源码实现
  • 鱼骨图 - 如何绘制?
  • 3月27日云栖精选夜读 | 从 “城市大脑”实践,瞭望未来城市源起 ...
  • const的用法,特别是用在函数前面与后面的区别
  • LIGO、Virgo第三轮探测告捷,同时探测到一对黑洞合并产生的引力波事件 ...
  • 仓管云——企业云erp功能有哪些?
  • ​【原创】基于SSM的酒店预约管理系统(酒店管理系统毕业设计)
  • ​云纳万物 · 数皆有言|2021 七牛云战略发布会启幕,邀您赴约
  • # Apache SeaTunnel 究竟是什么?
  • #、%和$符号在OGNL表达式中经常出现
  • #ubuntu# #git# repository git config --global --add safe.directory
  • $Django python中使用redis, django中使用(封装了),redis开启事务(管道)
  • (16)Reactor的测试——响应式Spring的道法术器
  • (delphi11最新学习资料) Object Pascal 学习笔记---第2章第五节(日期和时间)
  • (LeetCode 49)Anagrams
  • (九)One-Wire总线-DS18B20
  • (论文阅读31/100)Stacked hourglass networks for human pose estimation
  • (十一)手动添加用户和文件的特殊权限
  • (小白学Java)Java简介和基本配置
  • (原創) 如何動態建立二維陣列(多維陣列)? (.NET) (C#)
  • (转)http-server应用
  • (转)Linux整合apache和tomcat构建Web服务器
  • (轉貼)《OOD启思录》:61条面向对象设计的经验原则 (OO)
  • .bat批处理(二):%0 %1——给批处理脚本传递参数
  • .Net - 类的介绍
  • .NET/ASP.NETMVC 深入剖析 Model元数据、HtmlHelper、自定义模板、模板的装饰者模式(二)...