2016-05-15 75 views
0

我有反應,有2個孩子使用react-clickdrag陣營-ClickDrag輔元件回調

我試圖從父到子組件傳遞一個回調函數上的阻力被稱爲SVG組件。回調函數按預期在拖動時調用,但變量this返回子組件,而不是回調函數中的父組件。

我的結構是否有錯誤?或者是以某種方式修改this變量的react-clickdrag?


父組件:

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> 

回答

1

隨着ES6語法在功能將不綁定自動像他們當您使用React.createClass所以你必須明確地將它們綁定。

最好的做法是在constructor,所以它只發生一次。

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