Vue3.0はvue-grid-layoutプラグインを使用してドラッグレイアウトを実装します。

Vue3.0はvue-grid-layoutプラグインを使用してドラッグレイアウトを実装します。

1. プラグイン

まず、私たちが選んだプラグインはvue-grid-layoutです

npm i vue-grid-layout --save

公式サイト: https://jbaysolutions.github....

2. 幕間

依存関係をインストールした後、プロジェクトを開始できることがわかりました。公式 Web サイトのdemoによると、ページは空白で、コンソールにはサブコンポーネントが見つからないというメッセージが表示されました。

考え方を変えて、ローカル インポート コンポーネントの代わりにグローバル インポート コンポーネントを使用します。

3. 実装

constレイアウト = ref<LayoutItem[]>([
      { x: 0, y: 0, 幅: 1, 高さ: 1, 自: 0 },
      { x: 1, y: 0, 幅: 2, 高さ: 1, 自: 1 },
      { x: 0, y: 1, 幅: 2, 高さ: 1, 自: 2 },
      { x: 0, y: 2, 幅: 3, 高さ: 1, 自: 3 },
      { x: 2, y: 1, 幅: 1, 高さ: 1, i: 4 },
    ]);

    <グリッドレイアウト
      :layout="レイアウト"
      :列番号="3"
      :行の高さ="240"
      :ドラッグ可能="true"
      :is-resizable="true"
      :is-mirrored="false"
      :maxRows="3"
      :vertical-compact="true"
      :margin="[10, 10]"
      :use-css-transforms="true"
    >
      <グリッド項目
        v-for="レイアウト内の項目"
        :x="アイテム.x"
        :y="アイテム.y"
        :w="アイテム.w"
        :h="アイテム.h"
        :i="アイテムi"
        :key="item.i"
        @moved="onItemMoved"
      >{{ 項目.i }}</グリッド項目>
    </グリッドレイアウト>

効果:

しかし! !
ここでは、ドラッグ後に各行が埋められるかどうかは決定されず、ドラッグ後に一部のモジュールが覆われ、以下に示すように空白領域が生成されます。

考える:

各行が完全に入力されているかどうかを確認するためのチェックを追加する必要があります。

4. 検証機能

'../types/index' から LayoutItem をインポートします。
'lodash' から { cloneDeep } をインポートします
/**
 * レイアウトが正しいかどうかを確認します* 1. 元の配列を汚染しないように配列をディープコピーします* 2. トラバーサルのyの最大値を取得します* 3. 各yサブ配列を取得し、xの昇順で並べ替えます* 4. 配列の長さが1の場合、wが最大値xに等しいかどうかを判断します
 * 5. 配列の長さが 1 でない場合は、配列を走査して、各要素の w が次の要素の x と等しいかどうかを判断します。w を累積して、合計が最大 x と等しいかどうかを判断します。
 * 6. 合法であればfalseを返す
 * @パラメータリスト 
 * @戻り値 
 */
エクスポートconst verifyLayout = (list: Array<LayoutItem>): boolean => {
    yList を list.map(item => { return item.y });
    yList = yList.sort((a, b) => { return a - b });
    console.log(リスト);
    const newArr = cloneDeep(リスト);
    フラグを false にします。
    定数maxY = yList[yList.length - 1];
    定数maxX = 3;
    コンソールログ(最大Y);
    (i = 0; i <= maxY; i++) の場合 {
        arr = newArr.filter((item: LayoutItem) => { とします。
            item.y === i を返します。
        });
        コンソールにログ出力します。
        (arr && arr.length > 1) の場合 {
            console.log('複数-------------------', i);
            calValue = 0 とします。
            arr = arr.sort((a: LayoutItem, b: LayoutItem) => { return ax - bx })
            arr.forEach((childItem: LayoutItem, index: 数値) => {
                calValue += 子アイテム.w;
                console.log('calValue--------------', calValue, インデックス);
                if (index !== arr.length - 1 && calValue !== arr[index + 1].x) {
                    フラグ = true;
                }
                if (index === arr.length - 1 && calValue !== maxX) {
                    フラグ = true;
                }
            })
        } それ以外 {
            console.log('------------------は1つだけです', i);
            (arr[0].w !== maxX) の場合 {
                フラグ = true
            }
        }
    }
    console.log(フラグ);
    フラグを返します。
}

このアイデアは、機能に関する私のコメントです。
各ドラッグが完了した後にコールバック関数をチェックする

    /**
     * ドラッグ完了イベント* 1. 以前のデータを履歴データに保存します* 2. 次に、移動後のデータをnowlayoutデータに保存します*/
    定数 onItemMoved = () => {
      console.log('移動しました--------------------')
      historyDataList.value.push(cloneDeep(nowLayoutData.value));
      LayoutData.value を cloneDeep(layout.value);
      // 定数 flag = verifyLayout(layout.value);
      // if (フラグ) {
      // 戻る()
      // }
    };
    定数 goBack = () => {
      console.log(履歴データリストの値[履歴データリストの値の長さ - 1]);
      layout.value = historyDataList.value[historyDataList.value.length - 1];
      LayoutData.value を cloneDeep(layout.value);
      履歴データリストの値のポップ();
    }


このように、ドラッグ アンド ドロップするたびに、検証が正当でない場合はロールバックして、すべての行が入力されていることを確認します。 ! ! !

これで、vue-grid-layout プラグインを使用してドラッグ アンド ドロップ レイアウトを実装する Vue3.0 に関するこの記事は終了です。vue-grid-layout プラグインを使用してドラッグ アンド ドロップ レイアウトを実装する Vue3 に関するその他の関連記事については、123WORDPRESS.COM で以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

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

<<:  ウェブデザイン実践者必読のキャリアプラン

>>:  フレックスレイアウトの互換性の問題の概要

推薦する

Douyin ロゴを作成する手順の CSS3 分析

「Tik Tok」も大人気で、ユーザー数は7億人と言われています。今日は、注目を集めるためにTikT...

MySql でリモート接続を許可する方法

MySql でリモート接続を許可する方法この目標を達成するには、2つのことを行う必要がある。ユーザー...

MySQL データベースのデータ テーブルの最適化、外部キーの分析、3 つのパラダイムの使用

この記事では、例を使用して、MySQL データベースのデータ テーブルの最適化、外部キーの使用、およ...

Tomcatソースコードをideaにインポートする方法

目次1. Tomcatコードをダウンロードする2. ダウンロード後のディレクトリ構造3. ソースコー...

バックアップ データをインポートするときに innodb_index_stats がエラーを報告する場合の主キー競合の解決方法

障害の説明percona5.6、mysqldump フルバックアップ、バックアップデータのインポート...

モバイル アプリのユーザー インターフェース設計に関する 10 のヒント

ヒント1: 集中力を保つ最高のモバイル アプリは、1 つのことを非常にうまく行うことに重点を置いてい...

MySQL pt-slave-restart ツールの使い方の紹介

目次MySQL マスター スレーブ レプリケーション環境を設定する場合、マスター データベースとスレ...

SSHパスワードフリーログイン設定方法の詳しい説明(画像とコマンド)

まず、私たちがやりたいことは、serverA の usera を使用して、パスワードなしで serv...

カルーセル効果を実現するための純粋なjs

この記事では、カルーセルマップの効果を実現するためのjsの具体的なコードを参考までに共有します。具体...

MySQL サーバー 5.5 の接続失敗の解決策

mysqlに接続できない問題の解決方法を参考までに紹介します。具体的な内容は以下のとおりです。昨日は...

フラッシュプラグインを使用してPCのカメラを呼び出し、TMLページに埋め込む方法

序文この記事を書いた主な理由は、チームリーダーが、ブラウザを使用してコンピューターのカメラを呼び出し...

ソケット '/tmp/mysql.sock' 経由でローカル MySQL に接続できない解決策

エラーメッセージ:エラー 2002: ソケット '/tmp/mysql.sock' ...

CSS テキスト配置実装コード

フォームを作成するときに、名前、携帯電話番号、出生地などの 2 つのフィールドを揃える状況に遭遇する...

MYSQL トランザクション チュートリアル Yii2.0 マーチャント引き出し機能

序文私はプログラマーとしてスタートした PHP プログラマーです。これまで、トレーニング コースで勉...

優れたWebフォームデザイン事例20選

ソフィー・ハルダッククライドキー埠頭 37 東ソープボックス Rxバランス EEハーバー対比 SVN...