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

推薦する

PC/Pad/Phoneデバイスに自動的に適応するCSSウェブページレスポンシブレイアウト

序文最近は、PC、iPad、携帯電話、スマートウォッチ、スマートテレビなど、さまざまなデバイスが存在...

MySQL ダーティ ページ フラッシュとテーブル スペースの縮小の原理の分析

mysql ダーティページWAL メカニズムにより、InnoDB はステートメントを更新するときに、...

ウェブサイトのパフォーマンス: 画像とCookieの最適化、モバイルアプリケーションの最適化

前のセクションでは、コンテンツ、サーバー、JavaScript、CSS など、Web サイトのパフォ...

MYSQL マスタースレーブ レプリケーションの知識ポイントの概要

単一の MYSQL サーバーが現在の Web サイトのトラフィックに対応できない場合の最適化ソリュー...

CSS属性のデフォルト値width: autoとwidth: 100%の違いの詳細な説明

幅: 自動子要素(コンテンツ+パディング+境界線+余白を含む)は、親要素のコンテンツ領域全体を埋めま...

iframe テクニックを使用して訪問者 QQ 実装のアイデアとサンプル コードを取得する

今日、仕事中に、一時的に追加した友人から、Web ページを使用して訪問者の QQ を取得する方法を尋...

Linuxファイル削除後にスペースが解放されない問題の詳しい説明

序文システム領域の使用量が大きすぎて消去する必要がある場合、または特定のファイルを消去する必要がある...

Vueはvue-quill-editorリッチテキストエディタを使用し、画像をサーバーにアップロードします。

目次1. 準備2. グローバルコンポーネント quill-editor を定義する1. テンプレート...

Founder フォント ライブラリの中国語と英語のファイル名比較表

Founder Type Library は、Founder Type Library ビジネス チ...

読み取り専用と無効の違い

要約すると: Readonly は入力 (テキスト/パスワード) とテキスト領域に対してのみ有効です...

Centos7でのSambaサーバー構成(実戦)

サンバの概要Samba は、Linux および UNIX システム上で SMB プロトコルを実装する...

CocosCreator ユニバーサルフレームワークデザインネットワーク

目次序文Websocketの使用Websocketオブジェクトの構築Websocket ステータスW...

シェアしたい絶妙なApple風無料アイコン素材18セット

Apple マグカップのアイコンと追加機能 HD ストレージボックス – アドオンパックセイバースノ...

Docker 学習: コンテナ コンテナの具体的な使用方法

コンテナは Docker のもう一つの中心的な概念です。簡単に言えば、コンテナとは、独立して実行され...

HTML ベースタグ target=_parent の使用の紹介

<base> タグは、ページ上のすべてのリンクのデフォルトのアドレスまたはデフォルトのタ...