如何将状态从子组件提升到父组件

时间:2019-11-06 11:50:53

标签: php reactjs laravel

我有一个父类组件(Dashboard.jsx), 在此组件中,我将其称为子组件(AddExpense.jsx)。

<ListGroup.Item>
  <Link to="/expenses/add-expense">Add expense</Link>
</ListGroup.Item>

  ...
  ...

<Card.Header id="content-header">Content</Card.Header>
<Card.Body>
  <Switch>
    <Route path="/expenses/add-expense" component={AddExpense} />
  </Switch>
</Card.Body>

我想从ExpenseController(laravel)获取AddExpense的标题,当我单击“ / expenses / add-expense”链接时,“内容”(仪表板中的标题)更改为来自Expense控制器的标题。

2 个答案:

答案 0 :(得分:2)

“数据减少,操作增加”。

您应该将回调传递给AddExpense组件道具。

<AddExpense onUpdateHeader={
  (newHeader) => {
    this.setState({contentHeader: newHeader});
  }
}>

在AddExpense中,您需要在提及的点击后使用适当的参数(无论您想发送给父组件的什么)来调用该回调。

<Link href="/expenses/add-expense" 
  onClick={ () => { 
      this.props.onUpdateHeader(headerToSendUp);
    } 
  }
>Link text...</Link>

答案 1 :(得分:0)

@sEver提供了最简单的解决方案来实现您所描述的内容。如果您想创建一个稍微参与一些的网站(或者如果您想确保多个组件都具有最新信息,而不必在React中上下钻取信息),则可能需要研究一下较旧的Flux库或较新的Redux库。我只用过Flux,所以我只讲Flux的工作原理。

您的组件外部存在“商店”。这些存储区包含状态,通常使用ID号跟踪状态是有意义的。例如,如果您要存储对象

{name: 'foo', text:'bar',value:'baz'}

您将其存储在商店中的ID号下。

state = {'1' : {name: 'foo', text:'bar',value:'baz',id:'1'}}

为了保持流程的清洁,您可以拥有任意数量的商店,但是商店必须将其数据发送到同一组件,然后组件将这些数据作为道具通过子组件传递。

如果您需要修改一个组件中的数据,然后将其发送到并行组件或多个级别的组件,则此功能特别有用。这不是唯一的解决方案,如果您仅尝试将信息发送到单个级别,则回调函数可能是最好的解决方案。