react-beautiful-dnd はコンポーネントのドラッグ アンド ドロップ機能を実装します

react-beautiful-dnd はコンポーネントのドラッグ アンド ドロップ機能を実装します

React.js 用の美しくポータブルなドラッグ アンド ドロップ リスト ライブラリ。 react-beautiful-dnd の機能と適用可能なユーザーの詳細については、公式ドキュメントと中国語翻訳ドキュメントを参照してください。

参考: https://www.npmjs.com/package/react-beautiful-dnd

1. インストール

既存の React プロジェクトで次のコマンドを実行するのはとても簡単です。

# 糸
糸を追加 react-beautiful-dnd
 
# ネプチューン
npm をインストール react-beautiful-dnd --save

2.APi

詳細については公式ドキュメントを参照してください。

3. react-beautiful-dnd デモ

3.1 デモ1 垂直コンポーネントドラッグ

効果は以下のとおりです。

デモ1.gif

実装コード:

React をインポートします。{ コンポーネント } から "react" をインポートします。
「react-beautiful-dnd」から { DragDropContext、Droppable、Draggable } をインポートします。
 
// データを初期化 const getItems = count =>
  Array.from({ length: count }, (v, k) => k).map(k => ({
    id: `item-${k + 1}`,
    コンテンツ: `これはコンテンツ ${k + 1} です`
  }));
 
// 配列の順序を再記録する const reorder = (list, startIndex, endIndex) => {
  const 結果 = Array.from(リスト);
 
  const [削除済み] = result.splice(startIndex, 1);
 
  result.splice(endIndex, 0, 削除済み);
  結果を返します。
};
 
定数グリッド = 8;
 
// スタイルを設定する const getItemStyle = (isDragging, draggableStyle) => ({
  // アイテムの見栄えを良くするための基本的なスタイル
  ユーザー選択: "なし",
  パディング: グリッド * 2、
  マージン: `0 0 ${grid}px 0`,
 
  // ドラッグすると背景が変わります background: isDragging ? "lightgreen" : "#ffffff",
 
  // ドラッグ可能なものに適用する必要があるスタイル
  ...ドラッグ可能なスタイル
});
 
定数 getListStyle = () => ({
  背景: '黒'、
  パディング: グリッド、
  幅: 250
});
 
 
 
デフォルトクラスReactBeautifulDndをエクスポートし、Componentを拡張します。
  コンストラクタ(props) {
    スーパー(小道具);
    この状態 = {
      アイテム: getItems(11)
    };
    this.onDragEnd = this.onDragEnd.bind(this);
  }
 
  onDragEnd(結果) {
    if (!result.destination) {
      戻る;
    }
 
    const アイテム = 並べ替え(
      this.state.items、
      結果.ソース.インデックス、
      結果.宛先.インデックス
    );
 
    this.setState({
      アイテム
    });
  }
 
 
  与える() {
    戻る (
      <DragDropContext onDragEnd={this.onDragEnd}>
        <中央>
          <ドロップ可能 droppableId="ドロップ可能">
            {(提供、スナップショット) => (
              <div
              //provided.droppableProps が適用されている同じ要素。
                {...提供されたドロップ可能なプロパティ}
                // ドロップ可能オブジェクトが適切に動作するには、提供された可能な限り最上位の DOM ノードにバインドする必要があります。innerRef。
                ref={provided.innerRef}
                スタイル={getListStyle(スナップショット)}
              >
                {this.state.items.map((item, index) => (
                  <ドラッグ可能なキー={item.id} ドラッグ可能なId={item.id} インデックス={index}>
                    {(提供、スナップショット) => (
                      <div
                        ref={provided.innerRef}
                        {...提供されるドラッグ可能なプロパティ}
                        {...提供されるdragHandleProps}
                        スタイル={getItemStyle(
                          スナップショット.isDragging、
                          提供された.draggableProps.style
                        )}
                      >
                        {アイテムコンテンツ}
                      </div>
                    )}
                  </ドラッグ可能>
                ))}
                {提供されたプレースホルダー}
              </div>
            )}
          </ドロップ可能>
        </center>
      </ドラッグドロップコンテキスト>
    );
  }
}

3.2 デモ2 水平ドラッグ

効果は以下のとおりです。

デモ2.gif

実装コード: 実際、垂直ドラッグに似ています。Droppable は配置順序の属性として direction="horizo​​ntal" を追加します。

React をインポートします。{ コンポーネント } から "react" をインポートします。
「react-beautiful-dnd」から { DragDropContext、Droppable、Draggable } をインポートします。
 
 
定数getItems = count => (
  Array.from({ length: count }, (v, k) => k).map(k => ({
    id: `item-${k + 1}`,
    コンテンツ: `これはコンテンツ ${k + 1} です`
  }))
)
 
// 配列の順序を再記録する const reorder = (list, startIndex, endIndex) => {
  const 結果 = Array.from(リスト);
  // 削除された要素を削除して記録します const [removed] = result.splice(startIndex, 1);
  // 元の要素を配列に追加します result.splice(endIndex, 0, removed);
  結果を返します。
};
 
定数グリッド = 8;
 
 
// スタイルを設定する const getItemStyle = (isDragging, draggableStyle) => ({
  // アイテムの見栄えを良くするための基本的なスタイル
  ユーザー選択: "なし",
  パディング: グリッド * 2、
  マージン: `0 ${grid}px 0 0 `,
 
  // ドラッグすると背景が変わります background: isDragging ? "lightgreen" : "#ffffff",
 
  // ドラッグ可能なものに適用する必要があるスタイル
  ...ドラッグ可能なスタイル
});
 
定数 getListStyle = () => ({
  背景: '黒'、
  表示: 'flex'、
  パディング: グリッド、
  オーバーフロー: 'auto'、
});
 
 
クラスReactBeautifulDndHorizo​​ntalはComponentを拡張します{
  コンストラクタ(props) {
    スーパー(小道具);
    この状態 = {
      アイテム: getItems(10)
    };
    this.onDragEnd = this.onDragEnd.bind(this);
  }
 
  onDragEnd(結果) {
    if (!result.destination) {
      戻る;
    }
 
    const アイテム = 並べ替え(
      this.state.items、
      結果.ソース.インデックス、
      結果.宛先.インデックス
    );
 
    this.setState({
      アイテム
    });
  }
 
  与える() {
    戻る (
      <DragDropContext onDragEnd={this.onDragEnd}>
        <ドロップ可能 droppableId="ドロップ可能" direction="水平">
          {(提供、スナップショット) => (
            <div
              {...提供されたドロップ可能なプロパティ}
              ref={provided.innerRef}
              スタイル={getListStyle(snapshot.isDraggingOver)}
            >
              {this.state.items.map((item, index) => (
                <ドラッグ可能なキー={item.id} ドラッグ可能なID={item.id} インデックス={index}>
                  {(提供、スナップショット) => (
                    <div
                      ref={provided.innerRef}
                      {...提供されるドラッグ可能なプロパティ}
                      {...提供されるdragHandleProps}
                      スタイル={getItemStyle(
                        スナップショット.isDragging、
                        提供された.draggableProps.style
                      )}
                    >
                      {アイテムコンテンツ}
                    </div>
                  )}
                </ドラッグ可能>
              ))}
              {提供されたプレースホルダー}
            </div>
          )}
        </ドロップ可能>
      </ドラッグドロップコンテキスト>
    )
  }
}
 
デフォルトのReactBeautifulDndHorizo​​ntalをエクスポートする

3.3 デモ3はToDo項目のドラッグ(垂直および水平ドラッグ)を実装します

デモ3.gif

実装の原則は実際には似ています。コードは整理されて github に配置されます。アドレス: github

4. 感情

現時点では react-beautiful-dnd を使用しているだけですが、使い始めるのは非常に簡単で、API も複雑ではありません。パフォーマンスも良好です (demo2 では 170 を超えるタスクがレンダリングされました。ドラッグは相変わらず滑らかです)。今後、欠陥に気付いた場合は、その点をマークしておきます。

react-beautiful-dnd コンポーネントのドラッグ アンド ドロップに関するこの記事はこれで終わりです。 react-beautiful-dnd コンポーネントのドラッグ アンド ドロップに関する関連コンテンツについては、123WORDPRESS.COM で以前の記事を検索するか、以下の関連記事を引き続き参照してください。 今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • ドラッグ可能で編集可能なガントチャートの詳細な説明(HighchartsはVueとReactで使用できます)
  • Typescript+React でモバイルと PC でシンプルなドラッグ アンド ドロップ効果を実現
  • react-beautiful-dnd を使用してリスト間のドラッグ アンド ドロップを実装する
  • Reactドラッグフックを実装するための100行以上のコード
  • React.js コンポーネントはドラッグ アンド ドロップによるソート コンポーネント機能のプロセス分析を実装します
  • ドラッグアンドドロップ機能を実装するReactサンプルコード
  • React.js コンポーネントはドラッグ アンド ドロップ コピーとソート可能なサンプル コードを実装します
  • React.jsがネイティブjsドラッグエフェクトを実装することで発生する一連の問題についてもう一度話しましょう
  • React.js をベースにしたネイティブ js ドラッグ エフェクトの実装に関する考察
  • Reactはシンプルなドラッグアンドドロップ機能を実装します

<<:  MySQL 5.7 に組み込まれているストレス テストの mysqlslap コマンドと構文の詳細な説明

>>:  MySQL のフィールドにデフォルトの時間を追加する方法

推薦する

Linux で yum と入力した後に -bash: /usr/bin/yum: No such file or directory という問題を解決する方法

Linuxでyumを入力すると、プロンプトが表示されます: -bash: /usr/bin/yum:...

MySql 5.7.17 無料インストール構成チュートリアルの詳細な説明

1. mysql-5.7.17-winx64.zip インストール パッケージをダウンロードします ...

ブラウザをJavaScriptで対話させる方法

目次1. 最も単純な例2. 音声の速度とピッチをカスタマイズする3. 音量の調整方法4. よく使われ...

Mysqlはフィールドスプライシングのための3つの関数を実装している

データをオペレーションにエクスポートする場合、フィールドの結合は避けられません。MySQL でこれが...

MySQL マスター スレーブ データベースが同期されない問題を解決する 2 つの方法

目次MySQL マスター スレーブ データベースが同期されない問題を解決する 2 つの方法1. 非同...

HTML外部参照CSSファイルが効果を発揮しない理由の分析と解決

フロントエンドの初心者として、私は数日間フロントエンドをいじってみました。 。今日、私は自分が固く信...

1 つの記事で Vue ミドルウェア パイプラインを学ぶ

SPA を構築する場合、多くの場合、特定のルートを保護する必要があります。たとえば、認証されたユーザ...

Linuxプロセスネットワークトラフィック統計の実装プロセス

序文Linux には、ネットワーク接続、プロセス、およびその他の情報をリアルタイムで収集するための対...

CSS フレックスレイアウトのリストの最後の行を左揃えにする N 通りの方法 (要約)

張新旭氏の記事を引用して皆さんにシェアしたいと思います。 変更を加えたい場合は、対応する画像によって...

MySQL での coalesce() の使用に関するヒントのまとめ

序文最近、偶然 MySQL の coalesce を発見しました。ちょうど時間があったので、MySQ...

MySQL でスロークエリを有効にする方法の例

序文スロー クエリ ログは、MySQL で非常に重要な機能です。MySQL のスロー クエリ ログ機...

ウィンドウの中央にブロック要素の位置を設定する方法

ウィンドウの中央にブロック要素の位置を設定する方法ブロック要素をウィンドウの中央に配置する上記の方法...

MySqlデータベースの基礎知識のまとめ

目次基本的なデータベース操作2) データベースを表示する3) データベースを選択する4) データベー...

JavaScript で簡単な計算機を実装する

この記事の例では、参考までに簡単な計算機を実装するためのJavaScriptの具体的なコードを共有し...

概要ページでのフロートとクリアフロート

1. フロート: 主な目的は、テキストを画像の周囲に折り返す効果を実現することです。また、複数列レイ...