Vueは複数列レイアウトドラッグを実装します

Vueは複数列レイアウトドラッグを実装します

この記事では、マルチカラムレイアウトドラッグを実装するためのVueの具体的なコードを参考までに共有します。具体的な内容は次のとおりです。

1. 目的

Vue は、複数のボックスの自由なドラッグと幅の変更を実装します (ユーザーは実際のシナリオに基づいてボックスの数を決定します)。

2. 応用シナリオ

幅を自由にドラッグできる複数列レイアウト。

最も一般的なケース:エディター(例: vscode、idea など)

コンポーネント設計

このコンポーネントのボックス数は不明なので、コンポーネントの設計にはVuetifyの Form と FormItem の設計を参考にしました。つまり、外側の大きなボックスは分散ドラッグ イベントを処理し、内側のボックスは各アイテムの内容を表示する役割を担います。

コンポーネント設計により、次の目標が達成されます。

<ドラッグボックススタイル="幅: 100%; 高さ: 100%;">
   <ドラッグアイテム>アイテム1</ドラッグアイテム>
   <drag-item>項目2</drag-item>
   <ドラッグアイテム>アイテム3</ドラッグアイテム>
   <ドラッグアイテム>アイテム4</ドラッグアイテム>
</ドラッグボックス>

4. 実装

4.1 dragBox 静的ページ

(サブ要素のネストはスロットを通じて実現されます)

<テンプレート>
    <div ref='dragBox' style='display: flex; 幅: 100%; 高さ: 100%;'>
        <スロット></スロット>
    </div>
</テンプレート>

4.2 ドラッグアイテムページ

(ドラッグアイテムの内部要素のネストはスロットを通じて実現されます)

<テンプレート>
    <div ref="container" class="d-flex" style="min-width: 200px; position: relative;">
        <div スタイル="幅: 100%; 高さ: 100%;">
            <slot>デフォルト情報</slot>
        </div>
  <!-- ドラッグバー -->
        <div v-if="resizeShow" class="resize" />
    </div>
</テンプレート>
<スクリプト>
エクスポートデフォルト{
  小道具: {
  // ドラッグバーを表示するかどうかを制御します。デフォルトでは表示されます resizeShow: {
      タイプ: ブール値、
      デフォルト: true
    }
  }
}
</スクリプト>
<スタイル>
.サイズ変更{
    位置: 絶対;
    上: 0;
    右: 0;
    幅: 4px;
    高さ: 100%;
    カーソル: col-resize;
    背景色: #d6d6d6;
}
</スタイル>

4.3 ドラッグロジック

ドラッグ ロジックは dragItem ではなく dragBox によって処理される必要があります。

4.3.1 ドラッグを実装する前に、子要素 (dragItem など) を適切にレイアウトする必要があります。

ユーザーがdragItem に初期幅を割り当てない場合は、デフォルトの flex:1が使用されます (残りのスペースは均等に分散されます)。具体的なロジックは次のとおりです。

 // dragItem が幅を定義していない場合は、flex=1
    ドラッグアイテムフレックスを設定する(){
      const dragBox = this.$refs.dragBox
      const childrenLen = ドラッグボックスのchildren.length

      (i = 0; i < childrensLen; i++) の場合 {
        定数ノード = dragBox.children[i]
        ノードスタイルの幅が等しい場合
          // 幅が定義されていない場合はflex=1
          ノードスタイルフレックス = 1
        }
      }
    },

4.3.2 ドラッグアンドドロップの実装ロジック

各 dragItem のドラッグ バーにドラッグ イベントを追加する必要があります。完全なドラッグ イベントには、マウスの押下、マウスの移動、マウスのリフト (ドラッグの終了) が含まれます。

各ドラッグ バーにイベントを追加するループ:

ドラッグコントローラDiv() {
  const resize = document.getElementsByClassName('resize') // ドラッグバー // 各ドラッグバーのイベントを追加するためのループ for (let i = 0; i < resize.length; i++) {
    // マウス押下イベント resize[i].addEventListener('mousedown', this.onMouseDown)
  }
},

マウスプレスロジック: マウスの初期位置を取得し、ドラッグバーの色を変更し、移動と上へのリスナーイベントを追加します。

マウスダウン時(e) {
  this.resizeBox = e.target
  this.currentBox = this.resizeBox.parentNode // 現在のボックス this.rightBox = this.getNextElement(this.currentBox) // 現在のボックスの次の兄弟ノード if (!this.rightBox) return
  this.curLen = this.currentBox.clientWidth
  this.otherBoxWidth = this.$refs.dragBox.clientWidth - this.currentBox.clientWidth - this.rightBox.clientWidth // 他のボックスの幅 // 色変更のリマインダー this.resizeBox.style.background = '#818181'
  this.startX = e.clientX
  document.addEventListener('mousemove', this.onMousemove)
  document.addEventListener('mouseup', this.onMouseup)
},

// 次の兄弟要素を取得するcompatible function getNextElement (element) {
  if (要素.nextElementSibling) {
    element.nextElementSibling を返す
  } それ以外 {
    var next = element.nextSibling // 次の兄弟ノード while (next && next.nodeType !== 1) { // 存在するが、必要なものではない next = next.nextSibling
    }
    次へ戻る
  }
}

マウス移動イベント: 現在のボックスと右のボックスの幅を計算して設定します。

マウスを動かすと(e){
  定数 endX = e.clientX
  const moveLen = endX - this.startX // (endx-startx) = 移動距離 const CurBoxLen = this.curLen + moveLen // resize[i].left + 移動距離 = 左領域の最終幅 const rightBoxLen = this.$refs.dragBox.clientWidth - CurBoxLen - this.otherBoxWidth // 右幅 = 合計幅 - 左幅 - 他のボックス幅 // 最小幅に達すると、ドラッグは利用できなくなります if (CurBoxLen <= 200 || rightBoxLen <= 200) return
  this.currentBox.style.width = CurBoxLen + 'px' // 現在のボックスの幅 this.resizeBox.style.left = CurBoxLen // 左領域の幅を設定 this.rightBox.style.width = rightBoxLen + 'px'
},

マウスアップイベント: mousedown イベントと mousemove イベントを破棄し、ドラッグバーの色を復元します。

マウスアップ時(){
 // 色の復元 this.resizeBox.style.background = '#d6d6d6'
 document.removeEventListener('mousedown', this.onMouseDown)
 document.removeEventListener('mousemove', this.onMousemove)
},

マウントされたフック関数に対応するイベントを追加します。

マウントされた(){
  this.setDragItemFlex()
  this.dragControllerDiv()
},

コンポーネントをインポートして登録します。

<テンプレート>
  <div id="app" style="幅: 100%; 高さ: 100vh; 境界線: 1px solid #ccc;">
    <ドラッグボックススタイル="幅: 100%; 高さ: 100%;">
      <drag-item style="width: 20%;">項目1</drag-item>
      <drag-item>項目2</drag-item>
      <drag-item style="width: 20%;" :resizeShow='false'>項目3</drag-item>
    </ドラッグボックス>
  </div>
</テンプレート>

<スクリプト>
'./components/dragLayouter' から {DragBox, DragItem} をインポートします。

エクスポートデフォルト{
  名前: 'アプリ'、
  コンポーネント:
    ドラッグボックス、
    ドラッグアイテム
  }
}
</スクリプト>

5. 運用結果

特定のスタイルは後で変更できます。

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

以下もご興味があるかもしれません:
  • Vue3.0はvue-grid-layoutプラグインを使用してドラッグレイアウトを実装します。
  • Vue3 ドラッグ可能な左パネルと右パネルの分割コンポーネントの実装
  • Vue コード分割 (codesplit) の実装
  • Vueはドラッグアンドドロップ分割レイアウトを実装

<<:  Tencent Cloud Serverの構築方法を説明します(グラフィックチュートリアル)

>>:  MySQLが正常にインストールされたかどうかを確認する方法

推薦する

ネイティブ js で呼び出し、適用、バインドを実装する方法

1. 呼び出しを実装するステップ:関数をオブジェクトのプロパティとして設定します。これを関数に割り当...

CSS3 境界効果

CSSとは# CSS (Cascading Style Sheets の略) は、「カスケーディング...

XAML でボタンを円として再描画する方法

XAML レイアウトを使用する場合、インターフェイスを Metro 風にするために、一部のボタンでは...

Centos7 での Rsync+crontab 定期同期バックアップ

最近、社内の重要なサーバデータを定期的にストレージにバックアップし、ついでにメモしておきたい以前、W...

Win10 での MySQL 8.0 ログインでユーザー 'root'@'localhost' のアクセスが拒否される (パスワード使用: YES) 問題の解決方法

最近、MySQL を学び始めました。インストールはスムーズに進み、インターネット上の既成のチュートリ...

CentOS8 で Docker を使用してオープンソース プロジェクト Tcloud をデプロイするチュートリアル

1. Dockerをインストールする1. 仮想マシンに Centos7 をインストールしました。Li...

1つのコマンドで、シェルの読み取りコマンドの共通パラメータを理解できます。

Shell で受信パラメータを受信する方法は 2 つあることがわかっています。 1 つはスクリプト...

MYSQLはUnionを使用して2つのテーブルのデータを結合し、表示します。

UNION演算子の使用union : 2 つ以上の SELECT ステートメントの結果を 1 つの...

Vue ドラッグ アンド ドロップのシンプルな実装

この記事では、主に次のような Vue ドラッグ アンド ドロップの簡単な実装を紹介します。レンダリン...

WeChat アプレット計算機の例

この記事では、参考までに、計算機を実装するためのWeChatアプレットの具体的なコードを紹介します。...

Linux でのファイル コンテンツの重複排除と交差と差異の実装

1. データ重複排除日常業務では、Hive や Impala を使用してクエリとエクスポートを行う際...

Vueのwatch、computed、methodsの違いのまとめ

目次1 はじめに2 基本的な使い方2.1 方法2.2 計算プロパティ2.3 リスナーを見る3 3つの...

ReactのuseEffectクロージャの落とし穴についての簡単な説明

問題コードuseEffectによって発生したクロージャの問題コードを見てみましょう 定数 btn =...

Linux で MySQL データベースのインポートおよびエクスポート コマンドを実装する方法

1. mysqldump コマンドを使用してデータベースをエクスポートします (このコマンドのパスで...

vueの実践的な応用におけるvuexの永続性の詳細な説明

目次vuex 永続性要約するvuex 永続性vuex: ブラウザを更新すると、vuexの状態は初期状...