gpt4 book ai didi

javascript - React-ClickDrag 子组件回调

转载 作者:行者123 更新时间:2023-12-03 06:56:48 25 4
gpt4 key购买 nike

我有一个 React svg 组件,它有 2 个子组件使用 react-clickdrag

我正在尝试将回调函数从父组件传递给子组件,以便在拖动时调用。回调函数在拖动时按预期调用,但 this 变量在回调函数中返回子组件而不是父组件。

我的结构是否不正确?或者react-clickdrag是否以某种方式修改了this变量?

<小时/>

父组件:

import React from 'react';
import Bar from './Bar.jsx';
import Node from './Node.jsx';

class TimeSpan extends React.Component {

constructor(props) {
super(props);
this.state = {
xPos: this.props.xPos,
yPos: this.props.yPos,
length: this.props.length
};
}

changeStartPos(diffPos) {
console.log(this); //returns child component
this.setState({xPos: this.state.xPos + diffPos, length: this.state.length + diffPos});
}

changeEndPos(diffPos) {
console.log(this); //returns child component
this.setState({length: this.state.length + diffPos});
}

render() {
return (
<g>
<Node changePos={this.changeStartPos} xPos={this.state.xPos} yPos={this.state.yPos} radius={10} />
<Node changePos={this.changeEndPos} xPos={this.state.xPos + this.state.length} yPos={this.state.yPos} radius={10} />
</g>
);
}

}

export default TimeSpan;
<小时/>

子组件:

import React from 'react';
import clickDrag from 'react-clickdrag';

class NodeComponent extends React.Component {

constructor(props) {
super(props);
this.state = {
lastPositionX: 0,
lastPositionY: 0,
currentX: this.props.xPos,
currentY: this.props.yPos
};
}

componentWillReceiveProps(nextProps) {
if(nextProps.dataDrag.isMoving) {
this.props.changePos(nextProps.dataDrag.moveDeltaX);
}
}

render() {
return (
<circle cx={this.props.xPos} cy={this.props.yPos} r={this.props.radius} fill="black" />
);
}

}

var Node = clickDrag(NodeComponent, {touch: true});

export default Node;
<小时/>

索引:

import React from 'react';
import {render} from 'react-dom';
import TimeSpan from './TimeSpan.jsx';

class App extends React.Component {
render () {
return (
<svg style={{postion:'fixed', top: 0, left: 0, width: '100%', height: '100%'}}>
<TimeSpan xPos={300} yPos={300} length={300} />
</svg>
);
}
}

render(<App/>, $('#app')[0]);
<小时/>
<html>
<head>
<meta charset="utf-8">
<title>React.js using NPM, Babel6 and Webpack</title>
<script src="https://code.jquery.com/jquery-2.2.0.min.js"></script>
<style>
html, body { margin:0; padding:0; overflow:hidden }
</style>
</head>
<body>
<div id="app" />
<script src="public/bundle.js" type="text/javascript"></script>
</body>
</html>

最佳答案

使用 ES6 语法,您的函数不会像使用 React.createClass 时那样自动绑定(bind),因此您必须显式绑定(bind)它们。

执行此操作的最佳位置是在构造函数中,因此它只发生一次。

constructor(props) {
super(props);
this.changeStartPos = this.changeStartPos.bind(this);
...
}

关于javascript - React-ClickDrag 子组件回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37237122/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com