将数据从孩子传递给祖父母

Posted

技术标签:

【中文标题】将数据从孩子传递给祖父母【英文标题】:passing data from child to grandparent 【发布时间】:2018-04-28 16:18:18 【问题描述】:

我是 React 新手,还在学习。 我正在尝试。到目前为止,我找到了父母,但我被困住了。

子组件:

export class Child extends React.Component
  constructor(props) 
    super(props);
    this.state= 
      counterChild: 5
    
  

  render() 
    return(
      <div>
        <span>Child: this.state.counterChild</span><br />
        <button onClick=this.props.data(this.state.counterChild)>Click me</button>
      </div>
    );
  

父组件:

export default class Parent extends React.Component
  constructor(props)
    super(props);
    this.state= 
      counterParent: 0
    
  

  updateParent(value) 
    return() => 
      this.setState(
        counterParent: value
      );
    
  

  componentWillMount()
    this.props.data(this.state.counterParent) 
  

  render()
    return(
      <div>
        <span>Parent: this.state.counterParent</span>
        <Child data=this.updateParent.bind(this)/>
      </div>
    );
  

在子组件中我使用了一个按钮 在这里我想我必须使用 componentWillMount 才能发送给祖父母..但它没有到达

祖父组件:

export default class Grandparent extends React.Component
  constructor(props)
    super(props);
    this.state = 
      counterGrandparent: 0
    
  

  updateGrandparent(value)
    return() => 
      this.setState(
        counterGrandparent: value
      );
    
  

  render()
    return(
      <div>
        <span>Grandparent: this.state.counterGrandparent</span>
        <Parent data=this.updateGrandparent.bind(this)/>
      </div>
    );
  

我在这里做错了什么?

【问题讨论】:

【参考方案1】:

如你所见,数据以 props 的形式向下传递到组件树,并以 prop 回调函数的形式向上传递。当孩子发生某些事情时,您调用回调通知父母。然后父级更新其状态并将新状态作为道具传递给子级。

在您的情况下,您有三个嵌套组件,每个组件都有自己的状态。通常,只有父“容器”组件具有状态,子组件将是无状态的。所以让我们从子组件和父组件中删除状态。 Child 组件通过按钮与用户交互,因此每当按下按钮时,都会调用事件处理程序并使用回调将数据沿树向上流动。我添加了一些边框和填充以使嵌套清晰:

部分问题在于按钮上的onClick 处理程序。事件处理程序应该是函数引用,但您使用了函数调用。所以你的孩子可能会像下面这样。请注意接收当前状态的counter 属性,以及允许子级更新父级的updateParent 属性。

import React from 'react';

const boxStyle = 
    border: '1px solid red',
    padding: '5px'
;

export class ChildWithButton extends React.Component 
    handleClick(event) 
        this.props.updateParent(this.props.counter + 1);
    
    render() 
        return(
            <div style=boxStyle>
                <div>Child: this.props.counter</div>
                <button onClick=this.handleClick.bind(this)>
                    Add 1
                </button>
            </div>
          );
    

Parent 组件在 counter 属性中向下传递当前状态,并让 Child 组件通过调用它作为属性接收的 updateParent 回调来更改状态:

export class Parent extends React.Component
    updateParent(value) 
        this.props.updateGrandparent(value);
    
    render() 
        return(
            <div style=boxStyle>
                <div>Parent: this.props.counter</div>
                <ChildWithButton
                    counter=this.props.counter
                    updateParent=this.updateParent.bind(this) />
            </div>
        );
    

祖父组件保存状态,将其传递给counter 中的父组件,并允许它使用updateGrandparent 对其进行更新。需要注意的是,Grandparent 不知道 Child,只知道 Parent。

export default class Grandparent extends React.Component 
    constructor(props) 
        super(props);
        this.state = counter: 5;
    
    updateGrandparent(value)
        this.setState(counter: value);
    
    render() 
        return (
            <div style=boxStyle>
                <div>Grandparent: this.state.counter</div>
                <Parent
                    counter=this.state.counter
                    updateGrandparent=this.updateGrandparent.bind(this) />
            </div>
        );
    

你应该避免使用componentWillMount,因为它将在未来版本的 React 中使用removed。

您还应该将在 props 中传递的函数命名为 data 以外的名称。函数名通常是动词。

您的代码不止一个问题,所以我希望这能回答您的问题。

【讨论】:

@usuario128216 虽然是老入口,但你救了我!非常感谢

以上是关于将数据从孩子传递给祖父母的主要内容,如果未能解决你的问题,请参考以下文章

React context api,将数据从孩子传递给父母

Vue - 将数据从孩子传递给父母 - 基本发射不起作用

React:将状态从孩子传递到孩子再传递给父母

将数据从孩子传递给父母,而无需加载事件,这可能在 vue 世界上吗?

无法正确地将值从父母传递给孩子和孩子传递给父母

从父母到孩子的传递数据