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

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

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

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

JavaScript

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

3回答

4580閲覧

classListのadd,removeの結果が想定通りにならない

sanezane

総合スコア91

Vue.js

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

JavaScript

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2020/01/16 01:29

classListのadd,removeの結果が想定通りにならない

仕様

  • ある条件で、選択したタブ切り替えをキャンセルしたい

仕様技術(※今回の相談は素のjavascript操作ですが他に方針もあるかと思い一応記載・・・)

  • Nuxt.js: 2.8.1
  • Vue.js: 2.6.1
  • ElemetUI: 2.10.1

実装方針

  • ある条件のとき、選択したタブに入っているis-activeクラスを削除し、現在のタブにis-activeクラスを追加する。
  • (javascriptにて要素を取得しclassList.addやremoveを使いclass属性を追加・削除したい)

現状とソース

  • 現状:タブ切り替えキャンセルしているつもりだが、タブが切り替わってしまう。

html

1<el-tabs 2 v-model="activeTab" 3 :before-leave="checkEdited" 4 @tab-click="handleTabClick" 5 > 6 <el-tab-pane 7 v-for="(item, index) in tabs" 8 :key="index" 9 :name="index.toString()" 10 :label="item.Name" 11 ></el-tab-pane> 12 </el-tabs>

javascript

1async handleTabClick(selectedTab) { 2 const editedItems = await this.getItemsEdited() 3 if (editedItems.length !== 0) { 4 // キャンセル処理 5 // 選択したタブ 6 const selectedTabId = 7 ProspectEgh.PROSPECTCONSTSTR.tabIdPrefix + selectedTab.index 8 const selectedtTabElement = document.getElementById(selectedTabId) 9 // 現在のタブ 10 const currentTabId = 11 ProspectEgh.PROSPECTCONSTSTR.tabIdPrefix + this.currentTabIndex 12 const currentTabElement = document.getElementById(currentTabId) 13 // 選択したタブ確認 14 console.log('selectedTabId') 15 console.log(selectedTabId) 16 console.log('selectedtTabElement') 17 console.log(selectedtTabElement.classList) 18 selectedtTabElement.classList.remove('is-active') 19 console.log('selectedtTabElement') 20 console.log(selectedtTabElement.classList) 21 22 // 現在のタブ確認 23 console.log('currentTabId') 24 console.log(currentTabId) 25 console.log('currentTabElement') 26 console.log(currentTabElement.classList) 27 currentTabElement.classList.add('is-active') 28 console.log('currentTabElement') 29 console.log(currentTabElement.classList) 30 } 31 }

確認したこと

  • DevToolsのElementsでDOM操作(添付ソースの通りIDから要素取得しclass追加操作や削除操作)してみると思い通りに追加・削除できる

コンソール出力

イメージ説明

  • ある条件 + タブを選択したタイミングで選択したタブ(selectedTabElement)と現在のタブ(currentTabElement)をそれぞれclass操作前class操作後でコンソール出力
  • 添付画像を見ると、選択したタブ(selectedTabElement)にはDOMTokenList上はis-activeクラスはないが、value欄を見るとis-activeがある。
  • 直後にclassList.remove('is-active')で削除操作をしても値は変わらず。。
  • 同じように現在のタブ(currentTabElement)ではis-activeDOMTokenList上にはあるがvalue欄ではない。操作後の値も変わらず。。

操作をするタイミングが悪いのかと思って調査中です。 ご指摘いただけると幸いです。

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

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

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

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

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

guest

回答3

0

※今回の相談は素のjavascript操作ですが他に方針もあるかと思い一応記載・・・

Vue.jsで制御している中を普通のJavaScriptから動かしてはいけません。Vue.jsによる動作と手動での書き換えが干渉して、わけのわからない動作になってしまいます。

投稿2020/01/16 01:32

maisumakun

総合スコア145184

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

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

maisumakun

2020/01/16 01:33

クラス設定もVue.jsから行ってください。
guest

0

ベストアンサー

maisumakun さんもご指摘の通り、vueはDOMツリーを直接操作しているわけではなく仮想DOMをマウントしているので(この理解が間違っていたら申し訳ありません)、vueを用いないWeb開発のように直接DOMをいじると処理が干渉して意図した動作になりません。

クラスの値を動的に変えたいのであれば、対象のタグ内にv-bind:class="hogehoge"のように書いて、hogehoge内にある条件を判定してクラス名を返す関数などを書けば行けるのではないでしょうか?

投稿2020/01/23 15:57

hajifu

総合スコア88

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

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

0

以下のコードお試しください

checkEdited(item) { const editedItems = this.getItemsEdited() if (editedItems.length !== 0) { let p = new Promise((resolve, reject) => { this.$confirm('離れますでしょうか', 'メッセージ', { confirmButtonText: 'yes', cancelButtonText: 'no', type: 'warning' }).then(() => { // todo resolve() }).catch(err => { // todo reject(err) }) }) return p } }

投稿2020/01/16 01:40

編集2020/01/16 01:41
harinezumi.py

総合スコア282

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問