부품 등록


이 페이지에서는 귀하가 구성 요소 기본 사항을 읽었다고 가정합니다. 아직 컴포넌트에 대해 잘 모르신다면 먼저 읽어보시길 권합니다.


Directory


구성 요소 이름


등록시 생성시 구성 요소에는 항상 이름을 지정해야 합니다. 예를 들어 전역 등록 중에 다음과 같이 확인했습니다.

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

컴포넌트 이름은 Vue.comComponent의 첫 번째 매개변수입니다. Vue.component 的第一个参数。

你给予组件的名字可能依赖于你打算拿它来做什么。当直接在 DOM 中使用一个组件 (而不是在字符串模板或单文件组件) 的时候,我们强烈推荐遵循 W3C 规范中的自定义组件名 (字母全小写且必须包含一个连字符)。这会帮助你避免和当前以及未来的 HTML 元素相冲突。

你可以在风格指南中查阅到关于组件名的其它建议。


组件名大小写

定义组件名的方式有两种:

使用 kebab-case

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

当使用 kebab-case (短横线分隔命名) 定义一个组件时,你也必须在引用这个自定义元素时使用 kebab-case,例如 <my-component-name>

使用 PascalCase

Vue.component('MyComponentName', { /* ... */ })

当使用 PascalCase (首字母大写命名) 定义一个组件时,你在引用这个自定义元素时两种命名法都可以使用。也就是说 <my-component-name><MyComponentName>

구성 요소에 부여하는 이름은 사용 목적에 따라 달라질 수 있습니다. 문자열 템플릿이나 단일 파일 구성 요소

가 아닌) DOM에서 직접 구성 요소를 사용하는 경우 W3C 사양
구성 요소 이름( 모든 소문자에는 하이픈이 포함되어야 합니다). 이는 현재 및 미래의 HTML 요소와의 충돌을 피하는 데 도움이 됩니다.

🎜🎜구성 요소 이름 대소문자 🎜🎜🎜🎜구성 요소 이름을 정의하는 방법에는 두 가지가 있습니다. 🎜🎜🎜케밥 사용 - case🎜🎜
Vue.component('my-component-name', {
  // ... 选项 ...
})
🎜kebab-case(대시로 구분된 이름)를 사용하여 구성 요소를 정의하는 경우 <my-comComponent-name>과 같은 맞춤 요소를 참조할 때도 kebab-case를 사용해야 합니다. . 🎜🎜🎜PascalCase 사용🎜🎜
Vue.component('component-a', { /* ... */ })
Vue.component('component-b', { /* ... */ })
Vue.component('component-c', { /* ... */ })

new Vue({ el: '#app' })
🎜PascalCase(첫 글자를 대문자로 지정)를 사용하여 구성 요소를 정의할 때 사용자 정의 요소를 참조할 때 두 명명법을 모두 사용할 수 있습니다. 즉, 을 모두 사용할 수 있습니다. 그러나 DOM(예: 문자열이 아닌 템플릿)에서 직접 사용될 때는 kebab-case만 유효합니다. 🎜🎜🎜🎜

전역 등록


지금까지는 Vue.comComponent만 사용하여 구성 요소를 만들었습니다. Vue.component 来创建组件:

<div id="app">
  <component-a></component-a>
  <component-b></component-b>
  <component-c></component-c>
</div>

这些组件是全局注册的。也就是说它们在注册之后可以用在任何新创建的 Vue 根实例 (new Vue) 的模板中。比如:

var ComponentA = { /* ... */ }
var ComponentB = { /* ... */ }
var ComponentC = { /* ... */ }
new Vue({
  el: '#app',
  components: {
    'component-a': ComponentA,
    'component-b': ComponentB
  }
})

在所有子组件中也是如此,也就是说这三个组件在各自内部也都可以相互使用。


局部注册


全局注册往往是不够理想的。比如,如果你使用一个像 webpack 这样的构建系统,全局注册所有的组件意味着即便你已经不再使用一个组件了,它仍然会被包含在你最终的构建结果中。这造成了用户下载的 JavaScript 的无谓的增加。

在这些情况下,你可以通过一个普通的 JavaScript 对象来定义组件:

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

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

然后在 components 选项中定义你想要使用的组件:

import ComponentA from './ComponentA.vue'

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

对于 components 对象中的每个属性来说,其属性名就是自定义元素的名字,其属性值就是这个组件的选项对象。

注意:局部注册的组件在其子组件中不可用。例如,如果你希望 ComponentAComponentB 中可用,则你需要这样写:

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

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

或者如果你通过 Babel 和 webpack 使用 ES2015 模块,那么代码看起来更像:

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

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

注意在 ES2015+ 中,在对象中放一个类似 ComponentA 的变量名其实是 ComponentA: ComponentA 的缩写,即这个变量名同时是:

  • 用在模板中的自定义元素的名称

  • 包含了这个组件选项的变量名


模块系统


如果你没有通过 import/require 使用一个模块系统,也许可以暂且跳过这个章节。如果你使用了,那么我们会为你提供一些特殊的使用说明和注意事项。


在模块系统中局部注册

如果你还在阅读,说明你使用了诸如 Babel 和 webpack 的模块系统。在这些情况下,我们推荐创建一个 components 目录,并将每个组件放置在其各自的文件中。

然后你需要在局部注册之前导入每个你想使用的组件。例如,在一个假设的 ComponentB.jsComponentB.vue 文件中:

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

现在 ComponentAComponentC 都可以在 ComponentB

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

const requireComponent = require.context(
  // 其组件目录的相对路径
  './components',
  // 是否查询其子目录
  false,
  // 匹配基础组件文件名的正则表达式
  /Base[A-Z]\w+\.(vue|js)$/
)

requireComponent.keys().forEach(fileName => {
  // 获取组件配置
  const componentConfig = requireComponent(fileName)
  // 获取组件的 PascalCase 命名
  const componentName = upperFirst(
    camelCase(
      // 获取和目录深度无关的文件名
      fileName
        .split('/')
        .pop()
        .replace(/\.\w+$/, '')
    )
  )
  
  // 全局注册组件
  Vue.component(
    componentName,
    // 如果这个组件选项是通过 `export default` 导出的,
    // 那么就会优先使用 `.default`,
    // 否则回退到使用模块的根。
    componentConfig.default || componentConfig
  )
})

이 구성 요소는
전역 등록

입니다. 즉, 등록 후 새로 생성된 Vue 루트 인스턴스(new Vue)의 템플릿에서 사용할 수 있습니다. 예를 들면 다음과 같습니다. 🎜rrreeerrreee🎜모든 하위 구성 요소에 대해서도 마찬가지입니다. 즉, 이 세 가지 구성 요소는 내부적으로도 서로 사용할 수 있습니다. 🎜🎜🎜🎜

🎜🎜부분 등록🎜🎜🎜🎜🎜전역 등록은 종종 이상적이지 않습니다. 예를 들어, webpack과 같은 빌드 시스템을 사용하는 경우 모든 구성 요소를 전역적으로 등록한다는 것은 구성 요소를 더 이상 사용하지 않더라도 최종 빌드 결과에 계속 포함된다는 의미입니다. 이로 인해 사용자가 다운로드하는 JavaScript 양이 불필요하게 증가합니다. 🎜🎜이러한 경우 일반 JavaScript 개체를 통해 구성 요소를 정의할 수 있습니다: 🎜rrreee🎜 그런 다음 구성 요소 옵션에서 사용하려는 구성 요소를 정의합니다: 🎜rrreee🎜구성 요소의 경우 개체의 각 속성에 대해 해당 속성 이름은 사용자 정의 요소의 이름이고 해당 속성 값은 이 구성 요소의 옵션 개체입니다. 🎜🎜참고: 🎜부분적으로 등록된 구성 요소는 하위 구성 요소에서 사용할 수 없습니다🎜. 예를 들어 ComponentAComponentB에서 사용할 수 있도록 하려면 다음과 같이 작성합니다. 🎜rrreee🎜 또는 Babel 및 webpack을 통해 ES2015 모듈을 사용하는 경우 코드 🎜rrreee🎜 ES2015+에서는 객체에 ComponentA와 같은 변수 이름을 넣는 것이 실제로는 ComponentA: ComponentA의 약어, 즉 이 변수라는 점에 유의하세요. 이름은 다음과 같습니다. 🎜
  • 🎜템플릿에 사용된 맞춤 요소의 이름🎜
  • 🎜이 구성 요소의 변수 이름을 포함합니다. option🎜
🎜🎜🎜

🎜🎜Module System🎜🎜🎜🎜🎜import/<를 통해 사용하지 않는 경우 code>require 모듈 시스템이므로 지금은 이 장을 건너뛰어도 됩니다. 이를 사용하는 경우 몇 가지 특별한 지침과 주의 사항을 제공합니다. 🎜🎜🎜🎜🎜

🎜모듈 시스템에 부분적으로 등록됨🎜🎜🎜🎜아직 읽고 계시다면 다음과 같은 것을 사용하고 계십니다. Babel과 webpack의 모듈 시스템. 이러한 경우에는 구성 요소 디렉터리를 만들고 각 구성 요소를 자체 파일에 배치하는 것이 좋습니다. 🎜🎜그런 다음 로컬에 등록하기 전에 사용하려는 각 구성 요소를 가져와야 합니다. 예를 들어 가상의 ComponentB.js 또는 ComponentB.vue 파일에서: 🎜rrreee🎜Now ComponentAComponentC >는 ComponentB의 템플릿에서 사용할 수 있습니다. 🎜🎜🎜🎜

기본 구성요소의 자동화된 전역 등록

아마도 많은 구성요소가 상대적으로 일반적인 입력 상자나 버튼과 같은 요소를 래핑할 수도 있습니다. 우리는 이를 기본 구성 요소라고 부르기도 하며, 다양한 구성 요소에 자주 사용됩니다.

너무 많은 구성 요소에는 기본 구성 요소의 긴 목록이 있습니다:

rrreee

그리고 템플릿의 작은 부분에 대해서만:

rrreee

다행히도 webpack을 사용한다면(또는 내부적으로 webpack을 사용 Vue CLI 3+) require.context 只全局注册这些非常通用的基础组件。这里有一份可以让你在应用入口文件 (比如 src/main.js)에서 기본 구성 요소를 전역적으로 가져오기 위한 샘플 코드를 사용할 수 있습니다.

rrreee

전역 등록 동작은 루트 Vue 인스턴스(새 Vue를 통해)가 생성되기 전에 발생해야 한다는 점을 기억하세요. 여기 실제 프로젝트 시나리오의 예가 있습니다.