如何将 React 中的状态从一个类传递到另一个类?

Posted

技术标签:

【中文标题】如何将 React 中的状态从一个类传递到另一个类?【英文标题】:How to pass state in React from one class to another? 【发布时间】:2016-11-30 19:01:06 【问题描述】:

我正在使用 ES6 类构建一个带有 React 的 Web 应用程序。我有一个 IndexPage.js 文件,它将数据添加到数据库和 AdminLandingPage.js 文件,它在它的 componentDidMount() 函数中读回数据库中当前的所有数据。

现在基本上两者都是分开工作的。我希望能够将数据保存在 IndexPage 中的状态(数组)中,然后将该状态传递给另一个文件,在那里我可以检查数组中是否有数据并设置表的状态(从而允许我不必刷新页面)。

IndexPage 在它的构造函数中有这个:

constructor(props) 
    super(props);

    this.state = newbugs: [];

这里我将数据添加到数据库并设置 newbugs 数组的状态:

addBug = (newBug) => 
  BugsApi.addBugData(newBug, data => 
    this.setState(newbugs: data)
  )

在我的 AdminLandingPage 构造函数中,我有:

constructor(props) 
    super(props);

    this.state = bugs: [];

和 componentDidMount() 函数,我正在读取数据库中当前的所有数据:

componentDidMount() 

    BugsApi.getBugData(data => 
      this.setState(bugs: data)
    )

^ 这是我想从我的 IndexPage 中传入 newbugs 状态数组的地方,检查其中是否有数据,然后更新此类中的 bugs 状态数组。

如果我能更清楚地回答我的问题,请告诉我。我现在已经被困了几个小时了。谢谢!

【问题讨论】:

你应该阅读文档,这就像反应 101 的东西在这里我只是用谷歌搜索了你的确切问题并得到了这个:facebook.github.io/react/tips/… 您对 DB 的读写操作是分开的。首先,您在 indexPage 中添加到 DB,然后在 AdminPage 中从 DB 中获取。假设您没有数据库,并且您从 API 获得了响应并将响应日期设置为 indexPage 状态变量,现在您必须在 adminPage 中使用 indexPage 状态变量。你将如何实现这一目标?这就是我们陷入的困境 【参考方案1】:

我基本同意 Red Mercury 提供的代码,但在 AdminLandingPage 内部设置状态除外。一旦组件内的 props 可用,您将不需要 AdminLandingPage 组件中的状态,除非您尝试执行未提及的其他操作。

class IndexPage extends React.Component 
  constructor(props) 
    super(props);
    this.state = newbugs: [];
  

  render() 
    return (
      <AdminLandingPage bugs=this.state.newBugs/>
    );
  


const AdminLandingPage = (props) 
  console.log(props.bugs); 
  return (
    ...
  );

【讨论】:

有什么办法可以做到这一点,而无需在 indexpage 中呈现管理页面?我只想传递道具而不是渲染组件。 最好的方法是使用 Redux(学习曲线很大,取决于您对 React 的熟悉程度)。 Redux 是管理 React 应用程序状态的好方法。【参考方案2】:

state 应该在组件之间传递为props。例如:

class IndexPage extends React.Component 
  constructor(props) 
    super(props);
    this.state = newbugs: [];
  

  ...

  render() 
    return (
      <AdminLandingPage bugs=this.state.newBugs/>
    )
  


class AdminLandingPage extends React.Component 

  ...

  componentDidMount() 
    // `newBugs`constant holds the bugs passed down from IndexPage
    const newBugs = this.props.bugs;
    BugsApi.getBugData(data => 
      this.setState(bugs: data)
    )
  

  ...

这里IndexPagestate.newBugs 传递给它的子组件AdminIndexPage 作为bugs 属性

【讨论】:

在这个例子中,你正在传递状态。我基本同意你的说法,但第一句话具有误导性。 “状态应该在组件之间作为道具传递”会更清楚 唯一的问题是我不想在索引页面中呈现管理页面。如果我将 &lt;AdminLandingPage bugs=this.state.newBugs/&gt; 放在你拥有它的地方,它会在其中呈现整个组件。 那么听起来像redux这样的数据管理库可以帮助你。在 redux 中,整个应用程序基本上都有一个 state。我真的推荐 redux 的创建者 Dan Abromov 的 egghead.io/courses/getting-started-with-redux。 但是如何将多个状态传递给另一个类?

以上是关于如何将 React 中的状态从一个类传递到另一个类?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 React Native 中将矢量从类组件传递到另一个组件?

React 无法使用 Link 将数据从一个类组件传递到另一个类组件

React/Redux:如何将此状态从一个组件传递到另一个文件?

如何使用从 React 中的子组件获取的数据更新父组件中的状态

在 React 中将状态数据从一个组件传递到另一个组件

如何将数据从一个实体传递到另一个实体类?