- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我读到一些用户提到他们正在使用这个支持 Typescript 的库,但我在任何地方都找不到任何文档,我似乎也无法让它自己工作。
我正在使用 typescript 2,但我无法创建一个非常简单的工作示例,它只允许我拖动现有组件。我尝试了几种可能性,但在调用 DragSource(作为装饰器或函数)或渲染生成的组件时,我总是遇到一些类型问题。
简而言之,我想要一个示例来展示 react-dnd 在 typescript 中的用法,它允许我如何使现有组件可拖动,可能无需修改组件本身(它不应该知道它是可拖动的)
感谢您的帮助!
最佳答案
我已经在 2.1 上使用 DT 类型包。它不使用 strictNullChecks 编译,我一直无法找到原因。 (当你用@DragSource 和@DropTarget 装饰你的组件时,你以某种方式将渲染函数的返回类型从 Element 更改为 Element | null,但我看不出如何。)
另一个小问题是,当您第一次在渲染方法中实例化组件时,收集函数插入的所有 Prop 都是未定义的,因此您的选择是传递一堆 {undefined as any}
或者将你的收集器注入(inject)的 Prop 声明为可选项,并在你看到它们的每个地方都对它们进行类型保护。总体而言,类型声明文件还不错,我发现在了解该库时,输入的帮助大于危害。
import {
ConnectDragSource,
DragDropContext,
DragSource,
DragSourceSpec,
DragSourceCollector,
DragSourceConnector,
DragSourceMonitor,
DragElementWrapper,
ConnectDropTarget,
DropTarget,
DropTargetConnector,
DropTargetMonitor,
ClientOffset,
DropTargetSpec } from 'react-dnd';
let HTML5Backend = require('react-dnd-html5-backend');
import { AdjacencyMatrixGraph } from "Geometry/Graph";
import * as React from "react";
import * as Sauce from "Sauce";
import * as ReactDOM from "react-dom";
import * as $ from "jquery";
import { Position2 } from "Geometry";
import * as Rx from "rxjs";
import * as Util from "Util";
require("./GraphBuilder.scss");
interface NodeProps {
label?: string;
position: ClientOffset;
}
/* New node from the node well */
export interface NodeSourceProps {
isDragging : boolean;
connectDragSource: ConnectDragSource;
}
export interface NodeSourceState {
}
// Spec: drag events to handle.
let nodeSourceSpec: DragSourceSpec<NodeSourceProps> = {
beginDrag: (props: NodeSourceProps) => ({}),
};
// Collect: Put drag state into props
let nodeSourceCollector = (connect: DragSourceConnector, monitor: DragSourceMonitor) => {
return {
connectDragSource: connect.dragSource(),
isDragging: monitor.isDragging()
}
};
@DragSource("new-node", nodeSourceSpec, nodeSourceCollector)
export class NodeSource extends React.Component<NodeSourceProps, NodeSourceState> {
constructor(props: NodeSourceProps) {
super(props);
}
render() {
const { connectDragSource, isDragging } = this.props;
return connectDragSource(<span className="node-source">{'\u2683'}</span>);
}
}
/* main graph area */
interface GraphCanvasProps {
connectDropTarget: ConnectDropTarget,
isOver: boolean,
graph: AdjacencyMatrixGraph<NodeProps>;
}
interface GraphCanvasState {}
const canvasDropTargetSpecification: DropTargetSpec<GraphCanvasProps> = {
drop(props: GraphCanvasProps, monitor: DropTargetMonitor, component: React.Component<GraphCanvasProps, any>) {
// console.log("Handling drop", print_monitor(monitor));
let pos = monitor.getSourceClientOffset();
if (monitor.getItemType() === "main-node-move") {
let node = (monitor.getItem() as any);
graph.setData(node.id, { position: pos });
}
else if (monitor.getItemType() === "new-node") {
graph.addNode("node-" + graph.order(), { position: pos });
}
},
};
function canvasDropTargetCollectingFunction(connect: DropTargetConnector, monitor: DropTargetMonitor) {
let rv = {
connectDropTarget: connect.dropTarget(),
isOver: monitor.isOver(),
};
return rv;
}
/* ... here's a DropTarget ... */
@DropTarget(["main-node-move", "new-node"], canvasDropTargetSpecification, canvasDropTargetCollectingFunction)
export class GraphCanvas extends React.Component<GraphCanvasProps, GraphCanvasState> {
constructor(props: GraphCanvasProps) {
super(props);
}
render(): JSX.Element | null {
const { connectDropTarget, graph } = this.props;
let nodes = graph.nodes();
let nodeEls = Object.keys(nodes).map(k => {
let node = nodes[k];
return <CanvasNode
key={k}
id={k}
node={node}
graph={graph}
connectNodeDrop={null as any}
connectMoveNodeDragger={(null)}/>
});
return connectDropTarget(<div className="graph-canvas">
{nodeEls}
</div>);
}
}
/* ... Here's a the DragContext decorator ... */
@DragDropContext(HTML5Backend)
class Markov extends React.Component<MarkovProps, MarkovState> {
关于reactjs - React DND typescript 支持,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40111314/
我正在使用 从网格拖动到树 并使用 gridviewdragdrop 和 treeviewdragdrop 插件来处理页面。 一切正常,但我真的不需要拖动节点,只需要获取 dragdata 和 dro
我有一个 Jest 测试文件,其中包含许多测试。 import React from 'react'; import configureStore from 'redux-mock-store'; i
我有这些简单的表格: 1. USER_DND ╔════════╦══════╗ ║ UserID ║ DnD ║ ╠════════╬══════╣ ╚════════╩══════╝ 2. US
如何在 Android 中以编程方式打开/关闭“请勿打扰”(dnd)?是希望这会给我一些东西,但它没有: Settings.System.putInt(getContentResolver(), Se
我有 37 种不同的节点类型。 我正在尝试实现拖放。 这可行,但我需要准确限制可以拖动哪些类型以及可以删除它们的位置。 不幸的是,我在文档中找不到任何有用的信息(http://www.jstree.c
所以我正在尝试编写一个 D&D 骰子滚轮,它会拉起一个有 5 个按钮的 GUI,当按下时,会随着骰子的滚动拉出一条消息。当我单击 D4 按钮时,它会拉出消息,并且每次单击它时只会滚动 1,依此类推,其
我正在开发一个 React dnd 项目,我遵循 react-dnd documentation 。一切正常,但我无法在拖动时滚动。 当我拖动一个项目并到达最后一个可放置源时,我需要一个滚动条,然后它
有一个项目列表/表格(我相信现在没关系)。它们通过使用 jQuery 变得可拖动。我需要设置一些与被拖动的项目元素关联的数据,并能够从可放置元素的“放置”处理程序中的事件中提取它。 我尝试将 data
我编写了一个基本的 DnD 程序,其中有四个连续的 JLabel。我发觉到当我向左拖动一个标签时,它会显示在下一个标签的下方。然而,当我向右拖动标签时,它显示在下一个标签上方。标签按从左到右的顺序添加
我有一个组件当前使用 useDrag Hook 连接到 react-dnd。它运作良好,除了预览。我想实现 useDragLayer,看看它是否有助于解决我的预览问题,正如许多在线线程所建议的那样。
您好,我需要一个 DnD 解决方案来将 Outlook 邮件附件拖到 Stackpane。 JavaFX/展望 2010 stackpaneDragAndDropZone.setOnDragO
我如何在我的文件中控制台登录我有放置区域,我正在移动的节点的 ID(可拖动项目)。我相信我应该使用 monitor.getItem(),如 documentation 中指定的那样,但我不明白, 我的
看起来 React DnD 期望可拖放的项目是兄弟项目,以便正常工作。如果其中一件元素属于另一位 parent ,我会收到“预期找到有效目标”。一旦拖动事件触发(当交换应该触发时)。 我从他们的文档中
所以我为龙与地下城创建了一个基本的掷骰子 dicord 机器人。 我到目前为止的代码可以掷任何类型的骰子,(例如“roll xdy”“roll 1d20”,“roll 100d100”) 当有人发送匹
在 this Angular example ,如果将一个苹果拖到橙色部分并将其放在那里,则会出现一个动画,慢慢地将苹果返回到它原来的位置。这在视觉上传达了将苹果拖到橙色部分是无效的。使用的Angul
我正在尝试集成React DnD使用 Material UI 的 List 和 ListItem并且,拖动时,整个列表显示为拖动的元素。我已尽我所能理解这些示例,这就是我所拥有的 import Rea
我正在使用 react-beautiful-dnd 使表格行可拖动。 如果我从上到下拖动,则拖动工作正常,并且当我向上滚动页面时,它会脱离位置。 我不知道为什么。 另外,我没有发现 css 有什么奇怪
我在将组件放入应用程序的下一个列表区域时遇到困难。我可以在父列中完美地拖放和排序,但无法将组件放在其他地方。这是我的 onDragEnd 函数中的代码: onDragEnd = result =>
我目前正在尝试使用名为 dnd-kit 的拖放库 及其名为 useSortable 的钩子(Hook)。 到目前为止,我确实做到了让一切都可以按照我喜欢的方式拖动,不幸的是,不知何故我无法根据拖动更新
是否可以使用dojo工具包的dnd api更改头像的位置?此时,拖动时,被拖动项目的头像出现在鼠标光标的右侧和下方。我希望它与鼠标光标位于同一位置。我对我的应用程序进行了一些可用性测试,大多数人似乎尝
我是一名优秀的程序员,十分优秀!