Vueは画像のドラッグと並べ替えを実装します

Vueは画像のドラッグと並べ替えを実装します

この記事の例では、画像のドラッグと並べ替えを実装するためのVueの具体的なコードを参考までに共有しています。具体的な内容は次のとおりです。

原理:画像のリストがあります。画像の 1 つをドラッグします (dragstart をトリガーします)。ドラッグした画像が他の画像の位置に移動すると (dragover をトリガーします)、ドラッグした画像は元の位置からその位置に移動します (dragend をトリガーします)。

dragstart:ユーザーが要素またはテキスト選択のドラッグを開始したときに、dragstart イベントが発生します。

dragover:要素または選択したテキストが有効なドロップ ターゲット上にドラッグされると、dragover イベントがトリガーされます (数百ミリ秒ごとに 1 回)。

dragend:ドラッグ アンド ドロップ操作が終了すると、ドラッグ アンド ドロップ イベントがトリガーされます。 (ここでは必要ありません)

(1)画像リストのHTML構造。ドラッグする必要がある要素に draggable 属性を追加します。ここで注意してください: Vue はレンダリング時にインプレース再利用を使用するため、テンプレートの for ループのキー値は一意である必要があります。キー値が一意の場合、並べ替え後にレンダリングされたリスト ノードは再利用されず、いくつかの問題を回避できます。 (挿入時には、シーケンス番号に従って特定のデータを配列に挿入します)

 <ul class="ドラッグコンテナ" 
            @dragstart="onDragStart"
            @dragover="ドラッグオーバー時"
            @dragend="onDragEnd"
            ref="画像リスト">
            <li 
            v-for="(item,idx) リスト内" 
            :key='アイテム.パス'
            クラス="ドラッグリスト" 
            ドラッグ可能="true" 
            >
                <img :src="item.path" alt="" />
            </li>
</ul>

(2)イベント:dragstart、dragoverバインディングイベントonDragStart、onDragOver

onDragStart: ドラッグする要素を識別し、ドラッグ プロセス中に dragover バインディング イベントで使用するためにその状態を保存します。

onDragStart(イベント){
            console.log("開始");
            this.draging = イベントターゲット;
        },

onDragOver: ドラッグ処理中に要素が有効なターゲット上にあるときにイベントがトリガーされます。ドラッグされた要素ではなく、ターゲット要素が識別されます。まず、ターゲット要素が必要なターゲット要素であるかどうかを識別します。この例では、li 要素であるかどうかを判断し、画像がドラッグしたものと同じかどうかを確認してから、ドラッグした要素を挿入します。
ドラッグした要素と対象要素の位置番号を特定し、ドラッグした要素を対象要素の前に挿入し、ドラッグした要素の元の位置にあるデータを削除します。Vue では、データ操作のみを実行する必要があります。

onDragOver(イベント){
            console.log('ドラッグ移動')
            イベントをデフォルトにしない();
            ターゲットをevent.targetとします。
                //ドラッグオーバーはulで発生するため、liであるかどうかを判断する必要があります
            if (target.nodeName === "LI" && 
                target.childNodes[0].src !== this.draging.childNodes[0].src) {
                idx_drag = this._index(this.dragging) とします。
                idx_target = this._index(target) とします。
                _list = this.list とします
                _drag = this.list[idx_drag]とします。
                idx_drag>idx_target の場合{
                    _list.splice(idx_target,0,_list[idx_drag]);
                    _list.splice(idx_drag+1,1)
                }それ以外{
                    _list.splice(idx_target+1,0,_list[idx_drag]);
                    _list.splice(idx_drag,1)
                }
                コンソール.log(_list[0].パス)
                this.$emit("change", _list)
            }
        },

完全なコードは次のとおりです。

<テンプレート>
    <div class="image-list" v-if="リスト && リスト.長さ">
        <ul class="ドラッグコンテナ" 
        @dragstart="onDragStart"
        @dragover="ドラッグオーバー時"
        @dragend="onDragEnd"
        ref="画像リスト">
            <li 
            v-for="(item,idx) リスト内" 
            :key='アイテム.パス'
            クラス="ドラッグリスト" 
            ドラッグ可能="true" 
            >
                <img :src="item.path" alt="" />
            </li>
        </ul>
    </div>
</テンプレート>
<スクリプト>
エクスポートデフォルト{
    名前:"ドラッグ画像リスト",
    小道具:{
        リスト: 配列、
    },
    データ(){
        戻る {
            dragging:null, //ドラッグされているオブジェクト}
    },
    方法:{
        onDragStart(イベント){
            console.log("開始");
            this.draging = イベントターゲット;
        },   
        onDragOver(イベント){
            console.log('ドラッグ移動')
            イベントをデフォルトにしない();
            ターゲットをevent.targetとします。
                //ドラッグオーバーはulで発生するため、liであるかどうかを判断する必要があります
            target.nodeName === "LI" && target.childNodes[0].src !== this.draging.childNodes[0].src) {
                idx_drag = this._index(this.dragging) とします。
                idx_target = this._index(target) とします。
                _list = this.list とします
                _drag = this.list[idx_drag]とします。
                idx_drag>idx_target の場合{
                    _list.splice(idx_target,0,_list[idx_drag]);
                    _list.splice(idx_drag+1,1)
                }それ以外{
                    _list.splice(idx_target+1,0,_list[idx_drag]);
                    _list.splice(idx_drag,1)
                }
                コンソール.log(_list[0].パス)
            }
        },
        onDragEnd(イベント){
            console.log('イベント終了')
        },
        _index(el){
            var インデックス = 0;
            if (!el || !el.parentNode) {
                -1 を返します。
            }
            (el && (el = el.previousElementSibling)) の間 {
                インデックス++;
            }
            インデックスを返します。
        },
    }
}
</スクリプト>

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • Vueプラグインdrag​​gableは画像のドラッグと移動の順序を実現します
  • Vueのドラッグアンドドロップソートプラグインvuedraggableの使い方を詳しく説明します
  • VueコンポーネントDraggableはドラッグ機能を実装します
  • Vue.Draggable で画像をドラッグして並べ替える方法

<<:  SSHを使用してDockerサーバーに接続する方法

>>:  MySQL がデュアルマスターで構成されている場合にデータループの競合を回避する方法

推薦する

JavaScript の継承についてどれくらい知っていますか?

目次序文コンストラクタ、プロトタイプオブジェクト、インスタンスオブジェクトの関係プロトタイプチェーン...

zabbix を使用して ogg プロセスを監視する (Linux プラットフォーム)

以前作成されたデータベースの ogg プロセスは、発見されるまでの約半月間ダウンしていました。起動で...

Vueはルールを使用してフォームフィールドの検証を実装します

Vue でフォーム フィールドを記述および検証する方法は多数あります。このブログでは、より一般的に使...

MySQL で絵文字表現を挿入できない理由と解決策

失敗のシナリオMySQL データベースに絵文字表現を挿入するために JDBC を呼び出すと、例外ja...

JavaScript でフォロー広告を実装するためのサンプルコード

フローティング広告は、ウェブサイト上で非常に一般的な広告形式です。フローティング広告は、ユーザーの閲...

Linux 環境に MySQL 8.0 をインストールするプロセスの紹介

目次序文1. Linux は yum ソースを変更します (MYSQL のインストールが遅い場合は試...

Vue プロジェクトで addRoutes を使用する際の問題の解決策

目次序文1. 404 ページ1. 原因2. 解決策2.白い画面を更新する1. 原因2. 解決策3. ...

VS2022 リモート デバッグ ツールの使い方

WeChat 関連サービスをデバッグする場合など、職場のサーバー環境でリモートデバッグを行う必要があ...

Windows Server 2008R2、2012、2016、2019 の違い

目次共通バージョンの紹介共通バージョンのダウンロードアドレスとインストール以下に簡単な違いを示します...

Web デザインのための 5 つのシンプルな XHTML Web フォーム

Web デザイン 5 におけるシンプルな XHTML Web フォーム。 テクニック 1: ラベル ...

Windows 上で Zookeeper サーバーを構築するチュートリアル

インストールと設定Apacheの公式ウェブサイトには多くのミラーダウンロードアドレスが用意されており...

IDEA は MySQL への接続時にエラーを報告します。サーバーが無効なタイムゾーンを返します。タブに移動して serverTimezone プロパティを設定してください。

これからの道は常に困難で、棘だらけです。歯を食いしばって、乗り越えられると信じてください。さあ、さあ...

MySQL フルテキスト インデックス、ジョイント インデックス、Like クエリ、JSON クエリのうち、どれが高速ですか?

目次クエリの背景1. クエリをいいね2. JSON関数クエリ3. 共同インデックスクエリ4. 全文イ...

MySQL が暗黙のデフォルト値を処理する方法

何人かの学生は、マスターとスレーブの間の不一致の問題に遭遇したと述べました。一般的な状況としては、m...

動的なテーブル効果を実現するJavaScript

この記事では、動的なテーブル効果を実現するためのJavaScriptの具体的なコードを参考までに紹介...