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

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

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

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

Q&A

解決済

2回答

13644閲覧

Vue.js でdata の値が反映されない

ShinoTatwu

総合スコア8

Vue.js

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

0グッド

1クリップ

投稿2018/11/26 11:19

編集2018/11/26 13:09

前提・実現したいこと

Vue.jsにて「あるボタンを押すと、別のボタンの活性非活性を変更する」
という処理を書いています。
ボタンにv-bind:disabled="isPush"をつけて、@clickにてmethodsの関数を呼び、
関数内で「isPush」の真偽値を切り替えているのですが、ボタンの活性状態が変化しません。

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

chromeのdevツールなどで確認したところ、どうやらdata で宣言している値が変更されていない様です。
console.logでは、変更された値が出力されるのですが、Vue devtools では値が変更されていません。

構成としては、初期読み込み用のmain.js ファイルからindex.html にマウントし、
大枠となるコンポーネントと、自作のナビゲーションコンポーネントを画面構成しています。

様々な記事をあさり、以下の対応をしてみましたがそれでも値が変わりません。

  • vue-router の設定(watch されていない可能性を考えて対処)
  • $set メソッドの使用(そもそもコンポーネント内でthis.$set を呼ぶと「not a function」エラーとなる)
  • $forceUpdate()の使用(上に同じくエラーとなる)

コンポーネント内でthisをconsole.log出力すると、記述した変数や関数などのobject ができているだけで、
VueComponent のオブジェクトになっていない気もします(data ではなくaというキーしかなかったので…)

以下、試行錯誤してぐちゃぐちゃだったので、ある程度編集したサンプルコードです。
必要な箇所以外は、所々省略してます。

webpack.config.js のentryに設定している 「main.js」

Vue.js

1import Vue from 'vue' 2import BootstrapVue from "bootstrap-vue" 3import Vuex from 'vuex' 4import VueRouter from 'vue-router' 5import "bootstrap/dist/css/bootstrap.min.css" 6import "bootstrap-vue/dist/bootstrap-vue.css" 7 8// parent 9import TopPanel from './TopPanel.vue' 10 11// childrens 12import InnerPanel from './component/InnerPanel.vue' 1314 15Vue.use(BootstrapVue) 16Vue.use(VueRouter) 17Vue.use(Vuex) 18 19const store = new Vuex.Store({ 20 state: {'…'} 21}); 22 23const router = new VueRouter({ 24 routes: [ 25 { path: '/', component: TopPanel, 26 children: [ 27 { path: '/inner', component: InnerPanel }, 28 ] 29 }, 30 ], 31}); 32 33 34const app = new Vue({ 35 el: '#app', 36 name: 'app', 37 store, 38 router, 39 components: { 40 TopPanel 41 }, 42 template: '<router-view></router-view>' 43})

「TopPanel.vue」
このvueでボタンの活性非活性を試行してみるとdisabledは変わらず、vue devtoolsでも値が変わりませんでした。

Vue.js

1<template> 2 <div id='top-panel' class="content-ground p-0 m-0"> 3 <div class="content-base d-flex p-1 border border-dark"> 4 <ul class="d-inline"> 5 <li><button class="btn btn-dark" v-on:click="pushedBtn(1)" :disabled="isPush1">button 1</button></li> 6 <li><button class="btn btn-dark" v-on:click="pushedBtn(2)" :disabled="isPush2">button 2</button></li> 7 </ul> 8 </div> 9 </div> 10</template> 11 12<script> 13export default { 14 name: 'top-panel', 15 data: () => { 16 return { 17 isPush1: false, 18 isPush2: false, 19 } 20 }, 21 methods: { 22 pushedBtn: (s) => { 23 if(s === 1){ 24 console.log(1 + ' disabled'); 25 this.isPush1 = true; 26 this.isPush2 = false; 27 } else if ( s === 2) { 28 console.log(2 + ' disabled'); 29 this.isPush2 = true; 30 this.isPush1 = false; 31 } 32 console.log(this); 33 } 34 } 35} 36</script>

やりたい事はシンプルなのですが、ここまでハマると思わなかったため、投稿させていただきました。
不足情報あると思いますので、解答に必要そうな事はお聞きください。
よろしくお願いします。

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

Vue 2.9.6
vue-router, vuex, webpack使用
bootstrap, bootstrap-vue も使用

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

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

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

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

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

jerome.dupuis

2018/11/26 12:19

コードのサンプルを追加お願いします。
guest

回答2

0

dataの定義を下記のようにしてみてください。

data () { return { isPush1: false, isPush2: false } },

投稿2018/11/26 23:56

rubytomato

総合スコア1752

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

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

ShinoTatwu

2018/11/27 01:09

data 定義を頂いた内容に修正してみました。 反応は変わらず、ボタンの活性非活性は変わりませんでした。 同じく、console.logで出力しているthisの値は変更されていますが、 vue devtoolsで値を確認すると変化してない状態です。
guest

0

自己解決

解消しました

頂いたコメントもヒントとなりましたが、qiita記事の方でもコメント頂けたのでご報告します。

アロー関数、ダメ、絶対

vueコンポーネント内で所々アロー関数funcA: () => {...を使用していたため、
定義の向き先がコンポーネント自身に行っていないという状態でした。
アロー関数をやめてコンポーネントの定義として書き直したところリアクティブにボタンの活性状態が変わる様になりました。
funcA: function () {...
data () {...

調査にご助力頂いた方、コメント頂いたみなさまありがとうございました!!

投稿2018/12/14 01:55

ShinoTatwu

総合スコア8

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問