6
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【React】ドラッグ&ドロップで要素を伸び縮みするUIを作ってみる【TypeScript】

Last updated at Posted at 2021-10-25

テーマ

  • とあるReactアプリでドラッグ&ドロップで要素を伸び縮みさせるUIを作って欲しいという依頼があった
  • これだけの要件であればreact-dndを使うと冗長そうなので、今回は使わずに自前で実装してみた

デモ

  • 黒い部分をドラッグ&ドロップすると縦に伸び縮みします

See the Pen React Drag&Drop Resize by mikan3rd (@mikan3rd) on CodePen.

解説

draggable属性

onDrag / onTouchMove

  • ドラッグ中に発生し続けるイベントです
  • onDragイベントはスマートフォン/タブレット端末には対応していないため、代わりにonTouchMoveイベントで代用しています

handleChangeHeightでやっていること

  • React.useRef()を使い、targetRefに伸び縮みさせる要素を渡すようにしています
  • ドラッグ中の位置(引数のclientY) と現在の要素の底の位置(getBoundingClientRect()で取得したbottom)の差分を計算し、現在の要素の高さと足し算することで次の要素の高さを算出します
    -React.useState()のstateでheightを更新すると再レンダリングが大量に発生して遅いため、targetRef.current.style.heightで直接高さを変更して伸び縮みさせるようにしています

onDragStart / dataTransfer.setDragImage()

以上!

  • 自分でUIを作ると色々勉強になりますね、皆さんもぜひ試してみてください!
  • ちなみにReact.useRef()は再レンダリング対象にさせたくない変数としても使えるので覚えておくと便利
6
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?