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 のフィールドにデフォルトの時間を追加する方法

推薦する

サーバー上で selenium+chromedriver を実行するための詳細なチュートリアル

1. はじめにSelenium を使用して Web サイトからデータをスクレイピングしたいのですが、...

Linux で ARM 開発ボード用のファイルシステムを作成する

1. Busyboxのソースコードをオンラインでダウンロードしてください。コンパイル方法については、...

MySQL の frm ファイルからテーブル構造を復元する 3 つの方法 [推奨]

mysql が正常に実行されている場合、テーブル構造を表示することは難しくありません。しかし、場合...

Vue Nativeを使用したモバイルアプリケーションの構築プロセスの完全な記録

目次序文Vue Nativeの機能宣言的レンダリング双方向バインディングVue.js エコシステムの...

Nodejs での WeChat アプレット メッセージ プッシュの実装

サブスクリプションメッセージテンプレートを選択または作成するWeChat アプレットにログインし、「...

Vue での bimface の使用に関する詳細

目次1. Vue スキャフォールディングをインストールする2. プロジェクトを作成する3.1 プロジ...

相同性とクロスドメイン、jsonp(関数カプセル化)、CORS原則の詳細な分析

目次同一起源ポリシーAjax リクエストの制限: Ajaxは自身のサーバーにのみリクエストを送信でき...

Vue elementUI はツリー構造テーブルと遅延読み込みを実装します

目次1. 成果を達成する2. バックエンドの実装2.1 エンティティクラス2.2 データベース内のデ...

Linux環境でのDockerインストールチュートリアル

1. 設置環境Dockerは次のCentOSバージョンをサポートしていますCentOS 6.5 (6...

aタグ疑似クラスの機能と記述順序は何ですか?

a タグ疑似クラスの役割: 「:link」: 訪問されていないタグの状態。 「:visited」: ...

MySQLデータベースホスト127.0.0.1とlocalhostの違い

私の友人の多くは、127.0.0.1 と localhost の違いがわからず、問題に遭遇するかもし...

CentOS で yum を使用して rabbitmq-server をインストールする方法

RabbitMQをインストールする前にSocatをインストールする必要があります。そうしないと、Ra...

React は antd のアップロード コンポーネントを使用してファイル フォーム送信機能を実装します (完全なコード)

私はプロジェクトを実行するために react を使い始めたばかりで、非常に未熟で完全な初心者です。私...

Nodejs 探索: シングルスレッドの高並行性の原理を深く理解する

目次序文一目でわかる建築オペレーティングシステムとの対話シングルスレッドイベント駆動/イベントループ...

Vue ルーティングフォールバックに最適なソリューション (vue-route-manager)

目次ルーティングマネージャー背景はじめる問題を解決する方法要約するルーティングマネージャー各ジャンプ...