本文重点:

如何注册全局组件;
如果注册局部组件;
在标签上挂载组件。

使用组件的原因:提高代码的复用性。

如果你不是很理解组件的话,那么你可以把组件理解为一块块的“积木”。

在你用积木搭一个机器人的时候,那一块块的积木,就是一个个的组件。


一、全局注册组件

<div class="app"><my-component></my-component>  // app 中使用组件,组件的名字是 my-component
</div>Vue.component('my-component', {  // 注意:全局组件应该在 Vue 实例之前就注册好template: '<h1>当一阵风吹来</h1>'  // template: 模板,当使用这个组件时,就会渲染模板中的内容
})var app = new Vue({el: '.app',data: {}
})

先说为什么全局组件要在 Vue 实例之前就注册好?

在上面这个例子中,app 这个 Vue 实例中,使用了 my-component 全局组件。如果 my-component 是在 app 之后注册,那么当 app 挂载到页面时,my-component 还没有注册,那么自然 app 中就不能使用 my-component 这个组件了。

如果 my-component 在 app 之后注册,控制台中会报错:

像上面代码中将 my-component 在 app 之前注册,是正确的做法,页面会这样渲染:

上图中,因为组件的 template 中,就是 h1 标签,所以会渲染 h1 标签。

全局组件有什么好处呢?

那就是所有的 Vue 实例中,都可以使用这个组件。

<div class="app">  <my-component></my-component>  // app 中使用了 my-component
</div><div class="bpp"><my-component></my-component>  // bpp 中也使用了 my-component
</div>Vue.component('my-component', {template: '<h1>当一阵风吹来</h1>'
})var app = new Vue({el: '.app',data: {}
})var bpp = new Vue({el: '.bpp',data: {}
})

页面渲染:

app 和 bpp 中都有 h1 标签。


二、局部注册组件

所谓局部注册,就是说在某个 Vue 实例中注册,而不在全局注册。那么同理,局部注册的组件,只能在当前 Vue 实例中使用。

比如说,在 app 这个 Vue 实例中注册的组件,只能在 app 中使用,不能在 bpp 或者 cpp 中使用。

<div class="app"><my-component></my-component>
</div>var app = new Vue({el: '.app',data: {},components: {  // 和全局注册不同,全局注册是 component,而这里是 components,因为可能有很多个组件'my-component': {template: '<h2>风筝有风,海豚有海</h2>'}}
})

渲染效果:

那我们来试试,如果在 bpp 中使用会怎样?

<div class="app"><my-component></my-component>
</div><div class="bpp"><my-component></my-component>  // bpp 中使用了 my-component
</div>var app = new Vue({el: '.app',data: {},components: {'my-component': {template: '<h2>风筝有风,海豚有海</h2>'}}
})var bpp = new Vue({el: '.bpp',data: {}
})

如上代码中,my-component 是在 app 中注册的,本应在 app 中使用,可是 bpp 中也使用了 my-component 。那么现在会如何渲染呢:

注:报错信息没有截取全部

可以看到,app 还是正常渲染。而 bpp 中,h2 标签没有被渲染,仍然显示 <my-component>,并且控制台也报错了。


三、挂载组件

有些标签,它里边只能写特定的标签,不可以或者不推荐写其他标签。

比如:table 中最好就写 tr、td;ul 和 ol 中只写 li 标签。

当然,如果你不遵守这些,浏览器仍然可能帮你正确显示出来,但这样可能会给浏览器增加不必要的负担。而且,不遵守规范这件事,总归是不好的。

可如果我们就是要在这些标签中使用组件呢,从上面的例子来看,在标签中写的组件,是长的这个鬼样子:

这tm是个标签吗?

这不是 HTML 中的标签,这是我们自定义的标签,Vue 允许我们这么做。

回到之前那个问题,比如我要在 table 中使用 my-component 咋办?

如果是像下面这样写:

<div class="app"><table><my-component></my-component>  // table 中直接使用 my-component 标签</table></div>var app = new Vue({el: '.app',data: {},components: {'my-component': {template: '<h2>风筝有风,海豚有海</h2>'}}
})

渲染效果:

乍一看好像没毛病,可是仔细一看,h2 标签怎么跑到 table 标签外面去了??

因为我们之前说过了,table 标签里边,tm 不能写 <my-component>,只能写 tr、td、tbody 这种。

所以我们应该像下面这样:

<div class="app"><table><tr is="my-component"></tr>  // table 中写的是 tr,用 is 属性把 my-component 挂载到 tr</table></div>var app = new Vue({el: '.app',data: {},components: {'my-component': {template: '<h2>风筝有风,海豚有海</h2>'}}
})

渲染效果:

现在,h2 标签是在 table 标签之中了。

如果你不理解上面 is 属性挂载的话,那么你就这么理解:

table 里边是 tr 没错,而 tr 其实 是(is) my-component 组件。

不挂载 组件渲染_12、全局组件和局部组件相关推荐

  1. 不挂载 组件渲染_让你的 React 组件性能跑得再快一点「实践」

    作者:天泽 转发链接:https://www.zoo.team/article/react-render 性能和渲染(Render)正相关 React 基于虚拟 DOM 和高效 Diff 算法的完美配 ...

  2. vue 组件不受全局样式影响_Vue 组件之间样式冲突

    Vue 组件之间样式冲突 vue 组件化,各组件内都可以在 style 部分写样式,这些样式却不是相互独立的,最终组合在一起,难免就会产生样式的污染. 首先来看一下两个 vue 组件代码: 1.Par ...

  3. vue 组件不受全局样式影响_组件库引入全局样式lib/style/index.css,会污染全局基础样式...

    I have searched the issues of this repository and believe that this is not a duplicate. Version 1.3. ...

  4. Vue3(撩课学院)笔记02-创建组件,全局组件,局部组件,父子组件,组件标签化,组件的data数据共享,组件间通讯,props,父传子$ref,子传父$parent

    1.创建一个组件 首先要创建一个根组件进行挂载 再创建一个子组件,完成子组件的逻辑 子组件主要使用template模板来完成布局和逻辑 把子组件通过根组件.component的方法挂载到根组件上 &l ...

  5. vue 组件 全局组件和局部组件component

    1.全局组件 <!DOCTYPE html> <html><head><meta charset="UTF-8"><title ...

  6. vite+ts+vue3 知识点(全局组件,局部组件,递归组件)

    全局组件 Global.vue 文件 <template><div>全局组件</div> </template><script setup lan ...

  7. -组件基础-局部组件 // 局部组件的简写

    -组件基础-局部组件 <!DOCTYPE html> <html lang="en"><head><meta charset=" ...

  8. Vue组件之全局组件与局部组件

    组件 (Component) 是 Vue.js 最强大的功能之一.组件可以扩展 HTML 元素,封装可重用的代码.在较高层面上,组件是自定义元素,Vue.js 的编译器为它添加特殊功能.在有些情况下, ...

  9. 在Vue组件中获取全局的点击事件

    使用场景: 在Vue组件中点击某元素之外的地方移除该元素 需求: 如上图所示,"用户列表"页面有三个Vue组件组成,分别是"菜单组件","导航组件&q ...

  10. 「后端小伙伴来学前端了」Vue中利用全局事件总线实现组件之间通信

    月亮啊月亮 你能照见南边,也能照见北边 照见她,你跟她说一声,就说我想她了. 前言 前一篇文章写了 vue 中利用 Props 实现组件之间的通信,那种方式是最简单也是最基础的组件之间的通信方式.父组 ...

最新文章

  1. php-fpm 进程通讯,PHP-FPM进程模型解析
  2. 设计模式-创建型模式-建造者模式
  3. pcb外观维修_电路板常用维修技巧,送给从事维修工作的兄弟姐妹们
  4. python字符串内建函数详解
  5. 【Linux】一步一步学Linux——printf命令(204)
  6. 同步轨道进入过程_“收官之星”定点成功!北斗三号卫星全部进入长管模式
  7. 自己常用的LINUX命令(20100605更新)
  8. radl (三) (转)
  9. 《CCNA原创视频教程》【转贴】
  10. 阿里笔试2020/9/4
  11. jQuery的ajax教程
  12. 开发“小米商城官网首页”(静态页面)
  13. PHP内裤,用sqlmap来扒下她的内裤吧~
  14. 【论文翻译】Many-Class Few-Shot Learning on Multi-Granularity Class Hierarchy
  15. Anaconda创建虚拟环境时报错 InvalidArchiveError Error with archive D:\\(anaconda的路径)\\pkgs\\vs2015_runtime
  16. 多CPU 多核CPU | 多进程 多线程 | 并行 并发
  17. Android开发的经典入门教材和学习…
  18. 域名(DNS)原理及解析过程详解
  19. border-radius 构建规则讲解 及 50% 和 100% 的异同
  20. 微信小程序|基于小程序实现人脸数量检测

热门文章

  1. jdk8升级jdk11报 java.lang.ClassNotFoundException: javax.xml.bind.JAXBException
  2. React五——React-router
  3. 微信小程序开发的完整人性化版攻略
  4. iOS-----用LLDB调试,让移动开发更简单(二)
  5. iOS / OXS LeanCloud云存储方案简单测试记录
  6. [MySQL] - MySQL的Grant命令
  7. 最小堆实现优先队列:Python实现
  8. 在SUSE 10下安装oracle 11g
  9. “做人难,人难做,难做人,做男人更难啊!
  10. 袋鼠天气 v1.1 发布:增加下拉刷新获取实时天气数据