react-dnd 中的动画

Posted

技术标签:

【中文标题】react-dnd 中的动画【英文标题】:Animation in react-dnd 【发布时间】:2016-06-15 12:23:42 【问题描述】:

在this Angular example 中,如果您将一个苹果拖到橙色部分并将其放在那里,则会有一个动画缓慢地将苹果返回到它原来的位置。这在视觉上表明将苹果拖到橙色部分是无效的。使用的 Angular 拖放库来自codef0rmer。

如何在 react-dnd 或其他 react 拖放包中创建类似的动画?

Here 是一个带有一些动画的 React 拖放示例。我可以用 react-dnd 或其他广泛使用的包做这样的事情吗?

其余的是 Angular 示例代码,它也在 plnkr Angular 示例中。

index.html:

<!DOCTYPE html>
<html ng-app="drag-and-drop">

<head lang="en">
  <meta charset="utf-8">
  <title>Drag & Drop: Multiple listsr</title>
  <script src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
  <script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1/jquery-ui.min.js"></script>
  <script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.2.0/angular.min.js"></script>
  <link href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.10.3/themes/ui-lightness/jquery-ui.min.css" rel="stylesheet" type="text/css" />
  <link href="http://netdna.bootstrapcdn.com/twitter-bootstrap/2.1.1/css/bootstrap.min.css" rel="stylesheet">
  <script src="angular-dragdrop.min.js"></script>
  <script src="app.js"></script>
  <style>
    .thumbnail 
      height: 280px !important;
       

    .btn-droppable 
      width: 180px;
      height: 30px;
      padding-left: 4px;
       

    .btn-draggable 
      width: 160px;
       
  </style>
</head>
<body>
  <div ng-controller="oneCtrl">
    <!-- Drag Apple -->
    <div>
      <div class="btn" 
        ng-repeat="item in applesin"
        data-drag=true
        data-jqyoui-options="revert: 'invalid'"
        ng-model="applesin"
        jqyoui-draggable="index: $index, placeholder:'keep', animate:true"
      >
        item.title
      </div>
    </div>

    <!-- Drop Apple -->
    <div>
      <div class="thumbnail" 
        data-drop="true" 
        ng-model="applesout" 
        data-jqyoui-options="appleOptions" 
        data-jqyoui-droppable="onDrop: 'appleOnDrop'"
      >
        <div 
          ng-hide=applesout.title
          ng-model="applesout"
        >
          Drop an apple here
        </div>
        <div 
          class="btn" 
          ng-hide=!applesout.title
          ng-model="applesout" 
        >
          applesout.title
        </div>
      </div>
    </div>
    <!-- Drag Orange -->
    <div>
      <div class="btn" 
        ng-model="orangesin"
        ng-repeat="item in orangesin"
        data-drag="true"
        data-jqyoui-options="
          revert: 'invalid',
          scroll: 'true',
          containment: 'body',
          helper: 'clone',
          appendTo: 'body'
        "
        jqyoui-draggable="index: $index, placeholder:'keep', animate:true"
      >
        item.title
      </div>
    </div>
    <!-- Drop Orange-->
    <div>
      <div class="thumbnail" 
        data-drop="true"
        ng-model="orangesout" 
        data-jqyoui-options="validateDropOranges" 
        jqyoui-droppable="multiple:false">
        <div
          ng-hide=orangesout.title
          ng-model="orangesout" 
        >
          Drop an orange here
        </div>
        <div 
          class="btn" 
          ng-hide=!orangesout.title
          ng-model="orangesout" 
        >
          orangesout.title
        </div>
      </div>
    </div>
  </div>
</body>
</html>

还有 app.js:

varApp = angular.module('drag-and-drop', ['ngDragDrop']);

App.controller('oneCtrl',function($scope, $timeout) 

  $scope.applesin = [ 
     'title': 'Apple 1',
     'title': 'Apple 2',
     'title': 'Apple 3',
     'title': 'Apple 4' 
  ];  

  $scope.applesout = ; 

  $scope.orangesin = [ 
     'title': 'Orange 1',
     'title': 'Orange 2',
     'title': 'Orange 3',
     'title': 'Orange 4' 
  ];  

  $scope.orangesout = ; 

  $scope.appleOnDrop = function(e, obj) 
console.log("on drop apple "); 
console.log("$(e.target).scope(): "); 
console.log($(e.target).scope());
    var dest = $(e.target).scope().this;
console.log("$(obj.draggable).scope(): "); 
console.log($(obj.draggable).scope());
    var src = $(obj.draggable).scope().x;
  ;  

  // Limit apples to apples, oranges to oranges
  $scope.appleOptions =  
    accept: function(dragEl) 
console.log("validate apple");
      if (dragEl[0].innerHTML.indexOf("Apple") > -1) 
        return true;
       else 
        return false;
         
       
  ;  

  $scope.validateDropOranges =  
    accept: function(dragEl) 
console.log("validate orange");
      if (dragEl[0].innerHTML.indexOf("Orange") > -1) 
        return true;
       else 
        return false;
         
       
  ;  
);

【问题讨论】:

【参考方案1】:

是的,您可以使用 React DnD (https://github.com/react-dnd/react-dnd) 来实现实际的拖放功能,并使用 React Flip Move (https://github.com/joshwcomeau/react-flip-move) 或 React Motion (https://github.com/chenglou/react-motion) 来制作 DOM 更改的动画。

他们都有足够的简单示例/教程来帮助您学习..

【讨论】:

感谢您对 SO 的第一个回答!但是,您可以在这里添加更多内容来说明吗?也许粘贴一些代码示例。见***.com/help/how-to-answer

以上是关于react-dnd 中的动画的主要内容,如果未能解决你的问题,请参考以下文章

使用 ReactJs 和 react-dnd 拖放可排序列表的问题

拖动移动时不更新 React-dnd 元素样式

react-dnd 简单的可排序示例 ES6 而不是 ES7

使用 react-dnd 和 useDrag 和 useDrop 进行测试

如何使用 react-dnd 从材质 UI 中拖放 TableHeaderColumn?

react-dnd 拖拽 九宫格