質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

Vuetify.js

Vuetify.jsは、マテリアルデザインを基本とするVue.jsのCSSフレームワークです。多くのマテリアルデザインのコンポーネントを提供しており、あらゆるアプリケーションに対応可能。vue-cli用テンプレートがあり、簡単にページを作成できます。

Vue CLI

Vue CLIは、Vue.jsでアプリケーション開発を行うためのコマンドラインインタフェース(CLI)に基づいた開発ツールです。インタラクティブなプロジェクトの雛形や設定なしで使用できるプロトタイプの作成など、さまざまな機能が用意されています。

Q&A

解決済

1回答

646閲覧

vuetify v-menu内でthisが使えない

ryohasegawa

総合スコア437

Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

Vuetify.js

Vuetify.jsは、マテリアルデザインを基本とするVue.jsのCSSフレームワークです。多くのマテリアルデザインのコンポーネントを提供しており、あらゆるアプリケーションに対応可能。vue-cli用テンプレートがあり、簡単にページを作成できます。

Vue CLI

Vue CLIは、Vue.jsでアプリケーション開発を行うためのコマンドラインインタフェース(CLI)に基づいた開発ツールです。インタラクティブなプロジェクトの雛形や設定なしで使用できるプロトタイプの作成など、さまざまな機能が用意されています。

0グッド

0クリップ

投稿2020/10/29 11:11

このページのメニューを表示するサンプルを改良してページを作っているのですが、v-menu<template v-slot:activator="{ on, attrs }">内でthisを参照すると

[Vue warn]: Error in render: "TypeError: can't access property "$store", this is null" found in ---> <VMenu> <VAppBar> <Header> at src/components/Header.vue <VApp> <App> at src/App.vue <Root>

と怒られてしまいます...

js

1 <div class="text-center"> 2 <v-menu offset-y> 3 {{this.$store.getters.userData.first_name+ " " +this.$store.getters.userData.last_name + " さん"}} <!-- ここだと使える --> 4 <template v-slot:activator="{ on, attrs }"> 5 {{this.$store.getters.userData.first_name+ " " +this.$store.getters.userData.last_name + " さん"}} <!-- ここだと使えない --> 6 <v-btn 7 color="primary" 8 dark 9 v-bind="attrs" 10 v-on="on" 11 > 12 </v-btn> 13 </template> 14 15 <v-list> 16 <v-list-item 17 v-for="(item, index) in items" 18 :key="index" 19 > 20 <v-list-item-title>{{ item.title }}</v-list-item-title> 21 </v-list-item> 22 </v-list> 23 </v-menu> 24 </div>

といった感じです。
ここでthisが使えなくて困っています。
回答お願いします

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

名前付きslot v-slot:activator のコンテキスト内ではthisがグローバルのdocumentを指していることが原因ではないかと思われます。
template内では、 this は省略可能です。以下のように、$store.getters.XXX と直接指定することで、適切にstoreの各プロパティにアクセスできるようになるかと思います。

html

1<div class="text-center"> 2 <v-menu offset-y> 3 <template v-slot:activator="{ on, attrs }"> 4 {{ $store.getters.userData.first_name + ' ' + $store.getters.userData.last_name + ' さん' }} 5 <v-btn color="primary" dark v-bind="attrs" v-on="on"> </v-btn> 6 </template> 7 8 <v-list> 9 <v-list-item v-for="(item, index) in items" :key="index"> 10 <v-list-item-title>{{ item.title }}</v-list-item-title> 11 </v-list-item> 12 </v-list> 13 </v-menu> 14</div>

もしくは、次のように予め定義したcomputedプロパティ経由でアクセスすることも可能です。

js

1 computed: { 2 firstName: function () { 3 return this.$store.getters.userData.first_name; 4 }, 5 lastName: function () { 6 return this.$store.getters.userData.last_name; 7 }, 8 },

html

1<div class="text-center"> 2 <v-menu offset-y> 3 <template v-slot:activator="{ on, attrs }"> 4 {{ firstName + ' ' + lastName + ' さん' }} 5 <v-btn color="primary" dark v-bind="attrs" v-on="on"> </v-btn> 6 </template> 7 8 <v-list> 9 <v-list-item v-for="(item, index) in items" :key="index"> 10 <v-list-item-title>{{ item.title }}</v-list-item-title> 11 </v-list-item> 12 </v-list> 13 </v-menu> 14</div>

投稿2020/10/30 21:19

DaikiOjima

総合スコア271

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ryohasegawa

2020/10/31 12:19

ありがとうございます。 thisを外すことによって解決できました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問