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

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

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

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

HTML

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

Q&A

解決済

4回答

6935閲覧

v-forを使ってdraggableの一部だけ固定したい

Samples

総合スコア14

Vue.js

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

HTML

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

0グッド

0クリップ

投稿2019/07/16 10:36

編集2019/07/16 13:47

やりたいこと
vue.jsのv-forを用いてindex:0の項目を固定したい

やったこと
itemsにhandle:falseを持たせて判断させる ←失敗

簡潔に書くためにv-forを使って書きたいです。
お手数ですが、ご教示お願いいたします。

html

1<draggable :options="{ handle: '.my-handle' }"> 2 <v-card 3 v-for="(item, index) in items" 4 :key="index" 5 flat 6 class="item" 7 > 8 <v-layout row align-center> 9 <v-icon color="grey ligten-2"> 10 drag_indicator 11 </v-icon> 12 {{ item.name }} 13 </v-layout> 14 </v-card> 15</draggable>

js

1 data() { 2 return { 3 items: [ 4 { name: '0', handle: false }, 5 { name: '1'}, 6 { name: '2'}, 7 { name: '3'} 8 ] 9 }; 10 },

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

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

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

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

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

guest

回答4

0

かなり前の質問に対して、今更なのですが、特定の項目だけdraggable対象外にする方法として、
その項目だけイベントを外す対応で動かさなくすることができます。

公式ではdropを抑止する方法ですが、イベントを外す事でdrag startも抑止可能なので、完全に動かさないようにすることができます。

https://zenn.dev/tomosuke/articles/24e492873a7b37

投稿2021/05/27 00:36

tomosuke13

総合スコア22

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

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

0

KuwabataKさんの回答にある、サンプルからGitHubを見ると分かりますが、
以下のような感じですね。

draggableにonMoveメソッドをv-bindして、移動できるか判別させています。

//template <draggable :v-model="list" :move="onMove"> <div v-for="item in list">{{ item.name }}</div> </draggable> //data list = [ {name:"first", fixed = true}, {name:"second", fixed = false}, {name:"third, fixed = false} ] //method onMove({ relatedContext, draggedContext }) { const relatedElement = relatedContext.element; const draggedElement = draggedContext.element; return ( (!relatedElement || !relatedElement.fixed) && !draggedElement.fixed ); }

投稿2020/06/09 06:05

Arice_Banan

総合スコア60

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

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

0

ベストアンサー

<draggable> というのはvue-draggableのことでしょうか?

であれば、handle: falseではなく、fixed:trueで固定できます。

公式サイトのデモが非常にわかりやすいので参考にしてください。

なお vue-draggable は、サードパーティ製のOSSライブラリなので、「vue-draggableを使っています」ということを質問の中で明示しないと、回答者には<draggable>タグが、自分で作った独自コンポーネントなのか、それとも何かのOSSコンポーネントなのかわからないと思います。

投稿2019/07/16 14:20

編集2019/07/17 00:04
KuwabataK

総合スコア306

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

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

0

v-if を利用して実現するのは難しいです。
そして提示いただいたコードは残念ながら正解には程遠そうです。

提示いただいたコードを修正してどうにかする場合

  • class バインディングのオブジェクトは、キーが付与したいクラス名、値が付与するかどうかを決定する真偽値(又は式)です。提示いただいたコードはおそらく逆になっています。
  • クラスを付与したいなら(固定したい とのことなので、きっと何らかのスタイルをクラスに設定しているのだと信じて回答しております)、 :options ではなく :class です。
  • 対応するアイテムにクラスをつけたいなら、クラスをつけようとするタグが間違っています。
  • handle: false としてしまっては、ほかの handle が未定義な item (item.handle == false' が true` となる) と区別することが難しくなります。

html

1<v-card 2 v-for="(item, index) in items" 3 :class="{ 'my-handle': item.handle }" 4 :key="index" 5 flat 6> 7 <!-- ... -->

javascript

1{ name: '0', handle: true },

もっとスマートに

せっかく v-for="(item, index)" としているのですから、この index を利用すればわざわざ item に handle プロパティを持たせる必要はありません。最初の要素は index が 0 の要素です。

余談ですが

<v-card> の直下に<v-layout> が来ていますが、本当にやりたいことはそれであってますか?
<v-container> は……?

よく理解せずコピペでどうにかなるものでもないので、あきらめて基礎から順番に学んだ方が早いと思います。

投稿2019/07/16 12:58

R.Mizukami

総合スコア1086

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問