Skip to content

Commit 51911b3

Browse files
authored
Migrate ja todo list to 09.workspace and remove legacy directory per fix/todo fix #273 (#277)
* 09 workspaceを最新データに変更 * ゼロパディングなし toso-list を削除 * fix: 誤って削除したファイルを戻す
1 parent 15fc61b commit 51911b3

File tree

65 files changed

+56
-7690
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

65 files changed

+56
-7690
lines changed

content/ja/09.workspace/01.todo-list/06.v-model/index.md

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,10 @@ Vueでは [`v-model`](https://ja.vuejs.org/api/built-in-directives.html#v-model)
2626
```vue
2727
<!-- template -->
2828
<!-- :value がバインド、 @input がイベント監視 -->
29-
<input :value="message" @input="message = $event.target.value" type="text" />
29+
<input :value="text" @input="(event) => text = event.target.value" type="text" />
3030
3131
<!-- 上と同じ -->
32-
<input v-model="message" type="text" />
32+
<input v-model="text" type="text" />
3333
```
3434

3535
フォームタイプごとにバインドされる属性やイベントが異なります:
@@ -42,13 +42,13 @@ Vueでは [`v-model`](https://ja.vuejs.org/api/built-in-directives.html#v-model)
4242

4343
```vue
4444
<script setup lang="ts">
45-
const memo = ref('')
45+
const note = ref('')
4646
const isDone = ref(true)
4747
const showUnDoneOnly = ref(false)
4848
</script>
4949
5050
<template>
51-
<textarea v-model="memo" placeholder="メモを入力" />
51+
<textarea v-model="note" placeholder="メモを入力" />
5252
5353
<input v-model="isDone" :value="true" type="radio">完了
5454
<input v-model="isDone" :value="false" type="radio">未完了
@@ -92,26 +92,26 @@ const showUnDoneOnly = ref(false)
9292
## チャレンジ
9393

9494
次の手順に沿って、まずは `:checked` バインディングと `@change` イベント監視で、値が同期されるよう修正し、
95-
次に `v-model` で、値が同期されるよう修正して、 `v-model` の使い方を学びましょう
95+
次に `v-model` で、値が同期されるよう修正しましょう
9696

9797
### 1. `:checked``@change` による値の同期
9898

99-
`<input>``@change`イベントを使い、ユーザーがチェックボックスを変更したタイミングで`showUnDoneOnly`の値を切り替えましょう。これにより、`showUnDoneOnly`がユーザー操作に連動して変更されるようになります。
99+
`<input>``@change` イベントを使い、ユーザーがチェックボックスを変更したタイミングで `showUnDoneOnly` の値を切り替えましょう。これにより、 `showUnDoneOnly` がユーザー操作に連動して変更されるようになります。
100100

101101
```vue
102-
<!-- template -->
102+
<!-- app.vue: template -->
103103
<input
104104
:checked="showUnDoneOnly"
105105
type="checkbox"
106-
@change="showUnDoneOnly = $event.target.checked"
106+
@change="(event) => showUnDoneOnly = event.target.checked"
107107
>
108108
未完了のみ表示
109109
```
110110

111111
### 2. `v-model` による値の同期
112112

113-
次に、`:checked``v-model`に切り替えて、 `@change` の値変更のコードを削除しましょう。
114-
そうすることで、 `v-model` の双方向データバインディングによって、バインドとイベント監視の指定がなくても、値が自動的に同期されるようになります。
113+
次に、 `<input>``:checked``v-model`に切り替えて、 `@change` の値変更のコードを削除しましょう。
114+
そうすることで、 `v-model` だけで、バインドとイベント監視の指定がなくても、値が自動的に同期されるようになります。
115115

116116
もし行き詰まったら、以下のボタンをクリックして解答を見ることができます。
117117
:ButtonShowSolution

content/ja/09.workspace/01.todo-list/07.reactivity-2/index.md

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,11 @@ const color = computed(() => grade.value === 'A' ? '#ff0000' : 'inherit')
2525
</template>
2626
```
2727

28-
`score` が変わると自動で `grade` が自動で再計算されます
28+
`score` が変わると自動で `grade` が再計算されます
2929
逆に `score` が変わらない限り、何度使っても前回の計算結果を使います。
3030

3131
変数 `color` に注目してください。依存データに `computed` を利用することもできます。
32-
`grade` が変わると、 `<p>` のstyle属性 `color` プロパティ値がリアクティブに変更されます。
32+
`grade` が変わると、 `<p>` 要素のstyle属性 `color` プロパティ値がリアクティブに変更されます。
3333

3434
::note
3535
値は `ref` と同じく `.value` を通してアクセスすることができます。
@@ -113,12 +113,15 @@ const doubled = computed({
113113

114114
次の手順に沿って実装してみましょう。
115115

116-
1. `<script setup>` の中で、新しく `filteredTodos` という算出プロパティ( `computed` )を定義しましょう。この中で、`showUnDoneOnly` の値によって表示するTodoリストを切り替えるロジックを書きます
116+
1. `<script setup>` の中で、 `filteredTodos` という算出プロパティ( `computed` )を定義しましょう。
117117

118-
2. `showUnDoneOnly``true` の場合は「 `done: false` のTodoのみ」を返し`showUnDoneOnly``false` の場合は「すべてのTodo」を返すようにコードを組みましょう
118+
2. `filteredTodos` の実装をしましょう。`showUnDoneOnly` の値によって`todos` の絞り込みをします
119119

120-
3. 今までは `:todos="todos"` で直接全てのリストを渡していましたが、
121-
実装した `filteredTodos``TodoList` コンポーネントに渡してみましょう。
120+
- `showUnDoneOnly``true` の場合は、 `done: false` のTodoのみを返します
121+
- `showUnDoneOnly``false` の場合は、すべてのTodoを返します
122+
123+
3. `TodoList` コンポーネントに `:todos="todos"` で、全てのリストを渡していましたが、
124+
1,2 で実装した `filteredTodos``TodoList` コンポーネントの `todos` propsに渡してみましょう。
122125

123126
もし行き詰まったら、以下のボタンをクリックして解答を見ることができます。
124127
:ButtonShowSolution

content/ja/09.workspace/01.todo-list/08.componentization-3/index.md

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,11 @@ const showUnDoneOnly = ref(true)
3434
</template>
3535
```
3636

37+
::note
38+
[`$event`](https://ja.vuejs.org/guide/essentials/event-handling.html#accessing-event-argument-in-inline-handlers) は、「その場で起きたイベントそのもの」を受け取るためのプレースホルダーです。
39+
上記コードの `v-on` は、 `@update:model-value="(event) => showUnDoneOnly = event"` と置き換えることができます。
40+
::
41+
3742
```vue
3843
<!-- IncompleteOnlyToggle: 子コンポーネント -->
3944
<script setup lang="ts">
@@ -52,16 +57,16 @@ const emit = defineEmits<{
5257
<input
5358
:checked="modelValue"
5459
type="checkbox"
55-
@change="emit('update:modelValue', $event.target.checked)"
60+
@change="(event) => emit('update:modelValue', event.target.checked)"
5661
>
5762
未完了のみ表示
5863
</label>
5964
</template>
6065
```
6166

62-
親から `props` `modelValue` で、値を受け取り、
63-
子は `emit``update:modelValue` で、更新後の値を送信し、
64-
親が、 `v-on` `update:modelValue` で、子が送信した値を受け取り、状態を更新
67+
- 親から `props` `modelValue` で、値を受け取り、
68+
- 子は `emit``update:modelValue` で、更新後の値を送信し、
69+
- 親が、 `v-on` `update:modelValue` で、子が送信した値を受け取り、状態を更新
6570

6671
をすることで、親子の値の同期ができますが、これらをシンプルにしたのが `v-model` です。
6772

@@ -96,7 +101,7 @@ const checked = defineModel()
96101
<input
97102
:checked="checked"
98103
type="checkbox"
99-
@change="checked = $event.target.checked"
104+
@change="(event) => checked = event.target.checked"
100105
>
101106
-->
102107
未完了のみ表示
@@ -176,15 +181,15 @@ const emit = defineEmits<{
176181
<input
177182
:checked="isShowUnDone"
178183
type="checkbox"
179-
@change="emit('update:isShowUnDone', $event.target.checked)"
184+
@change="(event) => emit('update:isShowUnDone', event.target.checked)"
180185
>
181186
未完了を表示
182187
</label>
183188
<label>
184189
<input
185190
:checked="isShowExpired"
186191
type="checkbox"
187-
@change="emit('update:isShowExpired', $event.target.checked)"
192+
@change="(event) => emit('update:isShowExpired', event.target.checked)"
188193
>
189194
期限切れを表示
190195
</label>
@@ -224,9 +229,10 @@ TODOリストに、新規タスクを追加するために、
224229
`app.vue``isCreateModalOpen` の状態が、モーダルの表示を制御していますので、
225230
`isCreateModalOpen``v-model` で同期させることがゴールです。
226231

227-
1. 子コンポーネントで `defineModel()` を使って、`modelValue`(または任意の名前)を定義する
228-
2. モーダルの「閉じる」ボタンをクリックしたら、この値が `false` になるようにする
229-
3. 親コンポーネントから `v-model``isCreateModalOpen` を子に渡して動作を確認する
232+
1. `AppModal.vue`(子コンポーネント)に `defineModel()``modelValue` を定義しましょう。
233+
`defineModel()` 返り値は、変数 `isOpen` に格納します。
234+
2. `AppModal.vue` の「閉じる」ボタンをクリックしたら、`isOpen``modelValue`)の値を `false` にしましょう。
235+
3. `app.vue`(親コンポーネント)で `AppModal` コンポーネントへ `v-model``isCreateModalOpen` を渡しましょう。
230236

231237
もし行き詰まったら、以下のボタンをクリックして解答を見ることができます。
232238

content/ja/09.workspace/01.todo-list/09-1.v-slot/index.md

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -79,8 +79,8 @@
7979

8080
## フォールバックコンテンツ(デフォルト)
8181

82-
親から `slot` が渡されなかった場合に、フォールバック(つまりデフォルト)を設定することもできます。
83-
やり方は`slot` タグの間にフォールバックコンテンツを設定します
82+
親からスロットコンテンツが渡されなかった場合に、フォールバック(つまりデフォルト)を設定することもできます。
83+
やり方は `<slot>` 要素の間に、フォールバックコンテンツを設定します
8484

8585
```vue
8686
<!-- AppButton: 子コンポーネント -->
@@ -111,9 +111,10 @@
111111

112112
## 名前付きスロット
113113

114-
スロットに名前を付けると、1つのコンポーネントに複数の差し込み場所(スロットアウトレット)が作れます。
114+
`<slot>` に名前を付けると、1つのコンポーネントに複数の差し込み場所(スロットアウトレット)が作れます。
115115

116116
名前付きのスロットコンテンツを渡すためには、 `v-slot` を利用します。(例: `<template v-slot:title>`
117+
117118
`v-slot``#` で省略表記ができます。(例: `<template #:title>`
118119

119120
```vue
@@ -140,7 +141,7 @@
140141
<template>
141142
<AppModal>
142143
<template #title>
143-
<!-- v-slot. 左のように # で省略表記ができます -->
144+
<!-- v-slot. 上のように # で省略表記ができます -->
144145
<!-- ↓ titleという名前の スロットコンテンツ -->
145146
<span>✏️</span>
146147
<span class="padding-start-1">タスクの編集</span>
@@ -203,7 +204,7 @@
203204

204205
## チャレンジ
205206

206-
### 1. AppModal.vue に slot を追加
207+
### 1. `AppModal.vue``<slot>` を追加
207208

208209
`AppModal.vue` に、
209210

@@ -212,13 +213,13 @@
212213

213214
が差し込みできるよう、 `<slot>` を追加してみましょう。
214215

215-
1. `AppModal.vue``<h2>新規作成モーダル</h2>` を削除して `<slot name="title" />` を追加
216-
2. `AppModal.vue` に、モーダルコンテンツを追加するための `<slot />` を追加
216+
1. `AppModal.vue``<h2>新規作成モーダル</h2>` を削除して `<slot name="title" />` を追加しましょう。
217+
2. `AppModal.vue` に、モーダルコンテンツを追加するための `<slot />` を追加しましょう。
217218

218-
### 1. モーダルに、モーダルタイトルと新規作成フォームを表示
219+
### 2. `AppModal` コンポーネントに、モーダルタイトルと新規作成フォームの `v-slot` を追加
219220

220-
1. `app.vue` 側で `AppModal.vue` に表示する、モーダルタイトル `<h2>タスクの新規作成</h2>`を追加
221-
1. `app.vue` 側で `AppModal.vue` に表示する、以下のHTMLを追加
221+
1. `app.vue` `AppModal` コンポーネントに、モーダルタイトルの `v-slot` `<template #title><h2>タスクの新規作成</h2></template>` を追加しましょう。
222+
1. `app.vue` `AppModal` コンポーネントに、 `v-slot` (名前なし)に、以下のHTMLを追加しましょう。
222223

223224
```html
224225
<form>

content/ja/09.workspace/01.todo-list/09-2.todo-app-goal/index.md

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,25 @@
11
# 復習・まとめ
22

33
TODOリストの作成を通して学べる、基本的なVue.jsの機能の説明は以上になります。
4+
45
それでは、これまで学んだ機能を利用して、TODOリストのアプリケーションを完成させましょう。
6+
これまで学んだ知識を活かせば実装できます。ぜひ自分のやり方で挑戦してみてください。
7+
8+
## 現在の実装の課題
9+
10+
タスクの新規作成モーダルに、タイトル、メモ、期限を入力して、「登録」ボタンをクリックしても、
11+
TODOリストにタスクを追加することがきません。
512

613
## チャレンジ
714

8-
フォームが表示されたら、いよいよ実際にデータを登録できるようにして、TODOリストを完成させましょう!
9-
これまで学んだ知識を活かせば実装できます。ぜひ自分のやり方で挑戦してみてください
15+
タスクの新規作成モーダルで入力されたフォーム(タイトル、メモ、期限)データを、
16+
フォーム送信で、TODOリストへタスク追加できるようにしましょう
1017

1118
**実装のヒント(例)**
1219

1320
1. 各フォーム入力欄に対応するリアクティブ変数( `ref` )を用意し、 `v-model` でフォームと同期させる
1421
2. フォームの submitイベントに `handleSubmit` などの関数を渡す
15-
3. `handleSubmit` 内で、以下の情報を持つ新しい `Todo` オブジェクトを作成し、 `todos.value` の先頭に追加
22+
3. `handleSubmit` 内で、以下の情報を持つ新しい `Todo` オブジェクトを作成し、 `todos.value` の先頭に追加する
1623
- フォームから入力された値
1724
- `done: false`(新規作成時は未完了)
1825
- `id: Date.now()`(一意なID)

0 commit comments

Comments
 (0)