最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用react-beautiful-dnd實(shí)現(xiàn)列表間拖拽踩坑

 更新時(shí)間:2021年05月24日 10:33:17   作者:雨時(shí)_Kaylee  
相比于react-dnd,react-beautiful-dnd更適用于列表之間拖拽的場(chǎng)景,本文主要介紹了使用react-beautiful-dnd實(shí)現(xiàn)列表間拖拽踩坑,感興趣的可以了解一下

為什么選用react-beautiful-dnd

相比于react-dnd,react-beautiful-dnd更適用于列表之間拖拽的場(chǎng)景,支持移動(dòng)端,且較為容易上手。

基本使用方法

基本概念

  • DragDropContext:構(gòu)建一個(gè)可以拖拽的范圍
  • onDragStart:拖拽開(kāi)始回調(diào)
  • onDragUpdate:拖拽中的回調(diào)
  • onDragEnd:拖拽結(jié)束時(shí)的回調(diào)
  • Droppable - 可以放置拖拽塊的區(qū)域
  • Draggalbe - 可被拖拽的元素

使用方法

把你想能夠拖放的代碼放到DragDropContext中

import { DragDropContext } from 'react-beautiful-dnd';

class App extends React.Component {
  onDragStart = () => {
    /*...*/
  };
  onDragUpdate = () => {
    /*...*/
  }
  onDragEnd = () => {
    // the only one that is required
  };

  render() {
    return (
      <DragDropContext
        onDragStart={this.onDragStart}
        onDragUpdate={this.onDragUpdate}
        onDragEnd={this.onDragEnd}
      >
        <div>Hello world</div>
      </DragDropContext>
    );
  }
}

確定可放置區(qū)域Dropppable

import { DragDropContext, Droppable } from 'react-beautiful-dnd';

class App extends React.Component {
  // ...
  render() {
    return (
      <DragDropContext
        onDragStart={this.onDragStart}
        onDragUpdate={this.onDragUpdate}
        onDragEnd={this.onDragEnd}
      >
        <Droppable droppableId="droppable-1">
          {(provided, snapshot) => (
            <div
              ref={provided.innerRef}
              style={{ backgroundColor: snapshot.isDraggingOver ? 'blue' : 'grey' }}
              {...provided.droppableProps}
            >
              <h2>I am a droppable!</h2>
              {provided.placeholder}
            </div>
          )}
        </Droppable>
      </DragDropContext>
    );
  }
}
  • 必需的DroppableId(字符串),用于唯一標(biāo)識(shí)應(yīng)用程序的droppable。不要更改此ID特別是在拖動(dòng)時(shí)
  • provided.placeholder: 占位符(這個(gè)占位符是默認(rèn)的,一般不咋符合需求)
  • snapshot: 當(dāng)前拖動(dòng)狀態(tài),可以用來(lái)在被拖動(dòng)時(shí)改變Droppable的外觀

在Dropppable區(qū)域使用Draggable包裹拖拽元素

import { DragDropContext, Droppable, Draggable } from 'react-beautiful-dnd';

class App extends React.Component {
  // ...

  render() {
    return (
      <DragDropContext
        onDragStart={this.onDragStart}
        onDragUpdate={this.onDragUpdate}
        onDragEnd={this.onDragEnd}
      >
        <Droppable droppableId="droppable-1">
          {(provided, snapshot) => (
            <div
              ref={provided.innerRef}
              style={{ backgroundColor: snapshot.isDraggingOver ? 'blue' : 'grey' }}
              {...provided.droppableProps}
            >
              <Draggable draggableId="draggable-1" index={0}>
                {(provided, snapshot) => (
                    <div
                      ref={provided.innerRef}
                      {...provided.draggableProps}
                      {...provided.dragHandleProps}
                    >
                      <h4>My draggable</h4>
                    </div>
                )}
              </Draggable>
              {provided.placeholder}
            </div>
          )}
        </Droppable>
      </DragDropContext>
    );
  }
}
  • Draggable必須始終包含在Droppable中
  • DraggablebId(字符串):必須存在唯一ID,和index(如果為遍歷 key也需要)不要更改此ID,特別是在拖動(dòng)時(shí)

拖拽結(jié)束時(shí),改變?cè)磾?shù)據(jù)

onDragEnd = result => {
  const { source, destination, draggableId } = result;
  if (!destination) {
    return;
  }

  // 修改源和目標(biāo)數(shù)組,將拖拽元素從源數(shù)組中刪除,再插入到目標(biāo)數(shù)組中
  this.setState({
    xxx: xxx,
  });
}

使用過(guò)程中遇到的問(wèn)題

向拖拽的目標(biāo)區(qū)域增加自定義占位符(custom placeholder)

react-beautiful-dnd在拖拽到目標(biāo)區(qū)域時(shí),目標(biāo)區(qū)域的元素之間會(huì)給當(dāng)前拖拽元會(huì)自動(dòng)空出一段space,這段space的距離是目標(biāo)區(qū)域Draggable元素的大?。ǖ话ㄔ氐膍argin邊距,這也是一個(gè)坑,下文會(huì)說(shuō)到解決方法)。

因此可以在這段距離中采用絕對(duì)定位,增加自定義占位符。具體做法:計(jì)算出當(dāng)前自定義占位符元素的left & top距離,在dragUpdate事件中更新這兩個(gè)距離,可參考beatiful-dnd-custom-placeholder-demo

拖拽時(shí),修改拖拽元素的transform屬性,導(dǎo)致拖拽會(huì)卡死在某處,拖拽元素放置位置錯(cuò)誤

在官方文檔中,有這樣一段說(shuō)明, 大概是說(shuō)draggable元素采用了position: fixed定位,但會(huì)受到transform會(huì)影響。

#### Warning: `position: fixed`

`react-beautiful-dnd` uses `position: fixed` to position the dragging element. This is quite robust and allows for you to have `position: relative | absolute | fixed` parents. However, unfortunately `position:fixed` is [impacted by `transform`](http://meyerweb.com/eric/thoughts/2011/09/12/un-fixing-fixed-elements-with-css-transforms/) (such as `transform: rotate(10deg);`). This means that if you have a `transform: *` on one of the parents of a `<Draggable />` then the positioning logic will be incorrect while dragging. Lame! For most consumers this will not be an issue.

To get around this you can [reparent your <Draggable />](/docs/guides/reparenting.md). We do not enable this functionality by default as it has performance problems.

提供了如下解決方法:使用createPortal給拖動(dòng)元素掛在空的父元素上,可參考issue: transform on parent messes up dragging positioning

但是這個(gè)方法并不能解決我的問(wèn)題,因?yàn)檫€有自定義placeholder的需求。在拖拽時(shí)還需要計(jì)算placeholder的left的距離,也就需要獲取當(dāng)前拖拽元素的parentNode下的子元素,使用createPortal則獲取不到拖拽元素的原parentNode,因此放棄createPortal的方案。采用改變width和height達(dá)到transform:scale的效果。

移動(dòng)端拖拽元素需要長(zhǎng)按該元素(long-press)

官方文檔中給出的說(shuō)明是,在移動(dòng)端場(chǎng)景下,在draggable元素上的手指操作,無(wú)法確定是tap,force press,或者scroll,所以需要長(zhǎng)按該元素才能確定是拖拽。

Starting a drag: long press
A user can start a drag by holding their finger 👇 on an element for a small period of time 🕑 (long press)

拖拽某個(gè)元素懸停在目標(biāo)位置時(shí),空出的插入space距離不準(zhǔn)確的問(wèn)題
這個(gè)就是上文中提到的,Draggable之間留的placeholder的空余距離是一個(gè)Draggable的距離,但不包括Dragglable的margin邊距,可參考這個(gè)issue。

最后采用padding來(lái)控制Draggable之間的距離,這樣在拖拽時(shí)空出的space就包括了padding。

總結(jié)

react-beautiful-dnd比較容易上手, 到2021年3月發(fā)布了v13.1.0較為活躍, 以上踩過(guò)的坑,希望對(duì)大家有所幫助。

參考資料

官網(wǎng)beautiful-dnd
react-beautiful-dnd入門(mén)教程

到此這篇關(guān)于使用react-beautiful-dnd實(shí)現(xiàn)列表間拖拽踩坑 的文章就介紹到這了,更多相關(guān)react 列表拖拽內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 嘗試自己動(dòng)手用react來(lái)寫(xiě)一個(gè)分頁(yè)組件(小結(jié))

    嘗試自己動(dòng)手用react來(lái)寫(xiě)一個(gè)分頁(yè)組件(小結(jié))

    本篇文章主要介紹了嘗試自己動(dòng)手用react來(lái)寫(xiě)一個(gè)分頁(yè)組件(小結(jié)),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-02-02
  • react native實(shí)現(xiàn)往服務(wù)器上傳網(wǎng)絡(luò)圖片的實(shí)例

    react native實(shí)現(xiàn)往服務(wù)器上傳網(wǎng)絡(luò)圖片的實(shí)例

    下面小編就為大家?guī)?lái)一篇react native實(shí)現(xiàn)往服務(wù)器上傳網(wǎng)絡(luò)圖片的實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-08-08
  • 解讀react的onClick自動(dòng)觸發(fā)等相關(guān)問(wèn)題

    解讀react的onClick自動(dòng)觸發(fā)等相關(guān)問(wèn)題

    這篇文章主要介紹了解讀react的onClick自動(dòng)觸發(fā)等相關(guān)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • React使用fullpage.js實(shí)現(xiàn)整屏翻頁(yè)功能

    React使用fullpage.js實(shí)現(xiàn)整屏翻頁(yè)功能

    最近筆者在完成一個(gè)移動(dòng)端小項(xiàng)目的過(guò)程中需要實(shí)現(xiàn)整屏翻頁(yè)的效果;調(diào)研完畢之后,最終決定使用pullPage.js實(shí)現(xiàn)此功能,fullPage.js使用起來(lái)比較方便,并且官網(wǎng)上也給了在react項(xiàng)目中使用的demo,本文記錄了這個(gè)第三方庫(kù)的使用過(guò)程,感興趣的朋友可以參考下
    2023-11-11
  • React Hooks核心原理深入分析講解

    React Hooks核心原理深入分析講解

    這篇文章主要介紹了react hooks實(shí)現(xiàn)原理,文中給大家介紹了useState dispatch 函數(shù)如何與其使用的 Function Component 進(jìn)行綁定,節(jié)后實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-12-12
  • 詳解React Native網(wǎng)絡(luò)請(qǐng)求fetch簡(jiǎn)單封裝

    詳解React Native網(wǎng)絡(luò)請(qǐng)求fetch簡(jiǎn)單封裝

    本篇文章主要介紹了詳解React Native網(wǎng)絡(luò)請(qǐng)求fetch簡(jiǎn)單封裝,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-08-08
  • React全家桶環(huán)境搭建過(guò)程詳解

    React全家桶環(huán)境搭建過(guò)程詳解

    本篇文章主要介紹了React全家桶環(huán)境搭建過(guò)程詳解,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-05-05
  • React?代碼拆分的幾種方法示例詳解

    React?代碼拆分的幾種方法示例詳解

    這篇文章主要為大家介紹了React?代碼拆分的幾種方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • 詳解如何使用React構(gòu)建跑馬燈組件

    詳解如何使用React構(gòu)建跑馬燈組件

    當(dāng)你想到跑馬燈時(shí),往往會(huì)想到游樂(lè)園里那些充滿活力的燈光和旋轉(zhuǎn)的顯示,帶回童年的美好回憶,本文將和大家一起探索如何在 React 中構(gòu)建一個(gè)引人入勝的跑馬燈組件,需要的朋友可以參考下
    2024-04-04
  • React Hooks: useEffect()調(diào)用了兩次問(wèn)題分析

    React Hooks: useEffect()調(diào)用了兩次問(wèn)題分析

    這篇文章主要為大家介紹了React Hooks: useEffect()調(diào)用了兩次問(wèn)題分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11

最新評(píng)論

金溪县| 绥化市| 平陆县| 枞阳县| 望谟县| 巢湖市| 玉环县| 宜州市| 凌云县| 叶城县| 海原县| 蒙山县| 西峡县| 灵宝市| 承德市| 禹州市| 高青县| 五原县| 丹巴县| 镇宁| 灵川县| 禹州市| 安阳县| 密云县| 彭阳县| 永新县| 太白县| 河间市| 湖北省| 女性| 高陵县| 东海县| 乐山市| 偃师市| 兴和县| 堆龙德庆县| 班戈县| 双辽市| 盐山县| 铁岭市| 南澳县|