反应-按钮按下,继续调用函数
React - Button Pressed, keep calling function
我正在尝试实现缩放功能。onClick工作得很好,但我想让它当我按住缩放按钮,它不断缩放。我怎么用ReactJS实现这个?
Jquery: mousedown效果(左键按住时)我使用这个作为模板,但onMousedown不注册根据console.log
<div className="zoomControl" >
<button className="zoomIn" onMouseDown={this.zoomIn}>+</button>
<button className="zoomOut" onClick={this.zoomOut}>-</button>
</div>
zoomIn = () => {
console.log('test');
var self = this;
this.timeout = setInterval(function(){
// Do something continuously
this.renderer.zoomIn();
}, 100);
return false;
};
zoomMouseUp = () => {
clearInterval(this.timeout);
return false;
};
需要同时使用mouseUp
和mouseDown
。
mouseDown
上启动时间,在zoom
上反复调用超时函数,在mouseUp
上清除时间。
这里有一个zoomIn和zoomOut的演示,以比较和更好地理解算法。
希望这有帮助!!
class Zoom extends React.Component {
constructor(props) {
super(props)
this.state = {
zoom: 1,
}
this.t = undefined
this.start = 100
this.repeat = this.repeat.bind(this)
this.onMouseDown = this.onMouseDown.bind(this)
this.onMouseUp = this.onMouseUp.bind(this)
this.zoom = this.zoom.bind(this)
this.zoomOut = this.zoomOut.bind(this)
}
zoom(){
this.setState({zoom: this.state.zoom + 0.1})
}
repeat() {
this.zoom()
this.t = setTimeout(this.repeat, this.start)
this.start = this.start / 2
}
onMouseDown() {
this.repeat()
}
onMouseUp() {
clearTimeout(this.t)
this.start = 100
}
zoomOut(){
this.setState({
zoom: 1
})
}
render() {
return <div className="zoomControl" >
<div className="zoom" style={{transform: 'scale('+ this.state.zoom +')'}}></div>
<button className="zoomIn" onMouseUp={this.onMouseUp} onMouseDown={this.onMouseDown}>+</button>
<button className="zoomOut" onClick={this.zoomOut}>-</button>
</div>
}
}
ReactDOM.render(<Zoom/>, document.getElementById('app'))
body {
overflow: hidden
}
.zoom {
width: 20px;
height: 20px;
margin: 0 auto;
background: red;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<div id="app"></div>
如果你必须在这里做一些动画,你最好使用requestAnimationFrame
而不是设置间隔。我会这样做。
class App extends React.Component {
state = {
value: 0,
mousedown: false
}
zoom = () => {
if (this.state.mousedown) {
this.setState({ value: this.state.value + 1},
() => { window.requestAnimationFrame(this.zoom) }
)
}
}
zoomIn = () => {
window.requestAnimationFrame(this.zoom);
}
toggleMouseDown = () => {
this.setState({
mousedown: !this.state.mousedown
});
this.zoomIn()
}
render() {
return(
<div>
<button
onMouseUp={this.toggleMouseDown}
onMouseDown={this.toggleMouseDown}>
Click me
</button>
{/* The rest of your component goes here */}
</div>
);
}
}
很难得到所有的上下文,但我会尽量给出一个相关的答案:
你没有设置任何属性来在释放按钮时调用zoomMouseUp。我从
开始<button className="zoomIn" onMouseDown={this.zoomIn} onMouseUp={this.zoomMouseUp} onMouseOut={this.zoomMouseUp}>+</button>
你说它开始缩放,但没有停止。这让我觉得它起作用了,所以这应该能解决问题。我添加了onMouseOut因为如果他们按下按钮并移动鼠标而不释放它,它会继续。
有很多方法可以做到这一点,但这可能是您现有的最简单的方法。
我的问题是由于右键是主要的点击或一些东西沿着线。
相关文章:
- Javascript渲染.如何编写Javascript;t在函数调用结束之前继续执行代码
- 如何从按钮后面的代码中调用javascript函数,点击并存储其输出,然后继续操作
- AJAX调用不起作用,因为它继续转到链接
- jQuery验证,在继续之前等待服务调用响应
- 事件侦听器调用函数后,代码的执行在哪里继续
- 等待多个 ipc 调用完成,然后再继续电子/冗余
- 有没有办法在浏览器中停止HTTP AJAX调用,以便另一个调用可以继续
- 等待 API 调用在 Javascript 中完成,然后再继续
- Angular2 可观察 - 等待多个函数调用,然后再继续
- 在继续Javascript之前,如何等待多个facebook图形api调用
- Web SQL 数据库 - 执行 asyc 调用并继续
- 在什么情况下浏览器拒绝继续调用 setInterval 回调
- 进行 ajax 调用,如果不是所需的结果,则提取一个值,然后继续重复,直到达到所需的结果
- 即使调用了clearInterval,interval也会继续激发
- 如何在AJAX调用后继续表单提交
- 为什么重置 setInterval 它继续调用多个函数实例而不是一个
- 反应-按钮按下,继续调用函数
- 如何在作用域变量改变时继续调用函数
- reactjs在收到回调后继续调用函数
- 如何继续调用getjson,直到它没有空响应