2016-05-15 2 views
0

меня реагируют компонент, SVG имеет 2-х детей, которые используют react-clickdragReact-ClickDrag дочерних компонентов Callbacks

Я пытаюсь передать функцию обратного вызова от родителя к ребенку компонентов будет называться на сопротивление. Функция обратного вызова вызывается как ожидалось при перетаскивании, но переменная this возвращает дочерний компонент, а не родительский компонент в функции обратного вызова.

Я что-то неправильно структурировал? Или как-то реагирует-реагирует на изменение переменной 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> 

ответ

1

С ES6 синтаксис ваши функции не будут связаны автоматически, как они, когда вы используете React.createClass так что вы должны явно связать их.

Лучшее место для этого в constructor, так что это происходит только один раз.

constructor(props) { 
    super(props); 
    this.changeStartPos = this.changeStartPos.bind(this); 
    ... 
} 
Смежные вопросы