【问题标题】:Passing data from one component to another in react在反应中将数据从一个组件传递到另一个组件
【发布时间】:2015-09-28 15:55:51
【问题描述】:

我有一个组件,我试图在单击它时将数据从前一个组件传递给它。我试过 setState 来改变状态,但没有任何效果。我如何传递数据?数据位于 this.listing 中

这是第一个组件:

const JobOffer = React.createClass({
  mixins: [Navigation],

  getInitialState: function() {
    console.log(this.props.data);
    return {
        listing: this.props.data
    };
  },

  componentDidMount: function() {
    AppStore.addChangeListener(this._onChange);
  },

  componentWillUnmount: function() {
    AppStore.removeChangeListener(this._onChange);
  },

    _onChange : function(){

    },


  handleClick: function () {

    this.transitionTo('/listing/' + this.state.listing.id );

  },


  render: function () {
      var data = this.state.listing;
      var employmentType;
      switch(data.employment_type) {
        case 'F':
            employmentType = 'Full Time';
            break;
        case 'P':
            employmentType = 'Part Time';
            break;
        case 'H':
            employmentType = 'Hourly';
            break;
        default:
            employmentType = 'Unknown';
      }
      return (
        <div>
          <a onClick={this.handleClick.bind(this)}>
              <img style={{width: 50+'px', height: 50+'px'}} src="/images/job1.jpg" alt="" className="img-circle" />
              <div className="title">
                  <h5>{data.job_title}</h5>
                  <p>{data.Business.business_name}</p>
              </div>
              <div className="data">
                  <div ><i>Posted 1 Day Ago</i></div>
                  <div className="city"><i className="fa fa-map-marker"></i>{data.Business.business_city}</div>
                  <div className="type full-time"><i className="fa fa-clock-o"></i>{employmentType}</div>
                  <div className="sallary"><i className="fa fa-dollar"></i>{data.job_compensation}</div>
              </div>
          </a>
        </div>
      );
    },

});


module.exports = JobOffer;

您可以看到上面的组件 transitionTo 是我想要的路线,但是当调用 handleClick 时如何传递 this.listings 数据?

这是我试图将其传递给的组件:

var React = require('react');
var ReactBootstrap = require('react-bootstrap');
var Button = ReactBootstrap.Button;
var Modal = ReactBootstrap.Modal;
var AppActions = require('../actions/app-actions');
var AppStore = require('../stores/app-store');
var Navigation = require('react-router').Navigation;
var _ = require('lodash');


// Our custom component is managing whether the Modal is visible
const ListingDetail = React.createClass({
  mixins: [Navigation],

  getInitialState: function() {
    console.log(this.props.data);
    return {
        listing: this.props.data
    };
  },

  componentDidMount: function() {
    AppStore.addChangeListener(this._onChange.bind(this));
  },


  _onChange : function(){

  },


  handleClick: function () {
    this.transitionTo('/listing/apply/' + this.state.listing.id );
  },


  render: function () {
        var data = this.state.listing;
        var employmentType = 'test';
        return (
                <div>
                    <img style={{width: 200+'px', height: 200+'px'}} src="/images/job1.jpg" alt="" className="img-circle" />
                    <div className="title">
                        <h5>{data.job_title}</h5>
                        <p>{data.Business.business_name}</p>
                    </div>
                </div>
         );
      },

});


module.exports = ListingDetail;

【问题讨论】:

标签: javascript reactjs reactjs-flux react-router


【解决方案1】:

React per se 不提供在组件之间共享数据的方法,除非它们位于相同的组件层次结构中。 React 直接提供了祖先到后代的传递,通过“props”将数据从父组件传递到子组件。您还可以通过将回调(在父级中定义的方法)作为道具传递给子级,然后让子组件在发生更改并将数据作为参数传递时调用该回调,从而间接地将数据从子级共享到父级。阅读更多关于渲染多个组件和数据共享的信息here

如果您的组件以完全独立的路线呈现,就像您尝试做的那样,那么您将不得不以其他方式提供数据流。 React 本身并没有提供这一点,但Flux 是 Facebook 开发人员支持的一种方法,它明确地处理数据流,并且非常适合 React。

【讨论】:

    【解决方案2】:

    这类问题正是设计 Flux 的原因。与其尝试将数据直接从一个组件传递到另一个组件,不如让存储来保存该数据。然后,当您转换到另一个组件时,该组件可以从存储中读取数据。

    【讨论】:

      猜你喜欢
      • 2019-07-05
      • 1970-01-01
      • 1970-01-01
      • 2018-05-02
      • 2017-07-12
      • 1970-01-01
      • 1970-01-01
      • 2018-05-04
      相关资源
      最近更新 更多