当前位置: 首页 > 知识库问答 >
问题:

从react中的父组件访问子组件的子状态

高高雅
2023-03-14

我想访问

<Parent>
   <Child1>
      <Child2>
   </Child1>
</Parent>

如何实现?


共有2个答案

丁俊智
2023-03-14

避免将道具传递给多个组件的一种方法是使用reactscontextapi。

这允许我们访问状态从MyProvider组件100子下来,而无需手动通过100子组件向下传递道具。

import React, { Component } from "react";
import { render } from "react-dom";

// first make a new context
const MyContext = React.createContext();

// Then Create a provider Component
class MyProvider extends Component {
  state = {
    name: "Junie",
    age: 21
  };
  render() {
    return (
      <MyContext.Provider
        value={{
          state: this.state,
          increment: () => this.setState({ age: this.state.age + 1 })
        }}
      >
        {this.props.children}
      </MyContext.Provider>
    );
  }
}

const App = () => {
  return (
    <MyProvider>
      <div>
        <p>Hello I'm the App </p>
        <Child />
      </div>
    </MyProvider>
  );
};

const Child = props => {
  return (
    <div>
      <Child2 />
    </div>
  );
};

class Child2 extends Component {
  render() {
    return (
      <div>
        <p> Im Child 2 </p>
        <MyContext.Consumer>
          {context => (
            <div>
              {" "}
              <p>
                {" "}
                Inside the context consumer: {context.state.name}{" "}
                {context.state.age}
              </p>{" "}
              <button onClick={context.increment}>Update Age </button>
            </div>
          )}
        </MyContext.Consumer>
      </div>
    );
  }
}

render(<App />, document.getElementById("root"));

使用上下文可能是您正在寻找的。

还有另一种实现。

class Parent extends React.Component {

state={childstate:''}

getFromChild = (value) => {
 this.setState({childstate:value})
}

 render() {
  return (
   <div> 
    <Child1 getFromChild={this.getFromChild/> 
    {this.state.childstate && <div> {this.state.childstate} </div>} 
   </div>
  )
 }
}

const Child1 = (props) => <Child2 getFromChild={props.getFromChild}/>

class Child2 extends React.Component {
state={somevalue:10}

sendValue = (value) => this.props.getFromChild(value)

render() {
 return (
   <div>
    <button onClick={() => this.sendValue(this.state.somevalue)} /> 
   </div>
  )
 }
}

非常简单,我们在父级中使用setter从相应的子级获取状态。

我们将一个值作为参数,并将父状态的状态设置为该值。我把它命名为childstate,这样就很清楚,我们给父母的任何价值都来自孩子。

getFromChild=(值)=

将函数作为道具从Child1传递到Child2

<代码>

Child2中添加onClick处理程序,将值从子项发送到父项

<代码>

刁丰羽
2023-03-14

你根本不应该这样做。在react中,信息应始终从上到下流动。实现这一点的方法是将状态提升到父级,并将值作为道具传递下去。在您的子系统中,当值发生变化(例如通过用户交互)时,回调也会作为子系统调用的道具传递,以便父系统可以更新其状态:

const Child = ({ value, onChange }) => (
  <Fragment>
    <p>{value || "no value"}</p>
    <button onClick={() => onChange('changed')} >Set value</button>
  </Fragment>
);

class Parent extends Component {
  state = {
    value: null
  };

  handleChange = value => this.setState({value})

  render() {
    return <Child value={this.state.value} onChange={this.handleChange} />;
  }
}

codesandbox上的工作示例

这可以无限深地嵌套。在一个更大的应用程序中,您的状态需要在分布在整个组件树中的多个组件中使用,您可能会达到一个PITA。克服这一问题的常用方法是使用redux提供的全局存储。

 类似资料:
  • 我在react native中有一个搜索栏组件,它在父组件中导入, SearchBar子组件具有以下元素: 是否可以访问此子组件在其中导入的父组件中的状态?提前感谢你的帮助

  • 问题内容: 我有两个组件: 父组件 ,我想从中更改子组件的状态: 和 子组件 : 我需要从父组件更改子组件的 打开 状态,还是单击父组件中的按钮时从父组件调用子组件的 toggleMenu() ? 问题答案: 状态应在父组件中进行管理。您可以通过添加属性将值传输到子组件。

  • 我在用vue-cli支架做网页包 我的Vue组件结构/传家宝目前看起来如下: 应用程序 在应用程序级别,我需要一个vuejs组件方法,该方法可以将子组件的所有数据聚合到一个JSON对象中,然后发送到服务器。 有没有办法访问子组件的数据?具体来说,多层深? 如果没有,传递oberservable数据/参数的最佳实践是什么,这样当子组件修改它时,我就可以访问新的值?我试图避免组件之间的硬依赖关系,所以

  • 我有两个组件:父组件,我想改变子组件的状态: 和子组件: 我需要从父组件更改子组件的打开状态,或者当单击父组件中的按钮时,从父组件调用子组件的toggleMenu()?

  • 假设我的父组件有两个子组件: 我从Child2获得一个输入,并将其传递给父组件(到目前为止,我知道该怎么做)。但是,我需要将该输入传递给Child1,以更新它的状态。 我怎么能那么做?

  • 我倾向于使用react功能组件和钩子,因为我对react没有太多经验。我想在父功能组件中使用react dual listbox类组件。在这个父组件中,我希望能够访问子类组件的状态。最好的方法是什么? 来自https://github.com/jakezatecky/react-dual-listbox的子响应双列表框组件 包含在标准功能组件中 例如,是否可能在父组件中有一个钩子,该钩子会根据du