Child parent component communication in ReactJS

点点圈 提交于 2019-12-09 11:13:31

问题


I like to send the attribute properties/props/state values from child component to parent component on an event fire onDrag. I could not find proper documentation on this.

Here is my code:

/*** @jsx React.DOM */
var APP=React.createClass({
  getInitialState:function()
  {
     return {url:'http://www.youtube.com/embed/XGSy3_Czz8k'}
  },
  handleDrag:function(vidurl)
  {
    alert(vidurl);    //i need to get child component url here.
  },
  render:function(){
    return  <div>
               <VideoFrame  src={this.state.url} />
               <hr/>
           <videos handle={this.handleDrag(vidurl)} />
        </div>
  }
});

var VideoFrame=React.createClass({
  render:function(){
    return  <div>
          <iframe width="420" height="315"  src={this.props.src}>
          </iframe>     
        </div>
  }
});

var videos=React.createClass({
  getInitialState:function()
  {
    return {vidurl:'http://www.youtube.com/embed/XGSy3_Czz8k'}
  },
  render:function()
  {
    return  <img src="http://upload.wikimedia.org/wikipedia/en/a/a6/Size_Small.PNG" onDrag={this.props.handle.bind(this.state.vidurl)}></img> //trying to send state value from here
  }
});

React.renderComponent(<APP />, document.body);      

I hope my code is clear.


回答1:


In App component this line

<videos handle={this.handleDrag(vidurl)} />

is not correct, one should pass the function callback instead of invoke a function.

In VideoForm this line

return  <img src="http://upload.wikimedia.org/wikipedia/en/a/a6/Size_Small.PNG" onDrag={this.props.handle.bind(this.state.vidurl)}></img> //trying to send state value from here

is not correct, this.props.handle is the parent callback, one should just just call this.props.handle(this.state.videoUrl)

Correct Implementation:

var APP = React.createClass({
  getInitialState:function() {
   return {url:'http://www.youtube.com/embed/XGSy3_Czz8k'}
  },

  // Parent callback, pass this function to the child component
  handleDrag:function(videoUrl) {
    alert(videoUrl);
  },

  render: function() {
    return  (
      <div>
         <Videos handle={this.handleDrag} />
      </div>
    );
})


var Videos = React.createClass({

  getInitialState:function()
  {
    return {vidurl:'http://www.youtube.com/embed/XGSy3_Czz8k'}
  },

  handleChanged: function(event) {
    if(this.props.handle) {
      this.props.handle(this.state.videoUrl);
    }
  },

  render:function()
  {
    return  <img src="http://upload.wikimedia.org/wikipedia/en/a/a6/Size_Small.PNG" onDrag={this.handleChanged}></img> //trying to send state value from here
  }
});



回答2:


The first argument to bind is the object to set as "this" when the bound method is called, the second argument to bind is the first argument passed in.

Make sure to pass functions around too, in the first class you are calling handleDrag then passing the return value into the videos component rather than passing in handleDrag itself.



来源:https://stackoverflow.com/questions/29121945/child-parent-component-communication-in-reactjs

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!