最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • react-beautiful-dnd新版拖拽组件你值得拥有

    正文概述 掘金(cc123nice)   2021-02-26   1320

    1、安装

    yarn add react-beautiful-dnd
    

    2、总体一览

    - 瞄一眼官方图

    名称中文名作用/写法
    DragDropContext拖拽上下文就是context写于最外侧包裹需要拖拽的组件Droppable可放置组件包裹可放置组件Draggable可拖拽组件包裹可拖拽组件

    react-beautiful-dnd新版拖拽组件你值得拥有

    - 三兄弟如何书写

    DragDropContext
    • 写法
    import React, {useState} from "react";
    import {DragDropContext} from "react-beautiful-dnd";
    
    const TodoList = () => {
      const dragEnd = (e) => {
        // 拖拽结束后
    	  // do something 。。。。
      };
      return (
        <DragDropContext
          onDragEnd={(e)=>dragEnd(e)}
       // onDragUpdate = {(e)=>dragUpdate(e)}
       // onDragStart = {(e)=>dragStart(e)}
        >
          {
            //你的<Droppable/>组件
          }
        </DragDropContext>
      );
    };
    
    export default TodoList;
    
    • api

    我们来看看这些函数的e

    字段含义
    draggableId拖拽的组件的id+source拖拽源头- source.dropppableId位于可扔的id号- source.index拖拽index下标+destination当前目标位置(目的地)- destination.dropppableId位于可扔的id号- destination.index位于可扔的index下标
    // `onDragStart`
    const start = {
      draggableId: 'task1',
      type: 'TYPE',
      source: {
        dropppableId: 'column1',
        index: 0
      }
    }
    
    // `onDragUpdate`
    const update = {
      ...start,
      destination: {
        dropppableId: 'column1',
        index: 1
      }
    }
    
    // `onDragEnd`
    const end = {
      ...update,
      reason: 'DROP'
    }
    
    Droppable
    • 每一个组件都有一个droppableId参数,用来标注唯一的放置Id(上面提到的三个回调中出现的,确保唯一)

    • 在组件内侧只接受函数,官方说可以更好让开发者自由发挥操作,但有些必要的参数必须书写

      /*
      ** 写于<Droppable/>标签中的funtion的框架
      ** - provided参数:提供内部标签所需的props【套路记住即可】
      ** 		1、innerRef:获取ref funtion组件是ref,class组件是innerRef
      **    2、droppableProps: 提供能够放置的props,在function的根结点展开即可{...provided.droppableProps}
      **    3、placeholder: 占位符,放置在function根节点内部的最下面
      ** - snapshot参数:此为快照(让我好容易想到mobx里的快照不知道为什么,但不一样,详见下面解析)
      */		
      {
        (provided, snapshot) => (
          <div 
            ref={provided.innerRef}
            {...provided.droppableProps}
          >
            {
      				// 你的<Draggable/> 组件
            }
            {provided.placeholder}
          </div>
         )
      }
      
    • 示例:

    import React from "react";
    import {Droppable} from "react-beautiful-dnd";
    import Task from "./task";
    
    const Column = ({id, title, tasks}) => (
      <>
        <Droppable droppableId={id}>
          {(provided, snapshot) => (
            <div ref={provided.innerRef} {...provided.droppableProps}>
              {tasks.map((task, index) => (
                <Task key={task.id} {...task} index={index} />
              ))}
              {provided.placeholder}
            </div>
          )}
        </Droppable>
      </>
    );
    
    export default Column;
    
    Draggable
    • 首先有个droppableId确保唯一性,我们的当然也有啦!此外还有一个index

      • draggableId确保拖拽唯一性,并在三个回调函数中调用
      • index拖拽下标:拖拽理论上总归是在列表中上下移动位置,拖拽位置不同,排列下标也不同,index就是为了排序的
    • 在组件内侧只接受函数,和上面差不多

      /*
      ** 写于<Draggable/>标签中的funtion的框架
      */		
      {
        (provided, snapshot) => (
        	<div
          	ref={provided.innerRef}
        		{...provided.dragHandleProps}
      			{...provided.draggableProps}
      		>
        		{
      				// 你想渲染的拖拽组件
      			}
        	</div>
      	)
      }
      
      • provided参数:提供内部标签所需的props【套路记住即可】

        • 1、innerRef:获取ref funtion组件是ref,class组件是innerRef

        • 2、draggableProps: 提供能够拖拽的props,在function的根结点展开即可{...provided.draggableProps}

        • 3、dragHandleProps: 绑定在真正想要拖拽的组件上(不理解?看个场景)

          react-beautiful-dnd新版拖拽组件你值得拥有

          此时我们需要做一个可拖拽排序的列表,但只能拖拽左上角的人头,其他的地方不起拖拽效果

          只需要在想要拖拽的组件上添加上{...provided.dragHandleProps}即可

          {
            (provided, snapshot) => (
            	<div
              	ref={provided.innerRef}
            	// - {...provided.dragHandleProps}
          			{...provided.draggableProps}
          		>
            		{
          				<div>
                		<Avature 
                      {...provided.dragHandleProps}
                      />
                    <OtherContent/>
                	</div>
          			}
            	</div>
          	)
          }
          
      • snapshot参数:此为快照,里的函数也有,我们一起来看看这是干啥的

        • 先来看看参数里面有什么东西

          // snapshot in <Draggable/>
          const draggableSnapShot = {
            isDragging: true,
            draggingOver: 'column1'		// 拖拽穿过的可放置组件id即 droppableId
          }
                
          // snapshot in <Droppable/>
          const droppableSnapShot = {
            isDraggingOver: true,
            draggingOverWith: 'task1'	// 正被拖拽穿过我的拖拽组件id即 draggableId
          }
          
        • 对于可拖拽的组件来说,它被拖拽时关心的是经过了哪些被放置的组件

          对于可放置的组件来说,它关心的是经过了哪些可拖拽组件被拖拽经过

    • 示例:

    import React from "react";
    import {Draggable} from "react-beautiful-dnd";
    
    const Task = ({id, content, index}) => {
      return (
        <div style={{margin: 3}}>
          <Draggable draggableId={id} index={index}>
            {(provided, snapshot) => (
              <div
                {...provided.dragHandleProps}
                {...provided.draggableProps}
                ref={provided.innerRef}
              >
                {// eslint-disable-next-line max-len
                  <div style={{border: "2px solid #000", background: snapshot.isDragging?"#ccc":"lightgreen"}}>{content}</div>
                }</div>
            )}
          </Draggable>
        </div>
      );
    };
    
    export default Task;
    

    起源地下载网 » react-beautiful-dnd新版拖拽组件你值得拥有

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元