首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从react中的父组件访问子组件的子状态

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

Stack Overflow用户
提问于 2018-03-29 22:35:08
回答 2查看 12.1K关注 0票数 3

我想从父组件访问<Child2>状态。

代码语言:javascript
复制
<Parent>
   <Child1>
      <Child2>
   </Child1>
</Parent>

如何实现这一目标?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-03-29 22:50:24

你根本不应该这样做。在react中,信息应该总是从上到下流动。react的方法是使用lift state up to the parent并将值作为属性向下传递。在您的子对象中,当值发生更改(例如,通过用户交互)时,这些回调也会作为道具传递给子对象,以便父对象可以更新其状态:

代码语言:javascript
复制
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} />;
  }
}

Working example on codesandbox

这可以通过无限深度的嵌套来完成。在一个更大的应用程序中,您的状态需要在您的组件树中的多个组件中使用,您可能会遇到这种情况。克服这个问题的常见方法是使用像redux提供的全局存储。

票数 6
EN

Stack Overflow用户

发布于 2018-03-29 22:46:36

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

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

代码语言:javascript
复制
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"));

使用context可能就是您正在寻找的。

还有另一个实现。

代码语言:javascript
复制
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来从相应的子对象中获取状态。

我们将一个值作为参数,并将父状态的状态设置为该值。我将其命名为子状态,因此很明显,我们发送给父对象的任何值都来自于子对象。

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

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

<Child2 getFromChild={props.getFromChild}/>

Child2中,添加onClick处理程序以将值从子对象发送到Parent

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49558824

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档