概念

Vue遵循Web Component规范,提供了自己的组件系统。组件是一段独立的代码,代表页面中某个功能块,拥有自己的数据、JS、样式,以及标签。组件的独立性是指形成自己独立的作用域,不会对其它组件产生任何副作用。

Vue 组件是可复用 Vue 实例,接受相同的选项option对象 (除了一些根级特有的选项) 和使用相同的生命周期钩子,以及模板调用方式。

Vue 组件可以嵌套,所以组件之间可以进行引用和通信

组件定义

Vue提供了专用的API来定义组件,组件构造器函数: Vue.extend()

    const MyComponent = Vue.extend(option)
// option跟new Vue(option)时基本相同(除了el/data)

这样,我们就构建好了一个组件,但现在还无法使用这个组件。还需要将这个组件注册到对应的应用中。

组件的注册

为了能在模板中使用,这些组件必须注册以便 Vue 能够识别。有两种注册方式:全局注册和局部注册

全局注册

使用API:Vue.component就可以完成组件全局注册,全局注册的组件可以被多个Vue实例复用。

Vue.component('my-component', MyComponent)
// 组件注册语句必须在new Vue(option)之前

局部注册

使用Vue实例的components属性注册局部组件,局部注册的组件只在包含它的父组件作用域内有效。

const MyChild = Vue.extend({
template: `<p>{{ childMsg }}</p>`
data: function() {
return {
childMsg: 'This is a child component'
}
}
}) const vm = new Vue({
el: "#app",
data: {
msg: 'This is a parent component'
},
components: {
MyChild: MyChild
}
})

上述Child组件只在vm实例内有效。在其它新建的实例内无法引用。

注册语法糖

Vue对全局注册和局部注册都提供了简写方法,可以在注册的同时定义组件,Vue内部会自动调用extend方法构建组件。

Vue源码解读之Component组件注册

// 全局注册
Vue.component('MyChild', {
template: `<p>{{ childMsg }}</p>`
data: function() {
return {
childMsg: 'This is a child component'
}
}
}) // 局部注册
new Vue({
el: "#app",
data: {
msg: 'This is a parent component'
},
components: {
MyChild: {
template: `<p>{{ childMsg }}</p>`
data: function() {
return {
childMsg: 'This is a child component'
}
}
},
}
})

组件的使用

在注册组件同时,也声明了一个自定义标签,即组件名。在Vue模板需要调用的地方使用组件名作为自定义的标签,直接调用组件。

<My-Child></My-Child>

注意事项:

option的区别

const MyChild = Vue.extend(option)
const vm = new Vue(option)
  • data必须是一个函数

    因为组件是可复用的,如果组件的data是一个对象的直接引用,那复用多个组件将共享一个对象,其中一个组件修改了对象属性,其它组件引用了该对象属性的值也会变化,这是我不希望看到的。而通过函数返回值,将实现每个组件拥有独立的数据对象。

    点击查看官方示例解释
new Vue({
el: "#app",
data: {
msg: 'This is a parent component'
},
components: {
MyChild: {
template: `<p>{{ childMsg }}</p>`
data: function() {
return {
childMsg: 'This is a child component'
}
}
},
}
})

解析 DOM 模板时的注意事项

有些 HTML 元素,诸如 <ul><ol><table><select>,对于哪些元素可以出现在其内部是有严格限制的。而有些元素,诸如 <li><tr><option>,只能出现在其它某些特定的元素内部。

这会导致我们使用这些有约束条件的元素时遇到一些问题。例如:

<table>
<blog-post-row></blog-post-row>
</table>

这个自定义组件 会被作为无效的内容提升到外部,并导致最终渲染结果出错。幸好这个特殊的 is 特性给了我们一个变通的办法:

<table>
<tr is="blog-post-row"></tr>
</table>

需要注意的是如果我们从以下来源使用模板的话,这条限制是不存在的:

组件的命名规范

官方组件命名风格指南

  • 在JS域中使用PascalCase,在DOM模板域中使用kebab-case
  • 以父组件或更高级别的单词开头,使用语义完整的单词
  • 由于 HTML 是大小写不敏感的,在 DOM 模板中必须使用 kebab-case
  • 在 JavaScript 中,PascalCase 是类和构造函数 (本质上任何可以产生多份不同实例的东西) 的命名约定,Vue 组件也可以有多份实例,所以同样使用 PascalCase 是有意义的。

点击查看DEMO

<div id="app">
<p>{{ msg }}</p>
<com-local></com-local>
<com-global></com-global>
</div>
<p>=================================</p>
<div id="other">
<p>{{ msg }}</p>
<com-other-local></com-other-local>
<com-global></com-global>
</div>
// 使用构造器函数定义组件
const ComLocal = Vue.extend({
data: function() {
return {
msg: 'This is a local component'
}
},
template: `<p>{{ msg }} by Vue.extend</p>`
}) // 全局注册组件,并且必须在new Vue()之前
Vue.component('ComGlobal', {
data: () => {
return {
msg: 'this is a global component'
}
},
template: `<p>{{ msg }} by Vue.component`
}) // 创建一个Vue 实例对象vm,调用全局组件和使用extend定义的局部组件
const vm = new Vue({
el: "#app",
data: {
msg: 'This is a vm'
},
components: {
ComLocal
} }) // 创建另一个Vue实例对象otherVm,调用全局组件和使用内部components属性定义的局部组件
const otherVm = new Vue({
el: '#other',
data: {
msg: 'This is other Vue'
},
components: {
comOtherLocal: {
template: `<p>This is a local component by components properity</p>`
}
}
})
// 输出
This is a vm
This is a local component by Vue.extend
this is a global component by Vue.component
=================================
This is other Vue
This is a local component by components properity
this is a global component by Vue.component

vue-learning:25 - component - 概念-定义-注册-使用-命名的更多相关文章

  1. vue学习—组件的定义注册

    组件的定义注册 效果: 方法一: <div id="box"> <v-header></v-header> <hr /> <b ...

  2. 品Spring:负责bean定义注册的两个“排头兵”

    别看Spring现在玩的这么花,其实它的“筹码”就两个,“容器”和“bean定义”. 只有先把bean定义注册到容器里,后续的一切可能才有可能成为可能. 所以在进阶的路上如果要想走的顺畅些,彻底搞清楚 ...

  3. 品Spring:SpringBoot发起bean定义注册的“二次攻坚战”

    上一篇文章整体非常轻松,因为在容器启动前,只注册了一个bean定义,就是SpringBoot的主类. OK,今天接着从容器的启动入手,找出剩余所有的bean定义的注册过程. 具体细节肯定会颇为复杂,同 ...

  4. vue学习指南:第六篇(详细) - Vue的组件 component

    1. 什么是组件?有两种解释 1. 第一种解释: 什么是组件? 1. 组件是 vue 中的一个可复用的实例,所以new Vue() 是vue中最大的那个组件(根组件),有名字,使用的时候以单标签或双标 ...

  5. [DOM Event Learning] Section 2 概念梳理 什么是事件 DOM Event

    [DOM Event Learning] Section 2 概念梳理 什么是事件 DOM Event   事件 事件(Event)是用来通知代码,一些有趣的事情发生了. 每一个Event都会被一个E ...

  6. 为什么VUE注册组件命名时不能用大写的?

    这段时间一直在弄vue,当然也遇到很多问题,这里就来跟大家分享一些注册自定义模板组件的心得 首先"VUE注册组件命名时不能用大写"其实这句话是不对的,但我们很多人开始都觉得是对的, ...

  7. react router @4 和 vue路由 详解(四)vue如何在路由里面定义一个子路由

    完整版:https://www.cnblogs.com/yangyangxxb/p/10066650.html 6.vue如何在路由里面定义一个子路由? 给父路由加一个 children:[] 参考我 ...

  8. 第六章 组件 59 组件切换-使用Vue提供的component元素实现组件切换

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8&quo ...

  9. Vue Login Form Component

    Vue Login Form Component Account Login <template> <div> <slot></slot> <el ...

随机推荐

  1. Directx教程(29) 简单的光照模型(8)

    原文:Directx教程(29) 简单的光照模型(8)      现在我们新建一个工程myTutorialD3D_23,在这个工程中,对前面一章的代码进行一些整理: 1.我们在顶点属性中增加材质的的漫 ...

  2. oralce Sysdba和sysoper的区别

    Sysdba是一个允许读者执行任何数据库任务的全能特权.Sysoper是一个威力次之的特权,它赋予了启动和关闭能力,但限制其他管理性任务

  3. pycharm 永久注册

    pycharm 使用又到期了,找到了破解版亲测(到期日期2099/12/31),绝对简单好用,直接使用步骤: 一,下载pycharm(windows版):  https://www.jetbrains ...

  4. 2019-3-21-win10-uwp-修改图片质量压缩图片

    title author date CreateTime categories win10 uwp 修改图片质量压缩图片 lindexi 2019-03-21 15:29:20 +0800 2019- ...

  5. python HTTP请求过程

  6. @codeforces - 1161F@ Zigzag Game

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定一个 2n 个结点的完全二分图,1~n 在左边,n+1~2n ...

  7. css的两栏布局

    经典的实现左边固定宽度,右边宽度自适应的几种方法 利用float和margin-left属性(margin-left的值可以稍稍大于或者等于.left的宽度) .left{ width: 30px; ...

  8. SQL if语句简要

    if语句 可以作为表达式用 可以在存储过程中作为流程控制语句用 表达式 IF(条件,条件true,条件false) 示例 sex字段m,f 互换 update salary set sex = if( ...

  9. 逗号分隔的字符串转换为Python中的列表 split

    将逗号分隔的字符串转换为Python中的列表   给定一个字符串: 它是由逗号分隔的几个值的序列: mStr = '192.168.1.1,192.168.1.2,192.168.1.3' 如何将字符 ...

  10. Python深入:Distutils安装包

    一:简介 尽管Python标准库已经支持很多的功能,但是有时还是会需要以第三方模块的形式添加新的功能到Python中. 在最简单的场景中,是你要安装的模块,已经有了针对你的平台的安装版本,因此只需要像 ...