回答編集履歴

1

長文追記した。

2020/08/17 06:23

投稿

dameo
dameo

スコア943

test CHANGED
@@ -159,3 +159,277 @@
159
159
  </html>
160
160
 
161
161
  ```
162
+
163
+ ## 追記
164
+
165
+ 長々と書くのもアレだったので短く書きすぎました。解決後ですが追記しておきます。
166
+
167
+
168
+
169
+ まず、nuxt.jsを使ったもので説明します。
170
+
171
+ ``npx create-nuxt-app sample-nuxt``を↓な感じで作ります。
172
+
173
+ ```text
174
+
175
+ create-nuxt-app v3.2.0
176
+
177
+ ✨ Generating Nuxt.js project in sample-nuxt
178
+
179
+ ? Project name: sample-nuxt
180
+
181
+ ? Programming language: JavaScript
182
+
183
+ ? Package manager: Npm
184
+
185
+ ? UI framework: Vuetify.js
186
+
187
+ ? Nuxt.js modules: (Press <space> to select, <a> to toggle all, <i> to invert selection)
188
+
189
+ ? Linting tools: (Press <space> to select, <a> to toggle all, <i> to invert selection)
190
+
191
+ ? Testing framework: None
192
+
193
+ ? Rendering mode: Single Page App
194
+
195
+ ? Deployment target: Server (Node.js hosting)
196
+
197
+ ? Development tools: (Press <space> to select, <a> to toggle all, <i> to invert selection)
198
+
199
+ ```
200
+
201
+ 次に以下のファイルを作ったり、置き換えたりします。
202
+
203
+
204
+
205
+ **pages/index.vue**
206
+
207
+ ```vue
208
+
209
+ <template>
210
+
211
+ <v-container>
212
+
213
+ <counter />
214
+
215
+ </v-container>
216
+
217
+ </template>
218
+
219
+
220
+
221
+ <script>
222
+
223
+ import Counter from "~/components/Counter.vue";
224
+
225
+
226
+
227
+ export default {
228
+
229
+ components: {
230
+
231
+ Counter,
232
+
233
+ },
234
+
235
+ };
236
+
237
+ </script>
238
+
239
+ ```
240
+
241
+ **components/Counter.vue**
242
+
243
+ ```vue
244
+
245
+ <template>
246
+
247
+ <v-card>
248
+
249
+ <v-card-title>{{ count }}</v-card-title>
250
+
251
+ <v-card-actions>
252
+
253
+ <v-btn text @click="increment()">increment</v-btn>
254
+
255
+ <v-btn text @click="push()">push</v-btn>
256
+
257
+ </v-card-actions>
258
+
259
+ </v-card>
260
+
261
+ </template>
262
+
263
+
264
+
265
+ <script>
266
+
267
+ import { mapMutations, mapGetters } from 'vuex'
268
+
269
+
270
+
271
+ export default {
272
+
273
+ name: "Counter",
274
+
275
+ computed: {
276
+
277
+ count: function () {
278
+
279
+ return this.$store.getters['counterstore/count'];
280
+
281
+ },
282
+
283
+ },
284
+
285
+ methods: {
286
+
287
+ increment: function () {
288
+
289
+ console.log("vue_component: this.$vuetify=" + this.$vuetify);
290
+
291
+ this.$store.commit("counterstore/increment");
292
+
293
+ },
294
+
295
+ push: function () {
296
+
297
+ this.$store.commit("counterstore/push", this.$vuetify);
298
+
299
+ },
300
+
301
+ },
302
+
303
+ };
304
+
305
+ </script>
306
+
307
+ ```
308
+
309
+ **store/counterstore.js**
310
+
311
+ ```javascript
312
+
313
+ export const state = () => ({
314
+
315
+ counter: 0
316
+
317
+ })
318
+
319
+
320
+
321
+ export const mutations = {
322
+
323
+ increment(state) {
324
+
325
+ state.counter++;
326
+
327
+ console.log("store_increment: this.$vuetify =" + this.$vuetify);
328
+
329
+ },
330
+
331
+ push(state, args) {
332
+
333
+ // 無理矢理受け渡す
334
+
335
+ this.$vuetify = args;
336
+
337
+ console.log("store_push: this.$vuetify is set!");
338
+
339
+ }
340
+
341
+ }
342
+
343
+
344
+
345
+ export const getters = {
346
+
347
+ count(state) {
348
+
349
+ if (this != null) {
350
+
351
+ console.log('store_getters: this.$vuetify =' + this.$vuetify);
352
+
353
+ } else {
354
+
355
+ console.log('store_getters: this =' + this);
356
+
357
+ }
358
+
359
+ return state.counter;
360
+
361
+ },
362
+
363
+ }
364
+
365
+ ```
366
+
367
+ 動かすと、初期画面がこんな感じになります。
368
+
369
+ ![イメージ説明](088602bcf8b96781446acb0d27a9343d.png)
370
+
371
+
372
+
373
+ consoleの表示は、
374
+
375
+ ```text
376
+
377
+ store_getters: this =undefined
378
+
379
+ ```
380
+
381
+ な感じです。gettersでは呼出元が関数呼出してるので、thisが入っていません。
382
+
383
+ まずgettersを使うとthis.$vuetifyは無理なのですよ。
384
+
385
+
386
+
387
+ 次にINCREMENTボタンを押します。するとconsoleは
388
+
389
+ ```text
390
+
391
+ vue_component: this.$vuetify=[object Object]
392
+
393
+ store_increment: this.$vuetify =undefined
394
+
395
+ store_getters: this =undefined
396
+
397
+ ```
398
+
399
+ と出ています。vueコンポーネントからはthis.$vuetifyが入っていますが、生成時にプラグインからそういうのを入れるカラクリがないstoreにはthis.$vuetifyが入っていないのが分かります。
400
+
401
+
402
+
403
+ 仕方がないので実装したPUSHボタンを押すと...
404
+
405
+ ```text
406
+
407
+ store_push: this.$vuetify is set!
408
+
409
+ ```
410
+
411
+ 引数で無理矢理コンポーネントから参照してたvuetifyのインスタンスを渡されるので、storeにvuetifyが設定されます。
412
+
413
+
414
+
415
+ 再度INCREMENTを押すと...
416
+
417
+ ```text
418
+
419
+ vue_component: this.$vuetify=[object Object]
420
+
421
+ store_increment: this.$vuetify =[object Object]
422
+
423
+ store_getters: this =undefined
424
+
425
+ ```
426
+
427
+ store側のincrementでthis.$vuetifyが入ってることが分かります。getterでは相変わらず見えませんが...
428
+
429
+
430
+
431
+ つまり、**Vueコンポーネントでは見えるthis.$vuetifyも、Vuexからはインスタンス生成しただけでは見えない**ということです。またgettersからはどうやっても見えません(Vue.prototype.$vuetifyも駄目でした。今はそういう渡し方じゃないのかも)。で、それを伝えようとしたのが最初のコードだったわけです。なお、この辺TypeScriptだとまた事情が変わるかもです。そのクラス表記はさらに不明です。
432
+
433
+
434
+
435
+ 長文失礼しました。詳しい部分じゃないので、間違ってたら指摘お願いします。