質問編集履歴

3

タイトル変更

2020/06/04 13:30

投稿

fork_
fork_

スコア43

test CHANGED
@@ -1 +1 @@
1
- trelloの設計方法が分からない
1
+ vueで、同じ値を参照してしまう
test CHANGED
File without changes

2

質問内容の変更

2020/06/04 13:30

投稿

fork_
fork_

スコア43

test CHANGED
File without changes
test CHANGED
@@ -1,29 +1,365 @@
1
- vue.jsでTrello風アプリケーションを作ろうと思っているのですが、全体の設計方法が分からない状態です
2
-
3
- 実現したいこととして、最終は画像のよう形にしたいです。
4
-
5
- 4つのコンポーネント間を、vue-draggable使用して移動できようにしたいです
6
-
7
- 下記の4つのコンポーネントに分け、コンポーネント間Todoが行き来た場合、親子間の通信とう感じではなさそうです
8
-
9
- この場合、Vuex使用するのがベストなのでしょうか??
10
-
11
-
12
-
13
- ```
14
-
15
- notStarted(未着手)コンポーネント
16
-
17
- inProgress(進行中)コンポーネント
18
-
19
- pending(確認待ち)コンポーネント
20
-
21
- done(完了)コンポーネント
22
-
23
- の4つのコンポーネントに分け。 各コンポーネントにおいてタスクを追加ボタンを押したらテキストボックスが現れる
24
-
25
- ```
26
-
27
-
28
-
29
- ![イメージ説明](fb784debbf9e4a7264d07dc0e3ec8c8f.png)
1
+ Trello風アプリを作成中です。
2
+
3
+ 主なコンポーネントの詳細下記にります。
4
+
5
+ App.vue(親コンポーネント)・・・主にList.vueを表示させだけのもの
6
+
7
+ List.vue(親コンポーネント)・・・card.vue,inputComponent.vue内包したもの。配列や入力するtodoの値などを保持
8
+
9
+ card.vue(子コンポーネント)・・・List.vueからpropsで値が渡ってきて、todoと削除ボタン表示させ
10
+
11
+ inputComponent.vue(子コンポーネント)・・・todoを追加するためのもの。List.vueから入力するtodoの値がpropsで渡ってきて、その値をemitでList.vueに渡している。
12
+
13
+
14
+
15
+ ![イメージ説明](59b2311da103d9ce84b6bdbb19f7b5cc.png)
16
+
17
+
18
+
19
+
20
+
21
+ List.vue側で、card.vueとinputcomponent.vueを内包している状態です。
22
+
23
+ card.vueとinputcomponent.vueを内包したList.vue単体で表示していときはうまくTODOの作成、削除ができました。
24
+
25
+
26
+
27
+ ですが、List.vueをApp.vueに2個表示させた時に、同じ配列の値を参照しているのでlocalstorageにはList.vue1つ分のコンポーネントの値しか保存されませんでした。
28
+
29
+ 例えばList.vue4つ表示したい場合、どのような設計が望ましいのでしょうか。。なかなか思いつかず、苦戦中です。。
30
+
31
+ ご教示のほど、よろしくお願い致します。
32
+
33
+
34
+
35
+ 各コンポーネントは下記になります。
36
+
37
+
38
+
39
+ App.vueコンポーネント
40
+
41
+ ```
42
+
43
+ <template>
44
+
45
+ <div id="app">
46
+
47
+ <div class="container">
48
+
49
+ <List />
50
+
51
+ <List />
52
+
53
+ </div>
54
+
55
+ </div>
56
+
57
+ </template>
58
+
59
+
60
+
61
+ <script>
62
+
63
+ import List from './components/List';
64
+
65
+ export default {
66
+
67
+ data() {
68
+
69
+ return {};
70
+
71
+ },
72
+
73
+ components: {
74
+
75
+ List,
76
+
77
+ },
78
+
79
+ methods: {},
80
+
81
+ };
82
+
83
+ </script>
84
+
85
+ ```
86
+
87
+
88
+
89
+
90
+
91
+ List.vueコンポーネント
92
+
93
+ ```
94
+
95
+ <template>
96
+
97
+ <div>
98
+
99
+ <h1>Listコンポーネント</h1>
100
+
101
+ <draggable :options="{ group: 'todos' }">
102
+
103
+ <card
104
+
105
+ v-for="todo in todos"
106
+
107
+ :key="todo.id"
108
+
109
+ :todo="todo"
110
+
111
+ @clicked-remove-todo="removetodo(todo)"
112
+
113
+ />
114
+
115
+ </draggable>
116
+
117
+ <input-component
118
+
119
+ @clicked-add-todo="addtodo"
120
+
121
+ :value="value"
122
+
123
+ @input="value = $event"
124
+
125
+ />
126
+
127
+ </div>
128
+
129
+ </template>
130
+
131
+
132
+
133
+ <script>
134
+
135
+ import card from './card';
136
+
137
+ import inputComponent from './inputComponent';
138
+
139
+ import draggable from 'vuedraggable';
140
+
141
+
142
+
143
+ export default {
144
+
145
+ data() {
146
+
147
+ return {
148
+
149
+ value: '',
150
+
151
+ uid: 0,
152
+
153
+ todos: [],
154
+
155
+ };
156
+
157
+ },
158
+
159
+ mounted() {
160
+
161
+ if (localStorage.getItem('todos')) {
162
+
163
+ try {
164
+
165
+ this.todos = JSON.parse(localStorage.getItem('todos'));
166
+
167
+ } catch (e) {
168
+
169
+ localStorage.removeItem('todos');
170
+
171
+ }
172
+
173
+ }
174
+
175
+ },
176
+
177
+ components: {
178
+
179
+ card,
180
+
181
+ inputComponent,
182
+
183
+ draggable,
184
+
185
+ },
186
+
187
+ methods: {
188
+
189
+ addtodo() {
190
+
191
+ if (this.value == '') {
192
+
193
+ return;
194
+
195
+ }
196
+
197
+ console.log('子コンポーネントのイベントをキャッチしました。');
198
+
199
+ const params = {
200
+
201
+ title: this.value,
202
+
203
+ id: this.uid++,
204
+
205
+ };
206
+
207
+ this.todos.push(params);
208
+
209
+ this.value = '';
210
+
211
+ this.savetodos();
212
+
213
+ },
214
+
215
+ removetodo(todo) {
216
+
217
+ this.todos.splice(this.todos.indexOf(todo), 1);
218
+
219
+ this.savetodos();
220
+
221
+ },
222
+
223
+ savetodos() {
224
+
225
+ //this.todos の値を保存
226
+
227
+ const parsed = JSON.stringify(this.todos);
228
+
229
+ localStorage.setItem('todos', parsed);
230
+
231
+ },
232
+
233
+ },
234
+
235
+ };
236
+
237
+ </script>
238
+
239
+
240
+
241
+ <style></style>
242
+
243
+
244
+
245
+ ```
246
+
247
+
248
+
249
+ cardコンポーネント
250
+
251
+ ```
252
+
253
+ <template>
254
+
255
+ <div>
256
+
257
+ <h2>カードコンポーネント</h2>
258
+
259
+ {{ todo.title }}
260
+
261
+ {{ todo }}
262
+
263
+ {{ todo.id }}
264
+
265
+ <button @click="removetodo">削除</button>
266
+
267
+ </div>
268
+
269
+ </template>
270
+
271
+
272
+
273
+ <script>
274
+
275
+ export default {
276
+
277
+ props: ['todo'],
278
+
279
+ methods: {
280
+
281
+ removetodo(todo) {
282
+
283
+ this.$emit('clicked-remove-todo', todo);
284
+
285
+ },
286
+
287
+ },
288
+
289
+ };
290
+
291
+ </script>
292
+
293
+
294
+
295
+ <style></style>
296
+
297
+
298
+
299
+ ```
300
+
301
+
302
+
303
+ inputコンポーネント
304
+
305
+ ```
306
+
307
+ <template>
308
+
309
+ <div>
310
+
311
+ <h2>inputコンポーネント</h2>
312
+
313
+ <input
314
+
315
+ type="text"
316
+
317
+ @keyup.enter="addtodo"
318
+
319
+ :value="value"
320
+
321
+ @input="$emit('input', $event.target.value)"
322
+
323
+ />
324
+
325
+ </div>
326
+
327
+ </template>
328
+
329
+
330
+
331
+ <script>
332
+
333
+ export default {
334
+
335
+ props: ['value'],
336
+
337
+ data() {
338
+
339
+ return {};
340
+
341
+ },
342
+
343
+ methods: {
344
+
345
+ addtodo() {
346
+
347
+ // 親コンポーネントであるList.vueにemitでイベントを発火させる。
348
+
349
+ this.$emit('clicked-add-todo');
350
+
351
+ },
352
+
353
+ },
354
+
355
+ };
356
+
357
+ </script>
358
+
359
+
360
+
361
+ <style></style>
362
+
363
+
364
+
365
+ ```

1

修正

2020/06/04 10:35

投稿

fork_
fork_

スコア43

test CHANGED
File without changes
test CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  4つのコンポーネント間を、vue-draggableを使用して移動できるようにしたいです。
6
6
 
7
- 下記の4つのコンポーネントに分け、コンポーネント間を行き来した場合、親子間の通信という感じではなさそうです。
7
+ 下記の4つのコンポーネントに分け、コンポーネント間をTodoが行き来した場合、親子間の通信という感じではなさそうです。
8
8
 
9
9
  この場合、Vuexを使用するのがベストなのでしょうか??
10
10