ReactJS 如何在页面之间传递数据?

10

我还对React比较陌生。

我想知道,我该如何将数据从“主页面”传递到另一页以显示结果?

我认为这与props有关?但我不是很确定。

我的MainPage有输入/选择标签,可以接受用户的名称、值、选择和日期。

我想能够获取所有这些信息并在另一个名为“DisplayResults”的页面中输出它,并可能使用该数据进行其他操作,例如创建带有信息的表格。

非常感谢您的帮助!

这是我的app.jsx

var React = require('react');
var ReactDOM = require('react-dom');
var {Route, Router, IndexRoute, hashHistory} = require('react-router');
var Main = require('Main');
var MainPage = require('MainPage');
var About = require('About');
// Load foundation
require('style!css!foundation-sites/dist/foundation.min.css')
$(document).foundation();
ReactDOM.render(
  <Router history={hashHistory}>
    <Route path="/" component={Main}>
      <Route path="about" component={About}/>
      <IndexRoute component={MainPage}/>
    </Route>
  </Router>,
  document.getElementById('app')
);

你有参考过React的教程吗?回答可能会有点复杂...但基本上你需要创建拥有自己路由的组件,并通过props或者作为全局状态树的一部分将数据传递给它们(例如,如果你正在使用redux)... - user
你可以将属性传递给子组件,正如@user1370384所提到的,你需要使用flux、redux、mobx等技术来正确地做到这一点。 - Hosar
2个回答

10

有几种不同的方法...一个好的选择是使用一些状态管理层,比如Redux或MobX。

其中一种简单的方法是让你的Main组件将这些数据保存在其状态中,并将其作为道具传递给其他页面。由于您正在使用react-router,因此需要在Main组件中克隆this.props.children以添加其他道具,例如数据和设置数据的函数。

您的Main组件可能看起来像:

class Main extends Component {
   constructor(props) {
      this.state = {
         data: 'some default data',
      }
   }

   updateData(data) {
      this.setState({ data });
   }

   render() {
     return <div>
        <Header />
        {React.cloneElement(this.props.children, { data: this.state.data, setData: this.updateData })}
     </div>
   }
}

class MainPage extends Component {

   render() {
      return <div>
         <input type="text" onChange={e => this.props.setData({ field: e.target.value })} />
         <Link to="/DisplayResults">Go to Results</Link>
      </div>
   }
}

class DisplayResults extends Component {
   render() {
       return <div>
         {this.props.data.field}
       </div>
   }
}

嗨 @jpdelatorre,如何使用函数式组件执行相同的操作? - Lee

7
技术上,React创建一个单页应用程序,因此没有其他页面可以传递数据。
然而,我相信你可能正在谈论将数据传递到组件中。我总是将我的React应用程序结构化为容器和组件文件夹。容器文件夹是所有逻辑组件所在的位置,而组件文件夹是所有UI组件所在的位置。
让React如此直观的一件事情是,您可以通过props轻松地从父组件传递数据给子组件。换句话说,我的逻辑组件通过props将数据传递给UI组件。
例如,假设我想让我的逻辑组件Dashboard向我的UI组件MyChildComponent传递组织数据,我会像这样做:
containers/DashBoard/index.js
export class DashBoard extends React.Component { // eslint-disable-line react/prefer-stateless-function

  constructor(props) {
    super(props);
    this.state = {
      organizations: null,
    };
    this.rowCallback = this.rowCallback.bind(this);
  }

  render() {
    <MyChildComponent orgs={this.state.organizations} />
  }
}

components/MyChildComponent/index.js

export class MyChildComponent extends React.Component {
  constructor(props) {
    super(props);
  }
  render(){
    <div>
      {this.props.orgs}
    </div>
  }
}

这只是处理数据传递的一种方式。您还可以在逻辑组件之间进行路由时传递值,或使用诸如redux等流程库创建状态变量等。请注意,我的代码摘录使用了es6,并需要babel编译器。我也喜欢尽可能使用UI组件功能,因为我相信这是React的方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接