Skip to content

Commit caf6e93

Browse files
authored
3.5: custom elements (#2295)
1 parent 57b70a0 commit caf6e93

File tree

4 files changed

+105
-47
lines changed

4 files changed

+105
-47
lines changed

.vitepress/config.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -421,6 +421,7 @@ export const sidebar: ThemeConfig['sidebar'] = {
421421
{
422422
text: '高度な API',
423423
items: [
424+
{ text: 'カスタム要素', link: '/api/custom-elements' },
424425
{ text: 'レンダー関数', link: '/api/render-function' },
425426
{ text: 'サーバーサイドレンダリング', link: '/api/ssr' },
426427
{ text: 'TypeScript ユーティリティー', link: '/api/utility-types' }, // /api/ で折り返されないよう「型」を省略

src/api/custom-elements.md

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
# カスタム要素 API {#custom-elements-api}
2+
3+
## defineCustomElement() {#definecustomelement}
4+
5+
このメソッドは [`defineComponent`](#definecomponent) と同じ引数を受け取りますが、代わりにネイティブの[カスタム要素](https://developer.mozilla.org/ja/docs/Web/Web_Components/Using_custom_elements)クラスのコンストラクタを返します。
6+
7+
- ****
8+
9+
```ts
10+
function defineCustomElement(
11+
component:
12+
| (ComponentOptions & CustomElementsOptions)
13+
| ComponentOptions['setup'],
14+
options?: CustomElementsOptions
15+
): {
16+
new (props?: object): HTMLElement
17+
}
18+
19+
interface CustomElementsOptions {
20+
styles?: string[]
21+
22+
// 以下のオプションは 3.5 以上で利用可能
23+
configureApp?: (app: App) => void
24+
shadowRoot?: boolean
25+
nonce?: string
26+
}
27+
```
28+
29+
> 読みやすくするため、型は単純化されています。
30+
31+
- **詳細**
32+
33+
通常のコンポーネントオプションに加えて、 `defineCustomElement()` はカスタム要素固有のいくつかのオプションをサポートします:
34+
35+
- **`styles`**: 要素のシャドウルートに注入する CSS を提供するためのインラインの CSS 文字列の配列。
36+
37+
- **`configureApp`** <sup class="vt-badge" data-text="3.5+"/>: カスタム要素に対して Vue アプリケーションインスタンスを設定するために使用できる関数。
38+
39+
- **`shadowRoot`** <sup class="vt-badge" data-text="3.5+"/>: `boolean`、デフォルトは `true``false` に設定すると、シャドウルートなしでカスタム要素をレンダリングします。これは、カスタム要素 SFC の `<style>` タグがカプセル化されなくなることを意味します。
40+
41+
- **`nonce`** <sup class="vt-badge" data-text="3.5+"/>: `string`、指定された場合、シャドウルートに注入される `<style>` タグの `nonce` 属性として設定されます。
42+
43+
これらのオプションは、コンポーネント自体の一部として渡される代わりに、第 2 引数として渡すこともできることに注意してください:
44+
45+
```js
46+
import Element from './MyElement.ce.vue'
47+
48+
defineCustomElement(Element, {
49+
configureApp(app) {
50+
// ...
51+
}
52+
})
53+
```
54+
55+
戻り値は [`customElements.define()`](https://developer.mozilla.org/ja/docs/Web/API/CustomElementRegistry/define) を使って登録できるカスタム要素のコンストラクタです。
56+
57+
- ****
58+
59+
```js
60+
import { defineCustomElement } from 'vue'
61+
62+
const MyVueElement = defineCustomElement({
63+
/* コンポーネントオプション */
64+
})
65+
66+
// カスタム要素を登録する。
67+
customElements.define('my-vue-element', MyVueElement)
68+
```
69+
70+
- **参照**
71+
72+
- [ガイド - Vue によるカスタム要素のビルド](/guide/extras/web-components#building-custom-elements-with-vue)
73+
74+
- また、`defineCustomElement()` は単一ファイルコンポーネントで使用する場合、[特別な設定](/guide/extras/web-components#sfc-as-custom-element)が必要なので注意してください。
75+
76+
## useHost() <sup class="vt-badge" data-text="3.5+"/> {#usehost}
77+
78+
現在の Vue カスタム要素のホスト要素を返す Composition API ヘルパーです。
79+
80+
## useShadowRoot() <sup class="vt-badge" data-text="3.5+"/> {#useshadowroot}
81+
82+
現在の Vue カスタム要素のシャドウルートを返す Composition API ヘルパーです。
83+
84+
## this.$host <sup class="vt-badge" data-text="3.5+"/> {#this-host}
85+
86+
現在の Vue カスタム要素のホスト要素を公開するための Options API の属性です。

src/api/general.md

Lines changed: 0 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -225,46 +225,3 @@ Vue の現在のバージョンを公開します。
225225
```
226226
227227
- **参照** [ガイド - 非同期コンポーネント](/guide/components/async)
228-
229-
## defineCustomElement() {#definecustomelement}
230-
231-
このメソッドは [`defineComponent`](#definecomponent) と同じ引数を受け取りますが、代わりにネイティブの[カスタム要素](https://developer.mozilla.org/ja/docs/Web/Web_Components/Using_custom_elements)クラスのコンストラクタを返します。
232-
233-
- **型**
234-
235-
```ts
236-
function defineCustomElement(
237-
component:
238-
| (ComponentOptions & { styles?: string[] })
239-
| ComponentOptions['setup']
240-
): {
241-
new (props?: object): HTMLElement
242-
}
243-
```
244-
245-
> 読みやすくするため、型は単純化されています。
246-
247-
- **詳細**
248-
249-
通常のコンポーネントオプションに加えて、 `defineCustomElement()` は特別なオプション `styles` をサポートします。これはインラインの CSS 文字列の配列で、要素のシャドウルートに注入する CSS を提供するためのものです。
250-
251-
戻り値は [`customElements.define()`](https://developer.mozilla.org/ja/docs/Web/API/CustomElementRegistry/define) を使って登録できるカスタム要素のコンストラクタです。
252-
253-
- **例**
254-
255-
```js
256-
import { defineCustomElement } from 'vue'
257-
258-
const MyVueElement = defineCustomElement({
259-
/* コンポーネントオプション */
260-
})
261-
262-
// カスタム要素を登録する。
263-
customElements.define('my-vue-element', MyVueElement)
264-
```
265-
266-
- **参照**
267-
268-
- [ガイド - Vue によるカスタム要素のビルド](/guide/extras/web-components#building-custom-elements-with-vue)
269-
270-
- また、`defineCustomElement()` は単一ファイルコンポーネントで使用する場合、[特別な設定](/guide/extras/web-components#sfc-as-custom-element)が必要なので注意してください。

src/guide/extras/web-components.md

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -47,15 +47,15 @@ export default {
4747
```js
4848
// vue.config.js
4949
module.exports = {
50-
chainWebpack: config => {
50+
chainWebpack: (config) => {
5151
config.module
5252
.rule('vue')
5353
.use('vue-loader')
54-
.tap(options => ({
54+
.tap((options) => ({
5555
...options,
5656
compilerOptions: {
5757
// ion- で始まるタグはすべてカスタム要素として扱う
58-
isCustomElement: tag => tag.startsWith('ion-')
58+
isCustomElement: (tag) => tag.startsWith('ion-')
5959
}
6060
}))
6161
}
@@ -81,7 +81,7 @@ DOM 属性は文字列のみしか扱えないため、複雑なデータをカ
8181

8282
### defineCustomElement {#definecustomelement}
8383

84-
Vue は [`defineCustomElement`](/api/general#definecustomelement) メソッドを介したまったく同じ Vue コンポーネント API 群を使ってカスタム要素の作成をサポートします。このメソッドは [`defineComponent`](/api/general#definecomponent) と同じ引数を受け付けますが、代わりに `HTMLElement` を拡張したカスタム要素を返します:
84+
Vue は [`defineCustomElement`](/api/custom-elements#definecustomelement) メソッドを介したまったく同じ Vue コンポーネント API 群を使ってカスタム要素の作成をサポートします。このメソッドは [`defineComponent`](/api/general#definecomponent) と同じ引数を受け付けますが、代わりに `HTMLElement` を拡張したカスタム要素を返します:
8585

8686
```vue-html
8787
<my-vue-element></my-vue-element>
@@ -171,6 +171,20 @@ document.body.appendChild(
171171

172172
[Provide / Inject API](/guide/components/provide-inject#provide-inject)[Composition API](/api/composition-api-dependency-injection#provide) も、Vue で定義されたカスタム要素間で動作します。しかしながら、これは**カスタム要素間**のみ動作するということに注意してください。つまり、Vue で定義されたカスタム要素は、カスタム要素ではない Vue コンポーネントによってプロパティを注入することはできません。
173173

174+
#### アプリケーションレベルの設定 <sup class="vt-badge" data-text="3.5+" /> {#app-level-config}
175+
176+
`configureApp` オプションを使うことで、Vue のカスタム要素のアプリケーションインスタンスを設定できます:
177+
178+
```js
179+
defineCustomElement(MyComponent, {
180+
configureApp(app) {
181+
app.config.errorHandler = (err) => {
182+
/* ... */
183+
}
184+
}
185+
})
186+
```
187+
174188
### カスタム要素としての SFC {#sfc-as-custom-element}
175189

176190
`defineCustomElement` は、Vue の単一ファイルコンポーネント(SFC: Single-File Components)でも動作します。しかしながら、デフォルトのツール設定では、SFC 内の `<style>` は、プロダクションビルド時に抽出され、単一の CSS ファイルにマージされます。SFC をカスタム要素として使用する場合は、代わりにカスタム要素の shadow root に `<style>` タグを注入するのが望ましいことが多いです。

0 commit comments

Comments
 (0)