質問するログイン新規登録

Q&A

解決済

1回答

2533閲覧

Vueの初歩的なコードでCannot read property 'data' of undefined。。

sutefu23

総合スコア11

Vue.js

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

0グッド

0クリップ

投稿2020/01/22 01:56

0

0

お世話になります。
初歩的な質問で恐縮ですが、Vueで下記のように書いた時にテキストエリアで書いた文字をmethodのdoAction内で取得したい時に、「実行」ボタンを押すと、
Cannot read property 'message' of undefined
のエラーメッセージが出るのは何故なのでしょうか。。

初歩的なので逆に原因が分からず混乱しております。。

vue.js

1<template> 2 <div class="message"> 3 <div class="message-area"> 4 <p>{{ message }}</p> 5 </div> 6 <hr> 7 <textarea v-model="message" cols="30" rows="10" /> 8 <button 9 @click="doAction" 10 > 11 実行 12 </button> 13 </div> 14</template> 15 16<script> 17export default { 18 name: 'Message', 19 data: () => { 20 return { 21 message: 'Please Enter ..' 22 } 23 }, 24 methods: { 25 doAction: () => { 26 alert(this.message) 27 } 28 } 29} 30</script>

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

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

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

NEO_PLANETT-777

2020/01/22 02:13

私も詳しくないけど、export default 部で、頭が大文字になってるからでは? message => Message
sutefu23

2020/01/22 02:26

ご回答誠にありがとうございます。 修正してみましたが、、同じ結果のようでした。 調べてみたところ、コンポーネント名はパスカルケースが推奨されているようでした。
NEO_PLANETT-777

2020/01/22 02:36

文末のセミコロン;必要ですよね? あれ?違った??
sutefu23

2020/01/22 02:47

これがですねー。。自分も最初は気持ち悪かったのですが、最近は「要らないだろ」派が席捲してるみたいなんです。。 https://blog.tai2.net/automatic_semilocon_insertion.html 少なくともVueに同梱されいてるEslintを入れるとデフォルト設定ではセミコロンを入れると弾かれます。 ああ、自分の書き方は時代遅れになったのかな、、とその時思いました。
NEO_PLANETT-777

2020/01/22 04:02

自分も時代遅れですねw
guest

回答1

0

ベストアンサー

Vueは初心者なので理由はまったくわかりませんが、methodsの関数の書き方に問題があるのかなと思います。
参考記事
https://michaelnthiessen.com/this-is-undefined/

上記記事によるとどうもmethodsでXXX:()=>{}の矢印関数を使うとthisにアクセスできないようです。
下記のような感じで書くとthisでアクセスできます。

Vue

1<template> 2 <div class="message"> 3 <div class="message-area"> 4 <p>{{ message }}</p> 5 </div> 6 <hr> 7 <textarea v-model="message" cols="30" rows="10" /> 8 <button @click="doAction"> 9 実行 10 </button> 11 <button @click="doAction2"> 12 実行 13 </button> 14 </div> 15</template> 16 17<script> 18export default { 19 name: 'Message', 20 data: () => { 21 return { 22 message: 'Please Enter ..' 23 } 24 }, 25 methods: { 26 doAction() { 27 alert('doAction1' + this.message) 28 }, 29 doAction2() { 30 alert('doAction2' + this.message) 31 } 32 } 33} 34</script>

投稿2020/01/22 03:01

退会済みユーザー

退会済みユーザー

総合スコア0

sutefu23

2020/01/22 03:04

ああ!そうですね! うっかりしていました。。 まさにそれによるものだと思います。 Eslintを入れているとアロー演算子を強要されるので、思わずそれで間違えてしまいました。
NEO_PLANETT-777

2020/01/22 04:02

勉強になりました。
sutefu23

2020/01/22 05:15

ホントありがとうございます。 自己レスですが eslintのobject-shorthandのエラーを回避したい場合(functionを使えない場合)、下記なら可能です。 ```` methods: { doAction () { alert(this.message) } ```
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.25%

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

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

質問する

関連した質問