|
2 | 2 | ogImage: true
|
3 | 3 | ---
|
4 | 4 |
|
5 |
| -# Reactivity Part 2 |
| 5 | +# リアクティビティー パート2 |
6 | 6 |
|
7 |
| -前章で `ref` と `computed` を使った基本的なデータバインディングを学びました。本章では、`reactive` と `watch` について学びましょう。この章で基本的なリアクティビティシステムをマスターできます! |
| 7 | +前章で `ref` と `computed` を使った基本的なデータバインディングを学びました。本章では、`watch` について学びましょう。この章で基本的なリアクティビティシステムをマスターできます! |
8 | 8 |
|
9 |
| -- [`reactive()`](https://ja.vuejs.org/api/reactivity-core#reactive) はオブジェクト全体をリアクティブなデータとして扱うことができます。複数のプロパティを持つオブジェクトを管理できます。 |
10 |
| - |
11 |
| -- [`watch()`](https://ja.vuejs.org/api/reactivity-core#watch) はリアクティブなデータの変化を監視し、変化があったときに特定の処理を実行することができます。 |
12 |
| - |
13 |
| -`reactive` で宣言された値は、JavaScript の[プロキシ](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Proxy)として返ってくるため、以下のように通常のオブジェクトと同じように操作することができます。 |
| 9 | +[`watch()`](https://ja.vuejs.org/api/reactivity-core#watch) はリアクティブなデータの変化を監視し、変化があったときに特定の処理を実行することができます。\ |
| 10 | +`watch` は `computed` と同様にリアクティブ値の変化に応じて作用しますが、主に `console.log` や `fetch` のような副作用をリアクティブに実行するときに使います。 |
14 | 11 |
|
15 | 12 | ```ts
|
16 |
| -const counter = reactive({ count: 0 }) |
17 |
| -counter.count++ // .value は不要 |
18 |
| -console.log(counter.count) // -> 1 |
19 |
| -``` |
| 13 | +const count = ref(0) |
20 | 14 |
|
21 |
| -::note |
22 |
| -**注意**: よくある間違いとして、`ref` はプリミティブな値のみに対応し、オブジェクトには `reactive` を使うという誤解があります。実際は `ref` でも `ref({ count: 0 })` のようにオブジェクトをリアクティブな値として宣言することができます。 |
23 |
| -また、`reactive` には [いくつかの制限事項がある](https://ja.vuejs.org/guide/essentials/reactivity-fundamentals#limitations-of-reactive) ため、リアクティブな状態を宣言する際は基本的に `ref` を用いるのが推奨されます。 |
24 |
| -:: |
| 15 | +watch(count, (newValue, oldValue) => { |
| 16 | + console.log(`count changed from ${oldValue} to ${newValue}`) |
| 17 | +}) |
| 18 | +``` |
25 | 19 |
|
26 |
| -`watch` は `computed` と同様にリアクティブ値の変化に応じて作用しますが、主に `console.log` や `fetch` のような副作用をリアクティブに実行するときに使います。 |
27 | 20 | プレイグラウンドでは、サーバーで管理している TODO アイテムを表示していますが、表示する ID が変化したときに新しいアイテムを取得するために `watch` による監視をしています。
|
28 | 21 |
|
29 | 22 | `watch` に関する詳しい説明は [ウォッチャーガイド](https://ja.vuejs.org/guide/essentials/watchers) を参照してください。
|
30 | 23 |
|
31 |
| -## チャレンジ問題 |
| 24 | +## チャレンジ |
32 | 25 |
|
33 |
| -今のプレイグラウンドは、TODO アイテムに関するデータを `todoId` と `todoData` の 2 つのリアクティブ値として管理しています。これらを 1 つの `todoData` にまとめましょう。 |
34 |
| -これらのステップを実行することで、`reactive` と `watch` の理解を深めることができるのでぜひ挑戦してみてください! |
| 26 | +今のプレイグラウンドは、TODO アイテムに関するデータを `id` と `data` の 2 つのリアクティブ値として管理しています。これらを 1 つの `state` という ref オブジェクトにまとめてみましょう。 |
35 | 27 |
|
36 |
| -1. `todoData` に `id` プロパティを追加し、`todoId` を消しましょう。 |
37 |
| -2. エラー箇所にしたがって、`todoId` と書いてある箇所を `todoData.id` に変えましょう。 |
38 |
| - - これで `watch` 以外のエラーは解消されるはずです。 |
| 28 | +1. `state` という変数を作成し、`id` と `data` と `loading` を `state` にまとめましょう。 |
| 29 | +2. エラー箇所にしたがって、`id`, `loading`, `data` と書いてある箇所はそれぞれ `state.value.id`, `state.value.loading`, `state.value.data` に書き換えましょう。 |
| 30 | + - template 内では `.value` を書く必要はありません |
39 | 31 | 3. `watch` の第一引数をゲッター関数に変えましょう。
|
40 |
| - - `todoData.id` のままだと数値を渡していることになるため、`watch` が変化を補足できません。 |
| 32 | + - `state.value.id` のままだと数値を渡していることになるため、`watch` が変化を補足できません。 |
41 | 33 |
|
42 | 34 | もし手詰まりになったら、解決策を確認するためのボタンをクリックして、ヒントを得ることができます。
|
43 | 35 | :ButtonShowSolution{.bg-faded.px4.py2.rounded.border.border-base.hover:bg-active.hover:text-primary.hover:border-primary:50}
|
|
0 commit comments