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

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

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

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

Q&A

解決済

1回答

12731閲覧

v-on:clickが動作しない|vueが実行されていない?

ruuusaamarki

総合スコア468

Vue.js

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

0グッド

0クリップ

投稿2019/02/03 03:39

前提・実現したいこと

2016年出版のある書籍のサンプルが動かない状況です。

発生している問題・エラーメッセージ

デベロッパーツールのコンソールを確認しても
エラーメッセージは特に表示されません。

該当のソースコード

index.html

1<!doctype html> 2<html lang="ja"> 3<head> 4 <meta charset="UTF-8"> 5 <meta name="viewport" 6 content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> 7 <meta http-equiv="X-UA-Compatible" content="ie=edge"> 8 <title>vue-lessons</title> 9 <script src="https://npmcdn.com/vue/dist/vue.js"></script> 10 <script src="main.js"></script> 11 <link rel="stylesheet" href="style.css"> 12</head> 13<body> 14<div onload="initial();"> 15<h1>Vue.js</h1> 16<p id="msg" v-bind:class="{'a':isA, 'b':isB}" v-on:click="change();">クラスを操作します。</p> 17</div> 18</body> 19</html>

style.css

1.a { 2 color:red; 3 background: white; 4} 5.b { 6 color:white; 7 background:blue; 8}

main.js

1function initial() { 2 new Vue({ 3 el:'#msg', 4 data: { 5 isA: true, 6 isB: false 7 }, 8 methods: { 9 change: function(){ 10 this.isA = !this.isA; 11 this.isB = !this.isB; 12 } 13 } 14 }) 15}

試したこと

デベロッパーツールのhtmlを確認すると

index.html

1<p id="msg" v-bind:class="{'a':isA, 'b':isB}" v-on:click="change();">クラスを操作します。</p>

と展開されていなかったので

index.html

1v-on:click="change"

index.html

1<p id="msg" v-bind:class="'a':isA">クラスを操作します。</p>

など試してみましたが変化はありませんでした。

またcss、js、vueなどの読み込みはデベロッパーツールで確認できています。

補足情報(FW/ツールのバージョンなど)

このサンプルの前のページのサンプルまでは動作しており
v-on:clickも動作しておりました。

おそらく書籍が書かれた当時とvueのバージョンが違うのだと思い
調べてみたのですが、解決策が見つけられず
皆様のお力をお借りだ来たらとこちらに書かせていただいております。
よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

完全に原因を説明できるわけではありませんが、解決策(動作確認済み)をいくつか。


解決策1 bodyにonload="initial();"を移動させる


解決策2 scriptをhtmlロード後に実行されるようにする。
→ divのonloadを外し、<script src="main.js"></script>をbodyの最後に配置して、main.jsの最後でinitial();を呼び出すコードを配置。
もしくはdivのonloadを外し、main.jsをたとえば

window.onload = function () { new Vue({ el:'#msg', data: { isA: true, isB: false }, methods: { change: function(){ this.isA = !this.isA; this.isB = !this.isB; } } }) };

こんな感じに書き換える。


以上でやっていることは全てhtmlロード後にscriptを実行するということだけです。

おそらくですが、

  1. divのonloadが上手く動いていない
  2. divのonloadは動いているが、上手くvue側がpを取得できていない。

のどちらかが原因だと思われるので、読み込みをhtmlロード後に変えたら動作するというわけです。

私が見てきた限りでは特殊な事情が無い限りonload属性を使うことはそんなにないと思うので、比較的ポピュラーなbodyの最後で読み込みもしくはwindow.onloadを使う方法をオススメします。

投稿2019/02/03 04:43

michael-ilcsy

総合スコア180

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

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

ruuusaamarki

2019/02/03 05:07

michaelyuki0908さんコメントありがとうございます! すみません、1の方法で難なく解決できました。 イージーミスでお騒がせいたしました^^; ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問