Skip to content

Commit 06fd0aa

Browse files
authored
Guide > Reusability & Composition > Custom Directives の翻訳を追従 (#291)
* docs: make pinPadding value change reflect in the template vuejs/docs@c4b734d#diff-91618a748fbcef0b7ce1f26f300d5aabe925114da5a69022eef7d42a7ed4d3bf * fix: fixed custom directives on components vuejs/docs@dee5886#diff-91618a748fbcef0b7ce1f26f300d5aabe925114da5a69022eef7d42a7ed4d3bf * feat: added `created` hook to directives vuejs/docs@c9b8954#diff-91618a748fbcef0b7ce1f26f300d5aabe925114da5a69022eef7d42a7ed4d3bf * fix: typo * docs: translate custom directives
1 parent 5cd18a7 commit 06fd0aa

File tree

1 file changed

+18
-34
lines changed

1 file changed

+18
-34
lines changed

src/guide/custom-directive.md

Lines changed: 18 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ Vue.js 本体で提供されているデフォルトのディレクティブ (`v
66

77
<common-codepen-snippet title="Custom directives: basic example" slug="JjdxaJW" :preview="false" />
88

9-
ページを読み込むと、この要素にフォーカスが当たります (注意:`autofucus` はモバイルの Safari で動きません)。実際、このページに訪れてから他に何もクリックしなければ、上記の input 要素にフォーカスが当たります。また、`Rerun` ボタンをクリックしても、input 要素はフォーカスされます。
9+
ページを読み込むと、この要素にフォーカスが当たります (注意:`autofocus` はモバイルの Safari で動きません)。実際、このページに訪れてから他に何もクリックしなければ、上記の input 要素にフォーカスが当たります。また、`Rerun` ボタンをクリックしても、input 要素はフォーカスされます。
1010

1111
ここからこれを実現するディレクティブを実装しましょう:
1212

@@ -45,7 +45,9 @@ directives: {
4545

4646
ディレクティブの定義オブジェクトは、いくつかのフック関数を提供しています (全てオプション):
4747

48-
- `beforeMount`: ディレクティブが初めて要素に束縛された時、そして親コンポーネントがマウントされる前に呼ばれます。ここは1度だけ実行するセットアップ処理を行える場所です。
48+
- `created`: 束縛された要素の属性や、イベントリスナが適用される前に呼ばれます。これは通常の `v-on` イベントリスナの前に呼ばれなければならないイベントリスナをつける必要がある場合に便利です。
49+
50+
- `beforeMount`: ディレクティブが最初に要素に束縛されたとき、親コンポーネントがマウントされる前に呼ばれます。
4951

5052
- `mounted`: 束縛された要素の親コンポーネントがマウントされた時に呼ばれます。
5153

@@ -130,7 +132,7 @@ app.mount('#dynamic-arguments-example')
130132
<div id="dynamicexample">
131133
<h2>Scroll down the page</h2>
132134
<input type="range" min="0" max="500" v-model="pinPadding">
133-
<p v-pin:[direction]="pinPadding">Stick me 200px from the {{ direction }} of the page</p>
135+
<p v-pin:[direction]="pinPadding">Stick me {{ pinPadding + 'px' }} from the {{ direction }} of the page</p>
134136
</div>
135137
```
136138

@@ -167,7 +169,7 @@ app.directive('pin', {
167169

168170
## 関数による省略記法
169171

170-
前回の例では`mounted``updated` に同じ振る舞いを欲しかったでしょう。しかし、その他のフック関数を気にしてはいけません。ディレクティブにコールバックを渡すことで実現できます:
172+
前の例では`mounted``updated` に同じ振る舞いをさせたいが、その他のフックは気にしない、という場合があります。そのような場合は、ディレクティブにコールバックを渡すことで実現できます:
171173

172174
```js
173175
app.directive('pin', (el, binding) => {
@@ -192,42 +194,24 @@ app.directive('demo', (el, binding) => {
192194
})
193195
```
194196

195-
## コンポーネントにおける使用法
196-
197-
3.0 ではフラグメントがサポートされているため、コンポーネントは潜在的に1つ以上のルートノードを持つことができます。これは複数のルートノードを持つ1つのコンポーネントにカスタムディレクティブが使用された時に、問題を引き起こします。
197+
## コンポーネントでの使い方
198198

199-
3.0 のコンポーネント上でどのようにカスタムディレクティブが動作するかを詳細に説明するために、3.0 においてカスタムディレクティブがどのようにコンパイルされるのかをまずは理解する必要があります。以下のようなディレクティブは:
199+
コンポーネントに使われた場合、カスタムディレクティブは [プロパティでない属性](component-attrs.html) と同じように、常にコンポーネントのルートノードに適用されます
200200

201201
```vue-html
202-
<div v-demo="test"></div>
203-
```
204-
205-
おおよそ以下のようにコンパイルされます:
206-
207-
```js
208-
const vDemo = resolveDirective('demo')
209-
210-
return withDirectives(h('div'), [[vDemo, test]])
202+
<my-component v-demo="test"></my-component>
211203
```
212204

213-
ここで `vDemo` はユーザによって記述されたディレクティブオブジェクトで、それは `mounted``updated` のフック関数を含みます。
214-
215-
`withDirectives` は複製した VNode を返します。複製された VNode は VNode のライフサイクルフック (詳細は[Render 関数](render-function.html)を参照) としてラップ、注入されたユーザのフック関数を持ちます:
216-
217205
```js
218-
{
219-
onVnodeMounted(vnode) {
220-
// vDemo.mounted(...) を呼びます
221-
}
222-
}
206+
app.component('my-component', {
207+
template: `
208+
<div> // v-demo ディレクティブはここで適用される
209+
<span>My component content</span>
210+
</div>
211+
`
212+
})
223213
```
224214

225-
**結果として、VNode のデータの一部としてカスタムディレクティブは全て含まれます。カスタムディレクティブがコンポーネントで利用される場合、これらの `onVnodeXXX` フック関数は無関係な props としてコンポーネントに渡され、最終的に `this.$attrs` になります。**
226-
227-
これは以下のようなテンプレートのように、要素のライフサイクルに直接フックできることを意味しています。これはカスタムディレクティブが複雑すぎる場合に便利です:
228-
229-
```vue-html
230-
<div @vnodeMounted="myHook" />
231-
```
215+
属性とは異なり、ディレクティブは `v-bind="$attrs"` で別の要素に渡すことはできません。
232216

233-
これは [属性のフォールスロー](component-attrs.html) と一貫性があります。つまり、コンポーネントにおけるカスタムディレクティブのルールは、その他の異質な属性と同じです: それをどこにまた適用するかどうかを決めるのは、子コンポーネント次第です。子コンポーネントが内部の要素に `v-bind="$attrs"` を利用している場合、あらゆるカスタムディレクティブもその要素に適用されます
217+
[Fragments](/guide/migration/fragments.html#overview) のサポートによって、コンポーネントは複数のルートノードを持つことができます。マルチルートコンポーネントに適用された場合、ディレクティブは無視され、警告が投げられます

0 commit comments

Comments
 (0)