Vue | 12 组件深入-组件注册

news/2024/7/10 2:35:00 标签: vue, frontend technology, framework

内容提要:

  1. 横线分割的组件命名
  2. 全局注册组件的方式
  3. 局部注册组件的方式
  4. 模块系统:在模块系统中本地注册组件的方式、全局自动创建基本组件的方式

这页假设你已经读了组件基础Components Basics,如果你不了解组件先读它

组件名称

在注册组件的时候我们必须给一个名字,它是组件的第一给参数:

Vue.componnet('my-component-name', {/* ... */})

命名要见名知意,为了避免和HTML元素冲突,建议遵守W3C( W3C rules ) 原则去自定义一个tag名字:全部小写,并且用连字符链接每一个词。其他建议看代码规范指导 Style Guide.

名称用例

定义组件名有两种方式:

// 方式一:短横线命名法
Vue.component('my-component-name', { /* ... */ })
// 方式二:驼峰命名法
Vue.component('MyComponentName', { /* ... */})

定义时用哪种方式,引用就用哪种方式。然而,自己在DOM中使用,仅能使用方式一的命名方式(eg:非字符串模板)。

全局注册

使用Vue.component注册的组件为全局注册,可在所有new Vue创建的实例内使用。

Vue.component('component-a',{ /* ... */ })
Vue.component('component-b',{ /* ... */ })
Vue.component('component-c',{ /* ... */ })

new Vue({ el: '#app' })
<div id="app">
    <component-a></component-a>
    <component-b></component-b>
    <component-c></component-c>
</div>    

这甚至应用于所有的子组件,这意味着所有这三个组件互相之间也可用的。

本地注册

为什么需要本地注册?
全局注册常常并不完美,例如,如果你使用像Webpack之类的构建系统,全局注册所有组件意味着即使你停止使用组件,它仍然会被包含在最后的发布包中。这些JS代码的下载对用户是没有必要的。

在这些例子中,你能使用纯JS对象定义你的组件:

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

然后在你想使用的地方在一个components操作项下定义你的组件:

new Vue({
    el: '#app',
    components: {
        'component-a': ComponentA,
        'component-b': ComponentB
    }
})

对于在components对象的每一个属性,Key是自定义对象的名字,如component-a,value是组件的操作对象,如:ComponentA。

注意本地注册的组件不可以用在子组件内。例如,如果你想让ComponentA在ComponentB可用,你必须这样用:

var ComponentA = { /* ... */ }

var ComponentB = {
    components: {
        'component-a': ComponentA
    },
    // ...
}

或如果你通过Babel和Webpack使用的是ES2015模块,它看起来更像这样:

import ComponentA from './ComponentA.vue'

exprot default {
components: {
    ComponentA
	}
	// ...
}

注意在ES2015+,在对象内部用一个变量名像ComponentA其实是ComponentA:ComponentA的简称,意味着该变量名:

  • 是用在模板内部的自定义元素名
  • 变量名包含了该组件的操作选项

模块系统

如果你并没有使用import/require导入模块系统用,你可以跳过这节,否则,有一些具体的说明和建议给到你。

在一个模块系统里进行本地注册

如果你到这了,那么说明你正在使用一个模块系统,如Babel和Webpack。在这些例子中,我们建议你创建一个components目录。每一个component在他自己的文件。

然后在你本地注册它之前,在使用的地方导入组件,例如:假设在一个ComponentB.jsComponentB.vue文件:

import ComponentA from './ComponentA'
import ComponentC form './ComponentC'

export default {
    components: {
        ComponentA,
        ComponentC
    },
    // ...
}

现在ComponentAComponentCComponentB的模板里都能被使用。

基本组件的自动全局注册

许多组件将是相对通用的,可能仅仅封装一个元素像一个输入框或一个按钮。我们有时称这些为 base components,他们通常在组件之间使用非常频繁。

结果是许多组件可能包含很长的基本组件:

import BaseButton form './BaseButton.vue'
import BaseIcon from './BaseIcon.vue'
import BaseInput form './BaseInput.vue'

export default {
    components: {
        BaseButton,
        BaseIcon,
        BaseInput
    }
}

只是为了在模板中支持较少的标记:

<BaseInput v-model="searchText"
           @keydown.enter="search"
           />
<BaseButton @click="search">
	<BaseIcon name="search">
</BaseButton>

如果使用Webpack(或 Vue CLI 3+,内部使用Webpack)可以使用require.context 去全局注册这些基本组件。这有一个案例代码你可能使用它去全局import基本组件在你的实体文件(e.g. src/main.js):

import Vue form 'vue'
import upperFirst from 'lodash/upperFirst'
import camelCase from 'lodash/camelCase'

const requireComponent = require.context(
	// components的相对路径
    './components',
    // 是否在子文件夹中查找
    false,
    // 用于匹配基本组件名的正则表达式
    /Base[A-Z]\w+\.(vue|js)$/
)

requireComponent.keys().forEach(fileName =>{
    // 获取组件配置
    const componentConfig = requireComponent(fileName)
    
    // 获取组件的PascalCase名字
    const componentName = upperFirst(
    	camelCase(
          // 去掉头的‘./’和文件名的拓展
            fileName.replace(/^\.\/(.*)\.\w+$/, '$1')
        )
    )
    
    // 全局注册组件
    Vue.component(
    	componentName,
        // 查找组件操作项用‘.default’,如果组件存在使用‘export default’导出,否则返回一个模块的根节点。
        componentConfig.default || componentConfig
    )
})

记住:全局注册的组件必须被替换在根Vue实例被创建之前(new Vue)。这里有一个在真实工程上下文的例子: Here’s an example 。


http://www.niftyadmin.cn/n/1035774.html

相关文章

Vue | 13 组件深入-Props

内容提要&#xff1a; Prop的大小写与类型传递动态和静态的Props单向数据流Prop的验证非Prop属性 这页假设你已经读了Components Basics&#xff0c;如果你不了解组件首先读它。 Prop大小写&#xff08;cameCase vs kebab-case&#xff09; HTML属性名是大小写不敏感的&#x…

Vue | 14 组件深入-自定义事件

内容提要: 事件名称命名注意事项自定义组件v-model的不同用法为组件绑定本地事件.sync修饰符的用法 这页假定你已经阅读了组件基础Components Basics&#xff0c;如果你是组件新手请先阅读它。 事件名称 不像组件和props&#xff0c;事件名称不存在自动大小写转换。相反&#…

android studio ndk环境搭建(Android.mk方式)

知识点整理1.安装ndk2.android stuido ndk 配置3.编写代码NDK常用编译参数4.运行开发环境&#xff1a;windows10 ,android studio 3.5.2 ,Android.mk方式 1.安装ndk 方式1&#xff1a; https://developer.android.google.cn/ndk/downloads/ 下载下来&#xff0c;解压后&#…

Vue | 15 组件深入-插槽

内容提要&#xff1a; 插槽的内容命名的插槽默认插槽内容插槽的编译范围作用域插槽解构slot-scope 这页假定你已经阅读组件基础&#xff08; Components Basics&#xff09;&#xff0c;如果你不了解组件&#xff0c;请先阅读它。 插槽内容 Vue实现了一套内容分发的API。该API…

Vue | 16 组件深入-动态的异步的组件

内容提要&#xff1a; 避免内容更新—keep-alive与动态组件异步加载组件的处理方式 这页假定你已经了解组件基础 Components Basics&#xff0c;如果你不了解组件请先读它。 keep-alive与动态组件 之前&#xff0c;我们使用is属性去切换组件在标签栏界面&#xff1a; <com…

SAP 物料 移动类型

SAP 物料 移动类型 MvT 移动类型文本 含义 一般用途 T-code 101 GR 收货 直接收货 工单入库&#xff0c;购买成品入库 MIGO/CO11N 102 用于PO冲销的收货 冲销直接收货 冲销工单入库 MIGO/CO11N 103 进入冻结库存的收货 收入质检仓 送检单 MIGO 104 到冻结冲销的收货 冲销收…

Vue | 17 组件深入-处理边界情况

内容提要&#xff1a; 元素和组件的访问&#xff1a;根实例、父组件实例、子组件实例和子元素的访问方式以及依赖注入程式化事件监听器循环应用的产出原因及解决方式使用inline Templates、X-Templates替代模板定义数据更新的控制&#xff1a;强制更新和加载静态内容的方式 这页…

Vue | 18 过渡动画-进入/离开列表过渡

内容提要&#xff1a; 单个元素或组件的过渡: 过渡类、CSS过渡、CSS动画、自定义过渡类、动画和过渡在一起使用、声明过渡持续时间、JavaScript钩子初始渲染的过渡元素间的过渡组件间的过渡列表的过渡&#xff1a;列表进入/离开过渡&#xff0c;列表项移动过渡&#xff0c;交错…