我想制作一个可拖动(即可以通过鼠标重定位)的React组件,该组件似乎必然涉及全局状态和分散的事件处理程序。我可以在JS文件中使用一个全局变量来以肮脏的方式进行操作,甚至可以将其包装在一个不错的闭包接口中,但是我想知道是否有一种方法可以更好地与React结合。
另外,由于我以前从未在原始JavaScript中做到过这一点,所以我想看看专家是如何做到的,以确保我处理了所有极端情况,尤其是与React相关的情况。
谢谢。
我可能应该把它变成一篇博客文章,但这是一个很可靠的例子。
这些评论应该可以很好地说明问题,但是如果您有任何疑问,请告诉我。
这是玩的小提琴:http :
//jsfiddle.net/Af9Jt/2/
var Draggable = React.createClass({
getDefaultProps: function () {
return {
// allow the initial position to be passed in as a prop
initialPos: {x: 0, y: 0}
}
},
getInitialState: function () {
return {
pos: this.props.initialPos,
dragging: false,
rel: null // position relative to the cursor
}
},
// we could get away with not having this (and just having the listeners on
// our div), but then the experience would be possibly be janky. If there's
// anything w/ a higher z-index that gets in the way, then you're toast,
// etc.
componentDidUpdate: function (props, state) {
if (this.state.dragging && !state.dragging) {
document.addEventListener('mousemove', this.onMouseMove)
document.addEventListener('mouseup', this.onMouseUp)
} else if (!this.state.dragging && state.dragging) {
document.removeEventListener('mousemove', this.onMouseMove)
document.removeEventListener('mouseup', this.onMouseUp)
}
},
// calculate relative position to the mouse and set dragging=true
onMouseDown: function (e) {
// only left mouse button
if (e.button !== 0) return
var pos = $(this.getDOMNode()).offset()
this.setState({
dragging: true,
rel: {
x: e.pageX - pos.left,
y: e.pageY - pos.top
}
})
e.stopPropagation()
e.preventDefault()
},
onMouseUp: function (e) {
this.setState({dragging: false})
e.stopPropagation()
e.preventDefault()
},
onMouseMove: function (e) {
if (!this.state.dragging) return
this.setState({
pos: {
x: e.pageX - this.state.rel.x,
y: e.pageY - this.state.rel.y
}
})
e.stopPropagation()
e.preventDefault()
},
render: function () {
// transferPropsTo will merge style & other props passed into our
// component to also be on the child DIV.
return this.transferPropsTo(React.DOM.div({
onMouseDown: this.onMouseDown,
style: {
left: this.state.pos.x + 'px',
top: this.state.pos.y + 'px'
}
}, this.props.children))
}
})
从一开始,“谁应该拥有什么状态”是一个重要的问题。在“可拖动”组件的情况下,我可以看到几种不同的情况。
父级应拥有可拖动对象的当前位置。在这种情况下,可拖动对象仍将拥有“我正在拖动”状态,但是this.props.onChange(x, y)
每当发生mousemove事件时都会调用它。
父级只需要拥有“固定位置”,因此可拖动对象将拥有其“拖动位置”,但是在onmouseup上它将调用this.props.onChange(x, y)
并将最终决定推迟到父级。如果父级不喜欢可拖动对象的最终位置,它将不会更新其状态,并且可拖动对象会“快照”回到其初始位置,然后再进行拖动。
@ssorallen指出,因为“可拖动”与其说是事物本身,不如说是一个属性,它可能更好地用作混合。我对mixins的经验有限,所以我还没有看到它们在复杂情况下如何提供帮助或妨碍。这可能是最好的选择。
本文向大家介绍React组件命名推荐的方式是哪个?为什么不推荐使用displayName?相关面试题,主要包含被问及React组件命名推荐的方式是哪个?为什么不推荐使用displayName?时的应答技巧和注意事项,需要的朋友参考一下 [react] React组件命名推荐的方式是哪个?为什么不推荐使用displayName?
问题内容: 我在网上搜索了可拖动的Swing组件的示例,但发现示例不完整或不起作用。 我需要的是一个 Swing组件 ,可以用鼠标将其 拖动 到另一个组件中。在拖动时,它应该 已经改变 了位置,而不仅仅是“跳转”到目的地。 我将感谢没有非标准API的示例。 谢谢。 问题答案: 我提出了一个简单但可行的解决方案,我自己找到了;) 我该怎么办? 当按下鼠标时,我 在屏幕上* 记录了 光标的 位置以及
问题内容: 我目前正在以以下方式继承ES6 React基本组件: model.js(基本组件): 然后,我有两个扩展组件,它们基本上都看起来像这样: (完整的源代码在这里) 这似乎工作正常。两种模型都可以正常显示并正常工作。 但是,我在多个地方都知道继承不是React的正确方法-相反,我应该使用组合。但是话又说回来,React v0.13不支持Mixins吗? 那么,我采用的方法还可以吗?如果不是
本文向大家介绍springboot快速整合Mybatis组件的方法(推荐),包括了springboot快速整合Mybatis组件的方法(推荐)的使用技巧和注意事项,需要的朋友参考一下 Spring Boot简介 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化
本文向大家介绍jquery实现仿JqueryUi可拖动的DIV实例,包括了jquery实现仿JqueryUi可拖动的DIV实例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了jquery实现仿JqueryUi可拖动的DIV。分享给大家供大家参考。具体如下: 这是用Jquery写的代码,仿JQUERYUI的Draggable或者是Dialog,希望大家喜欢,写的一个小东西。参考了下网上的其他
本文向大家介绍java中数组的定义及使用方法(推荐),包括了java中数组的定义及使用方法(推荐)的使用技巧和注意事项,需要的朋友参考一下 数组:是一组相关变量的集合 数组是一组相关数据的集合,一个数组实际上就是一连串的变量,数组按照使用可以分为一维数组、二维数组、多维数组 数据的有点 不使用数组定义100个整形变量:int i1;int i2;int i3 使用数组定义 int i[100];