@@ -6,7 +6,7 @@ Vue.js 本体で提供されているデフォルトのディレクティブ (`v
6
6
7
7
<common-codepen-snippet title =" Custom directives: basic example " slug =" JjdxaJW " :preview =" false " />
8
8
9
- ページを読み込むと、この要素にフォーカスが当たります (注意:` autofucus ` はモバイルの Safari で動きません)。実際、このページに訪れてから他に何もクリックしなければ、上記の input 要素にフォーカスが当たります。また、` Rerun ` ボタンをクリックしても、input 要素はフォーカスされます。
9
+ ページを読み込むと、この要素にフォーカスが当たります (注意:` autofocus ` はモバイルの Safari で動きません)。実際、このページに訪れてから他に何もクリックしなければ、上記の input 要素にフォーカスが当たります。また、` Rerun ` ボタンをクリックしても、input 要素はフォーカスされます。
10
10
11
11
ここからこれを実現するディレクティブを実装しましょう:
12
12
@@ -45,7 +45,9 @@ directives: {
45
45
46
46
ディレクティブの定義オブジェクトは、いくつかのフック関数を提供しています (全てオプション):
47
47
48
- - ` beforeMount ` : ディレクティブが初めて要素に束縛された時、そして親コンポーネントがマウントされる前に呼ばれます。ここは1度だけ実行するセットアップ処理を行える場所です。
48
+ - ` created ` : 束縛された要素の属性や、イベントリスナが適用される前に呼ばれます。これは通常の ` v-on ` イベントリスナの前に呼ばれなければならないイベントリスナをつける必要がある場合に便利です。
49
+
50
+ - ` beforeMount ` : ディレクティブが最初に要素に束縛されたとき、親コンポーネントがマウントされる前に呼ばれます。
49
51
50
52
- ` mounted ` : 束縛された要素の親コンポーネントがマウントされた時に呼ばれます。
51
53
@@ -130,7 +132,7 @@ app.mount('#dynamic-arguments-example')
130
132
<div id="dynamicexample">
131
133
<h2>Scroll down the page</h2>
132
134
<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>
134
136
</div>
135
137
```
136
138
@@ -167,7 +169,7 @@ app.directive('pin', {
167
169
168
170
## 関数による省略記法
169
171
170
- 前回の例では 、` mounted ` と ` updated ` に同じ振る舞いを欲しかったでしょう。しかし、その他のフック関数を気にしてはいけません。 ディレクティブにコールバックを渡すことで実現できます:
172
+ 前の例では 、` mounted ` と ` updated ` に同じ振る舞いをさせたいが、その他のフックは気にしない、という場合があります。そのような場合は、 ディレクティブにコールバックを渡すことで実現できます:
171
173
172
174
``` js
173
175
app .directive (' pin' , (el , binding ) => {
@@ -192,42 +194,24 @@ app.directive('demo', (el, binding) => {
192
194
})
193
195
```
194
196
195
- ## コンポーネントにおける使用法
196
-
197
- 3.0 ではフラグメントがサポートされているため、コンポーネントは潜在的に1つ以上のルートノードを持つことができます。これは複数のルートノードを持つ1つのコンポーネントにカスタムディレクティブが使用された時に、問題を引き起こします。
197
+ ## コンポーネントでの使い方
198
198
199
- 3.0 のコンポーネント上でどのようにカスタムディレクティブが動作するかを詳細に説明するために、3.0 においてカスタムディレクティブがどのようにコンパイルされるのかをまずは理解する必要があります。以下のようなディレクティブは:
199
+ コンポーネントに使われた場合、カスタムディレクティブは [ プロパティでない属性 ] ( component-attrs.html ) と同じように、常にコンポーネントのルートノードに適用されます
200
200
201
201
``` 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>
211
203
```
212
204
213
- ここで ` vDemo ` はユーザによって記述されたディレクティブオブジェクトで、それは ` mounted ` や ` updated ` のフック関数を含みます。
214
-
215
- ` withDirectives ` は複製した VNode を返します。複製された VNode は VNode のライフサイクルフック (詳細は[ Render 関数] ( render-function.html ) を参照) としてラップ、注入されたユーザのフック関数を持ちます:
216
-
217
205
``` 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
+ })
223
213
```
224
214
225
- ** 結果として、VNode のデータの一部としてカスタムディレクティブは全て含まれます。カスタムディレクティブがコンポーネントで利用される場合、これらの ` onVnodeXXX ` フック関数は無関係な props としてコンポーネントに渡され、最終的に ` this.$attrs ` になります。**
226
-
227
- これは以下のようなテンプレートのように、要素のライフサイクルに直接フックできることを意味しています。これはカスタムディレクティブが複雑すぎる場合に便利です:
228
-
229
- ``` vue-html
230
- <div @vnodeMounted="myHook" />
231
- ```
215
+ 属性とは異なり、ディレクティブは ` v-bind="$attrs" ` で別の要素に渡すことはできません。
232
216
233
- これは [ 属性のフォールスロー ] ( component-attrs .html) と一貫性があります。つまり、コンポーネントにおけるカスタムディレクティブのルールは、その他の異質な属性と同じです: それをどこにまた適用するかどうかを決めるのは、子コンポーネント次第です。子コンポーネントが内部の要素に ` v-bind="$attrs" ` を利用している場合、あらゆるカスタムディレクティブもその要素に適用されます 。
217
+ [ Fragments ] ( /guide/migration/fragments .html#overview ) のサポートによって、コンポーネントは複数のルートノードを持つことができます。マルチルートコンポーネントに適用された場合、ディレクティブは無視され、警告が投げられます 。
0 commit comments