我想<Child2>
从父组件访问状态。
<Parent>
<Child1>
<Child2>
</Child1>
</Parent>
如何实现?
我想<Child2>
从父组件访问状态。
<Parent>
<Child1>
<Child2>
</Child1>
</Parent>
如何实现?
你根本不应该这样做。在react中,信息应该始终从上到下流动。执行此操作的react方法是将状态提升到父级并将值作为props向下传递。在您的孩子中,您有回调,这些回调也作为孩子调用的props传递,当值更改时(例如通过用户交互),以便父级可以更新其状态:
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} />;
}
}
这可以无限深嵌套来完成。在一个更大的应用程序中,您的状态需要在遍布整个组件树的多个组件中使用,您可能会达到获得 PITA 的地步。解决这个问题的常用方法是使用像redux提供的全局存储。
避免将 props 传递给多个组件的一种方法是使用 reacts context
api。
这允许我们从MyProvider
组件 100 个子组件向下访问状态,而无需手动将 props 向下传递到 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"));
使用context
可能是您正在寻找的。
还有另一种实现。
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 = (value) => this.setState({childstate:value})
将函数作为props从Child1
to向下传递Child2
<Child2 getFromChild={props.getFromChild}/>
在Child2
添加的onClick处理程序从孩子送value,Parent
<button onClick={() => this.sendValue(this.state.somevalue)} />