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

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

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

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

npm

npmは、Node Packaged Modulesの略。Node.jsのライブラリ・パッケージを管理できるツールです。様々なモジュールを簡単にインストールでき、自分でモジュールを作成し公開する際にも使用できます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

Q&A

解決済

4回答

6312閲覧

vue.js tableの一マス文だけ色を変えるには??

kazoogon

総合スコア281

Vue.js

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

npm

npmは、Node Packaged Modulesの略。Node.jsのライブラリ・パッケージを管理できるツールです。様々なモジュールを簡単にインストールでき、自分でモジュールを作成し公開する際にも使用できます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

0グッド

0クリップ

投稿2018/04/08 07:01

編集2018/04/11 05:02

只今Laravel5.5 vue.jsを使用し予定表のようなものをtableを使って作成しております。
<期待値>どこかをクリックするとそのマス目だけ色が変わる(もう一度clickすると、色は戻る)
イメージ説明

「html側、table.tbodyのコード」

<tobody> @foreach ($master_reservation_times as $master_reservation_time) <tr> <th scope="row">{{ $master_reservation_time->time }}</th> <td scope="row" class="hoge" v-for='(item,index) in items' v-bind:class='{ active: isActive }' v-on:click='empty(index)'>@{{item.date}}</td> </tr> @endforeach </tobody>

「js側」

const demo = new Vue({ el: '#demo2', data: { isActive: false, items: [ {date: '1', message: 'nie można' }, {date: '2', message: 'nie można' }, {date: '3', message: 'nie można' }, {date: '4', message: 'nie można' }, {date: '5', message: 'nie można' }, {date: '6', message: 'nie można' }, {date: '7', message: 'nie można' }, ] }, methods:{ empty:function(index){ return this.isActive = true; //ここでどのようにindexをもたせればよいか?? } } });

ここまではできるのですが、indexをどうfunctionの中で持たせれば良いかわからずに困っております。(現状ではマス目が全部変わり、もう一度clickしても元には戻りません)
またv-on:click='isActive=!isActive'とすればclick二回目で元に戻りますが、これだとindexの値を渡ないというか、methodが使えない(?)のでマス目を指定してなにか変化させることができません。

よろしくお願いいたします。

回答を受けての追加

回答ありがとうございますeuledgeさん。
若干表示側のコードをいじりましたが、現状は1マスクリックするとこのように縦1列全ての色が変わります。
イメージ説明
「試してみたこと」
下記コードのようにvue.jsで横の時間の情報を持たせ、1マスごとに「1.1」「1.2」と情報を持たす

const demo = new Vue({ el: '#demo2', data: { rows :[ {time: '1', message: "9:00-10:00"}, {time: '2', message: "10:00-11:00"}, {time: '3', message: "11:00-12:00" }, {time: '4', message: "12:00-13:00" }, {time: '5', message: "13:00-14:00" }, {time: '6', message: "14:00-15:00" }, {time: '7', message: "15:00-16:00" }, {time: '8', message: "16:00-17:00" }, {time: '9', message: "18:00-19:00" }, {time: '10', message: "19:00-20:00" }, {time: '11', message: "20:00-21:00" }, ], columns: [ {date: '1', message: 'nie można' ,isActive: false}, {date: '2', message: 'nie można' ,isActive: false}, {date: '3', message: 'nie można' ,isActive: false}, {date: '4', message: 'nie można' ,isActive: false}, {date: '5', message: 'nie można' ,isActive: false}, {date: '6', message: 'nie można' ,isActive: false}, {date: '7', message: 'nie można' ,isActive: false}, ] },

↓表示側のコードはこのように変更。
問題点はv-on:click='empty(index)'部分にてcolumn.dateとrow.timeの情報を引数で渡し、その部分だけ色が変わるようにしようと思っていますが、うまいこといかずに困っております。

<tr v-for="row in rows"> <th scope="row">@{{ row.message }}</th> <td scope="row" class="hoge" v-for='(column,index) in columns' v-bind:class='{ active: column.isActive }' v-on:click='empty(index)'>@{{ column.date }}:@{{ row.time }}</td> </tr>

よろしくお願いいたします。

回答を受けての追加②

回答ありがとうございますeuledgeさん。

v-for='(row,index) in rows' ```についてなんですが、これは

rows :[
{time: '1', message: "9:00-10:00", index: 1},
{time: '2', message: "10:00-11:00", index: 2},
{time: '3', message: "11:00-12:00", index: 3},
{time: '4', message: "12:00-13:00", index: 4},
{time: '5', message: "13:00-14:00", index: 5},
{time: '6', message: "14:00-15:00", index: 5},
{time: '7', message: "15:00-16:00", index: 6},
{time: '8', message: "16:00-17:00", index: 7},
{time: '9', message: "18:00-19:00", index: 8},
{time: '10', message: "19:00-20:00", index: 9},
{time: '11', message: "20:00-21:00", index: 10 }
],

と、indexプロパティが追加されている(?)イメージだと思っております。ですので以下のように変更致しました。 「html部分」
<tr v-for="(row,index) in rows"> <th scope="row">@{{ row.message }}</th> <td scope="row" class="hoge" v-for='(column,index) in row.columns' v-bind:class='{ active: column.isActive }' v-on:click='empty(row.index,column.index)'>@{{ column.date }}:@{{ row.time }}</td> </tr> ``` 「js method部分」 ``` methods:{ empty:function(row,column){ return this.rows[row].columns[column].isActive = ! this.rows[row].columns[column].isActive; } } ``` とそれぞれ変更しましたが、```Uncaught TypeError: Cannot read property 'columns' of undefined```とエラーが出ます。rowsの中にcolumnsというpropertyはあるのに。。。?となっております。 度々申し訳ありませんが、よろしくお願いいたします。

回答を受けての追加③

回答ありがとうございますeuledgeさん。
ご指摘の通りコードを修正すると期待値通り動作しました。
しかしコードが長いので変数にデータをいれて使おうと思いこのようにしました(ここではいただいたhttps://jsfiddle.net/3gozgbj9/42/を使用します、そちらの方が分かりやすいと思いますので)

var date = [ {date: '1', message: 'nie można', isActive: true }, {date: '2', message: 'nie można', isActive: true }, {date: '3', message: 'nie można', isActive: true }, {date: '4', message: 'nie można', isActive: true }, {date: '5', message: 'nie można', isActive: true }, {date: '6', message: 'nie można', isActive: true }, {date: '7', message: 'nie można', isActive: true }, ] const demo = new Vue({ el: '#demo2', data: { rows: [ {name: 'item1', columns: date }, {name: 'item2', columns: date } ], }, methods:{ empty:function(rowIndex, colIndex){ this.rows[rowIndex].columns[colIndex].isActive = !this.rows[rowIndex].columns[colIndex].isActive; } } });

このようにすると縦列全部の色が変わってしまいます。変数を使うだけでこのようになる理由が不明で困っております。。
長々申し訳ございませんが、よろしくお願いいたします。

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

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

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

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

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

gouf

2018/04/09 06:27

「return this.isActive = true」を「return this.isActive = !this.isActive」に書き換えた場合に動作に変化は見られますか?
kazoogon

2018/04/09 06:38

回答ありがとうございます。 ご指摘の通り修正しましたところ、click二回目で色は元に戻りました、ありがとうございます。 後はclickしたマス目の部分だけの色が変化すればよいですが、、indexをどう扱えばいいのかわからなくて困っております
guest

回答4

0

ベストアンサー

同じ変数 dateを使用していますが、この場合両方とも同じものをさしています(var date で宣言したもの) これはjavascriptの言語的仕様です。したがって片方の値を変えたつもりでも両方の値が変わったようになります。

js

1 rows: [ 2 {name: 'item1', 3 columns: date 4 }, 5 {name: 'item2', 6 columns: date 7 }

投稿2018/04/11 07:43

euledge

総合スコア2404

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

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

kazoogon

2018/04/11 09:36

ということは1つにまとめとくことができないんですね。。。汗 了解しました。
guest

0

まず、誤解されているようなので訂正させていただきます。

indexプロパティが追加されている(?)イメージだと思っております

ですが、indexは v-forの構文の中で配列のインデクスとしてサポートされているものなのでオブジェクトにindexというプロパティを用意する必要はありません。

html

1<td v-for="(row,index) in rows"> 2 <td>{{index}}</td> 3 <td>{{row.name}}</td> 4</td>

Vue.js ガイドより
v-for で配列に要素をマッピングする

となると、rowとcolumnで同じ名前のindexは使用できないので名前は分けましょう。
rowIndex, colIndex とか
(indexという名前がインデクスを表すのではなく第2引数がインデクスになります)

https://jsfiddle.net/euledge/3gozgbj9/25/

クラスのOn/Offだけなら、ふとisActiveもindexもいらないんじゃねと思いました。
isActive,indexを使用しないバージョンも下記に載せておきます
https://jsfiddle.net/euledge/3gozgbj9/38/
ただし、クリックされているかどうかをデータとして残す必要がある場合は isActiveは必要になりますので上のパターンで行う必要があります。

Vue.js ガイドより
メソッドイベントハンドラ

遠回りさせてしまいすみません。

投稿2018/04/10 12:55

編集2018/04/10 13:00
euledge

総合スコア2404

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

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

kazoogon

2018/04/11 05:03

「回答を受けての追加③」に本文中にて返答いたしました。
guest

0

js

1 rows :[ 2 {time: '1', message: "9:00-10:00"}, 3 {time: '2', message: "10:00-11:00"}, 4 {time: '3', message: "11:00-12:00" }, 5 {time: '4', message: "12:00-13:00" }, 6 {time: '5', message: "13:00-14:00" }, 7 {time: '6', message: "14:00-15:00" }, 8 {time: '7', message: "15:00-16:00" }, 9 {time: '8', message: "16:00-17:00" }, 10 {time: '9', message: "18:00-19:00" }, 11 {time: '10', message: "19:00-20:00" }, 12 {time: '11', message: "20:00-21:00" }, 13 ], 14 columns: [ 15 {date: '1', message: 'nie można' ,isActive: false}, 16 {date: '2', message: 'nie można' ,isActive: false}, 17 {date: '3', message: 'nie można' ,isActive: false}, 18 {date: '4', message: 'nie można' ,isActive: false}, 19 {date: '5', message: 'nie można' ,isActive: false}, 20 {date: '6', message: 'nie można' ,isActive: false}, 21 {date: '7', message: 'nie można' ,isActive: false}, 22 ]

ではそうなっちゃいますね。

js

1rows :[ 2 {time: '1', message: "9:00-10:00", 3 columns: [ 4 {date: '1', message: 'nie można' ,isActive: false}, 5 {date: '2', message: 'nie można' ,isActive: false}, 6 {date: '3', message: 'nie można' ,isActive: false}, 7 {date: '4', message: 'nie można' ,isActive: false}, 8 {date: '5', message: 'nie można' ,isActive: false}, 9 {date: '6', message: 'nie można' ,isActive: false}, 10 {date: '7', message: 'nie można' ,isActive: false}, 11 ]}, 12 {time: '2', message: "10:00-11:00", 13 columns: [ 14 {date: '1', message: 'nie można' ,isActive: false}, 15 {date: '2', message: 'nie można' ,isActive: false}, 16 {date: '3', message: 'nie można' ,isActive: false}, 17 {date: '4', message: 'nie można' ,isActive: false}, 18 {date: '5', message: 'nie można' ,isActive: false}, 19 {date: '6', message: 'nie można' ,isActive: false}, 20 {date: '7', message: 'nie można' ,isActive: false}, 21 ]}, 22 以下略 23 ], 24]

テーブルの構造どおり上記のようにしないと1マスづつにはならないです

説明省いちゃってますけど、methodで渡す値も rowのindexと columnのindexが必要です。

投稿2018/04/10 03:41

編集2018/04/10 04:16
euledge

総合スコア2404

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

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

kazoogon

2018/04/10 05:37

回答ありがとうございます、「回答を受けての追加②」と本文に追加いたしました。
guest

0

状態としてisActiveがあるのですが、それを td 毎に持っていないので個別の動作ができないのではないでしょうか?
したがって、各itemにisActiveを持てば解決するのではないかと思います。

js

1const demo = new Vue({ 2 el: '#demo2', 3 data: { 4 items: [ 5 {date: '1', message: 'nie można', isActive: true }, 6 {date: '2', message: 'nie można', isActive: true }, 7 {date: '3', message: 'nie można', isActive: true }, 8 {date: '4', message: 'nie można', isActive: true }, 9 {date: '5', message: 'nie można', isActive: true }, 10 {date: '6', message: 'nie można', isActive: true }, 11 {date: '7', message: 'nie można', isActive: true }, 12 ] 13 }, 14 methods:{ 15 empty:function(index){ 16 this.items[index].isActive = ! this.items[index].isActive; 17 } 18 } 19});

下記に動くサンプルを置きます

https://jsfiddle.net/euledge/3gozgbj9/11/

投稿2018/04/09 08:05

euledge

総合スコア2404

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

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

kazoogon

2018/04/10 03:26

回答ありがとうございます、返答は本文の方に追加いたしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問