Skip to content

Commit dfa07ee

Browse files
tejitakposva
authored andcommitted
Translate 2.0 docs for advanced & api (ja) (#691)
* Translate 2.0 docs for advanced (ja) * Translate 2.0 docs for api (ja) * Add 2.0 Japanese translated doc link * fix Japanese translation for functional component
1 parent 821df0c commit dfa07ee

13 files changed

+778
-0
lines changed

docs/LANGS.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
* [2.0 - English](en/)
2+
* [2.0 - Japanese](ja/)
23
* [0.7 Docs](old/)

docs/ja/advanced/data-fetching.md

Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
# データ取得
2+
3+
ルートが有効化された時にサーバーからデータを取得する必要がしばしばあります。例えば、ユーザープロフィールをレンダリングする前に、サーバーからユーザーデータを取得する必要があります。これを実現するためには 2 種類の方法があります。
4+
5+
- **ナビゲーション後の取得**: ナビゲーションを先に実行し、その後次に入ってくるコンポーネントのライフサイクルフック内でデータを取得します。データ取得中にローディングを表示します。
6+
7+
- **ナビゲーション前の取得**: ルートに入るガード内でナビゲーション前にデータ取得をします。そして、データ取得後にナビゲーションを実行します。
8+
9+
技術的にはどちらも正当な選択肢です。究極的にはあなたが目指しているユーザーエクスペリエンスに依存します。
10+
11+
## ナビゲーション後の取得
12+
13+
このアプローチを取る時は次に来るコンポーネントが即座にナビゲーションされ、レンダリングされます。そして、コンポーネントの `created` フックの中でデータを取得します。この方法ではネットワーク越しにデータを取得している間にローディング状態を表示する機会があります。また、各 view に対して、異なるローディングの対応をすることもできます。
14+
15+
`$route.params.id` を元にポストのデータを取得する必要がある `Post` コンポーネントを想定してみましょう。
16+
17+
``` html
18+
<template>
19+
<div class="post">
20+
<div class="loading" v-if="loading">
21+
Loading...
22+
</div>
23+
24+
<div v-if="error" class="error">
25+
{{ error }}
26+
</div>
27+
28+
<div v-if="post" class="content">
29+
<h2>{{ post.title }}</h2>
30+
<p>{{ post.body }}</p>
31+
</div>
32+
</div>
33+
</template>
34+
```
35+
36+
``` js
37+
export default {
38+
data () {
39+
return {
40+
loading: false,
41+
post: null,
42+
error: null
43+
}
44+
},
45+
created () {
46+
// view が作られた時にデータを取得し、
47+
// そのデータは既に監視されています
48+
this.fetchData()
49+
},
50+
watch: {
51+
// ルートが変更されたらこのメソッドを再び呼び出します
52+
'$route': 'fetchData'
53+
},
54+
methods: {
55+
fetchData () {
56+
this.error = this.post = null
57+
this.loading = true
58+
// getPost をあなたのデータ取得用 util や API ラッパーに置き換えてください
59+
getPost(this.$route.params.id, (err, post) => {
60+
this.loading = false
61+
if (err) {
62+
this.error = err.toString()
63+
} else {
64+
this.post = post
65+
}
66+
})
67+
}
68+
}
69+
}
70+
```
71+
72+
## ナビゲーション前の取得
73+
74+
こちらのアプローチでは新しいルートへ実際にナビゲーションする前にデータを取得します。次に入ってくるコンポーネント内の `beforeRouteEnter` ガードでデータ取得を実行できます。データ取得が完了したら `next` を呼ぶだけです。
75+
76+
``` js
77+
export default {
78+
data () {
79+
return {
80+
post: null,
81+
error: null
82+
}
83+
},
84+
beforeRouteEnter (route, redirect, next) {
85+
getPost(route.params.id, (err, post) => {
86+
if (err) {
87+
// 何らかのグローバルエラーメッセージを表示する
88+
} else {
89+
next(vm => {
90+
vm.post = post
91+
})
92+
}
93+
})
94+
},
95+
// コンポーネントが既にレンダリングされている際のルート変更時は
96+
// ロジックが少し異なります
97+
watch: {
98+
$route () {
99+
this.post = null
100+
getPost(this.$route.params.id, (err, post) => {
101+
if (err) {
102+
this.error = err.toString()
103+
} else {
104+
this.post = post
105+
}
106+
})
107+
}
108+
}
109+
}
110+
```
111+
112+
次に入ってくる view へのリソースを取得している間、ユーザーは現在の view に滞在します。したがって、データ取得中にプログレスバーや何らかの指標を表示することをオススメします。また、もしデータ取得が失敗した場合、何かグローバルな警告メッセージのようなものを表示する必要があります。

docs/ja/advanced/lazy-loading.md

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
# 遅延ローディングルート
2+
3+
バンドラーを使ってアプリケーションを構築している時、バンドルされる JavaScript が非常に大きいものになり得ます。結果的にページのロード時間に影響を与えてしまいます。もし各ルートコンポーネントごとに別々のチャンクにして、訪れたルートの時だけロードできればより効率的でしょう。
4+
5+
Vue の [非同期コンポーネント機能](http://vuejs.org/guide/components.html#Async-Components) と Webpack の [コード分割機能](https://webpack.github.io/docs/code-splitting.html) を組み合わせることでとても簡単に遅延ロードするルートコンポーネントができます。
6+
7+
必要なことは非同期のルートコンポーネントを定義するだけです。
8+
9+
``` js
10+
const Foo = resolve => {
11+
// require.ensure はコード分割のための Webpack の特殊な文法です。
12+
require.ensure(['./Foo.vue'], () => {
13+
resolve(require('./Foo.vue'))
14+
})
15+
}
16+
```
17+
18+
コード分割の文法の代替として、 AMD 形式の require もあります。これを使うと次のように簡略されます。
19+
20+
``` js
21+
const Foo = resolve => require(['./Foo.vue'], resolve)
22+
```
23+
24+
特にルート設定を変更する必要はなく、普段のように `Foo` を使用するだけです。
25+
26+
``` js
27+
const router = new VueRouter({
28+
routes: [
29+
{ path: '/foo', component: Foo }
30+
]
31+
})
32+
```
33+
34+
### 同じチャンク内でのコンポーネントグループ化
35+
36+
しばしば同じ非同期のチャンクに、そのルート配下のネストされた全てのコンポーネントをグループ化したいと思うかもしれません。それを実現するためには、 `require.ensure` の第 3 引数にチャンクの名前を提供する [名前付きチャンク](https://webpack.github.io/docs/code-splitting.html#named-chunks) を使う必要があります。
37+
38+
``` js
39+
const Foo = r => require.ensure([], () => r(require('./Foo.vue')), 'group-foo')
40+
const Bar = r => require.ensure([], () => r(require('./Bar.vue')), 'group-foo')
41+
const Baz = r => require.ensure([], () => r(require('./Baz.vue')), 'group-foo')
42+
```
43+
44+
Webpack は同じチャンク名のどんな非同期のモジュールも同じ非同期のチャンクにグループします。つまり、 `require.ensure` に対して明示的に依存関係をリストする必要がありません (したがって空の配列を渡しています)。

docs/ja/advanced/meta.md

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
# ルートメタフィールド
2+
3+
ルートの定義をする際に `meta` フィールドを含めることができます。
4+
5+
``` js
6+
const router = new VueRouter({
7+
routes: [
8+
{
9+
path: '/foo',
10+
component: Foo,
11+
children: [
12+
{
13+
path: 'bar',
14+
component: Bar,
15+
// メタフィールド
16+
meta: { requiresAuth: true }
17+
}
18+
]
19+
}
20+
]
21+
})
22+
```
23+
24+
ではどのように `meta` フィールドにアクセスしましょう?
25+
26+
まず、 `routes` 設定の中の各ルートオブジェクトは**ルートレコード**と呼ばれます。ルートレコードはネストされているかもしれません。したがって、ルートがマッチした時に、潜在的には 1 つ以上のルートレコードがマッチされる可能性があります。
27+
28+
例えば上記のルート設定で、 `/foo/bar` という URL は親のルートレコードにも子のルートレコードにもマッチします。
29+
30+
ルートにマッチした全てのルートレコードは `$route.matched` 配列として `$route` オブジェクト上で (また、ナビゲーションガード上のルートオブジェクトでも) アクセス可能になります。
31+
32+
メタフィールドをグローバルナビゲーションガードで確認するユースケースの例:
33+
34+
``` js
35+
router.beforeEach((route, redirect, next) => {
36+
if (route.matched.some(record => record.meta.requiresAuth)) {
37+
// このルートはログインされているかどうか認証が必要です。
38+
// もしされていないならば、ログインページにリダイレクトします。
39+
if (!auth.loggedIn()) {
40+
redirect({
41+
path: '/login',
42+
query: { redirect: route.fullPath }
43+
})
44+
} else {
45+
next()
46+
}
47+
} else {
48+
next()
49+
}
50+
})
51+
```

docs/ja/advanced/navigation-guards.md

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
# ナビゲーションガード
2+
3+
この名前が示すように、 `vue-router` によって提供されるナビゲーションガードは、リダイレクトもしくはキャンセルによって遷移をガードするために主に使用されます。ルートナビゲーション処理 (グローバル、ルート単位、コンポーネント内) をフックする多くの方法があります。
4+
5+
### グローバルガード
6+
7+
`router.beforeEach` を使ってグローバル before ガードを登録できます。
8+
9+
``` js
10+
const router = new VueRouter({ ... })
11+
12+
router.beforeEach((route, redirect, next) => {
13+
// ...
14+
})
15+
```
16+
17+
いつナビゲーションがトリガーされようとも、グローバル before ガードは作られた順番で呼び出されます。ガードは非同期に解決されるかもしれません。そしてそのナビゲーションは全てのフックが解決されるまで **未解決状態** として扱われます。
18+
19+
全てのガード関数は 3 つの引数を受け取ります。
20+
21+
- `route: Route`: 次にナビゲーションされる対象の [ルートオブジェクト](../api/route-object.md)
22+
23+
- `redirect: Function`: この関数を呼び出すことで現在のナビゲーションを中止してリダイレクト対象先の新しいナビゲーションが始まります。
24+
25+
- `next: Function`: このガードを解決し、パイプラインの次のガードに進みます。もしフックが残っていない場合は、このナビゲーションは **確立** されます。
26+
27+
**もし `redirect``next` も呼ばれない場合、そのナビゲーションはキャンセルされます。**
28+
29+
グローバル after フックを登録することもできます。しかしながら、ガードとは異なり、これらのフックはより単純で、ナビゲーションに影響を与えることはできません。
30+
31+
``` js
32+
router.afterEach(route => {
33+
// ...
34+
})
35+
```
36+
37+
### ルート単位ガード
38+
39+
直接ルート設定オブジェクトの `beforeEnter` ガードを定義することができます。
40+
41+
``` js
42+
const router = new VueRouter({
43+
routes: [
44+
{
45+
path: '/foo',
46+
component: Foo,
47+
beforeEnter: (route, redirect, next) => {
48+
// ...
49+
}
50+
}
51+
]
52+
})
53+
```
54+
55+
これらのガードはグローバル before ガードと全く同じシグネチャを持ちます。
56+
57+
### コンポーネント内ガード
58+
59+
最後に、 `beforeRouteEnter``beforeRouteLeave` を使ってルートコンポーネント内側でルートナビゲーションガードを直接定義することができます。
60+
61+
``` js
62+
const Foo = {
63+
template: `...`,
64+
beforeRouteEnter (route, redirect, next) {
65+
// このコンポーネントをレンダリングするルートが確立する前に呼ばれます。
66+
// `this` でのこのコンポーネントへのアクセスはできません。
67+
// なぜならばこのガードが呼び出される時にまだ作られていないからです!
68+
},
69+
beforeRouteLeave (route, redirect, next) {
70+
// このコンポーネントをレンダリングするルートが間もなく
71+
// ナビゲーションから離れていく時に呼ばれます。
72+
// `this` でのコンポーネントインスタンスへのアクセスができます。
73+
}
74+
}
75+
```
76+
77+
この `beforeRouteEnter` ガードは `this` へのアクセスは**できない**です。なぜならば、ナビゲーションが確立する前にガードが呼び出されるからです。したがって、新しく入ってくるコンポーネントはまだ作られていないです。
78+
79+
しかしながら、 `next` にコールバックを渡すことでインスタンスにアクセスすることができます。このコールバックはナビゲーションが確立した時に呼ばれ、コンポーネントインスタンスはそのコールバックの引数として渡されます。
80+
81+
``` js
82+
beforeRouteEnter (route, redirect, next) {
83+
next(vm => {
84+
// `vm` を通じてコンポーネントインスタンスにアクセス
85+
})
86+
}
87+
```
88+
89+
`beforeRouteLeave` 内で直接 `this` にアクセスすることができます。この去る際のガードは通常はユーザーが不意に編集を保存していない状態でこのルートを去ることを防ぐために使われます。このナビゲーションは単純に `next` もしくは `redirect` を呼ばなければキャンセルされます。

docs/ja/advanced/scroll-behavior.md

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
# スクロールの振る舞い
2+
3+
クライアントサイドのルーティングを使っている時に、新しいルートに対してスクロールをトップへ移動させたいかもしれません、もしくは実際のページリロードがしているように history 要素のスクロールポジションを保持したいこともあるかもしれません。 `vue-router` ではこれらをさらによく実現できます。ルートナビゲーションにおけるスクロールの挙動を完全にカスタマイズすることができます。
4+
5+
**注意: この機能は HTML5 history モードでのみ動作します。**
6+
7+
ルートインスタンスを作る時に、 `scrollBehavior` 関数を提供できます。
8+
9+
``` js
10+
const router = new VueRouter({
11+
routes: [...],
12+
scrollBehavior (to, from, savedPosition) {
13+
// 望みのポジションを返す
14+
}
15+
})
16+
```
17+
18+
`scrollBehavior` 関数は `to``from` のルートオブジェクトを受け取ります。第 3 引数の `savedPosition``popstate` ナビゲーション (ブラウザの戻る/進むボタンがトリガーされた) 時のみ利用可能です。
19+
20+
この関数はスクロールポジションオブジェクトを返すことができます。そのオブジェクトは以下のような形式です。
21+
22+
- `{ x: number, y: number }`
23+
- `{ selector: string }`
24+
25+
もし falsy な値や空のオブジェクトが返った場合、何もスクロールは起きません。
26+
27+
例:
28+
29+
``` js
30+
scrollBehavior (to, from, savedPosition) {
31+
return { x: 0, y: 0 }
32+
}
33+
```
34+
35+
これは単純に全てのルートナビゲーションに対してページスクロールをトップにします。
36+
37+
`savedPosition` を返すことは結果的に戻る/進むボタンを押してナビゲーションした時にネイティブのような挙動になります。
38+
39+
``` js
40+
scrollBehavior (to, from, savedPosition) {
41+
if (savedPosition) {
42+
return savedPosition
43+
} else {
44+
return { x: 0, y: 0 }
45+
}
46+
}
47+
```
48+
49+
もし"アンカーへスクロール"の振る舞いをシミュレートしたい場合は以下のようにしてください。
50+
51+
``` js
52+
scrollBehavior (to, from, savedPosition) {
53+
if (to.hash) {
54+
return {
55+
selector: to.hash
56+
}
57+
}
58+
}
59+
```
60+
61+
きめの細かいスクロールの挙動コントロールを実装するために [ルートメタフィールド](meta.md) も利用可能です。詳細な例は [こちら](https://github.com/vuejs/vue-router/blob/dev/examples/scroll-behavior/app.js) をご参照ください。

0 commit comments

Comments
 (0)