在React.js中的父组件中使用react-router时,如何使用react context API将数据从父组件传递到子组件?
How do I use react context API to pass data from parent component to child component when using react-router in the parent component in React.js?
App.js - 父组件
import React from 'react';
import { BrowserRouter as Router, Switch, Route } from 'react-router-dom';
import ChildComponent1 from './ChildComponent1';
import ChildComponent2 from './ChildComponent2';
import Context from './Context';
class App extends React.Component {
constructor(props) {
super(props);
this.state = {
messageThatllChange: "changing message",
};
}
render() {
return (
<Router>
<Switch>
<Context.Provider value={this.state.messageThatllChange}>
<Route exact path='/' component={ChildComponent1} />
<Route path='/chat' component={ChildComponent2} />
</Context.Provider>
</Switch>
</Router>
);
}
}
export default App;
ChildComponent1.js - 子组件
import React from 'react';
import Context from './Context';
class Join extends React.Component {
static contextType = Context;
constructor(props) {
super(props);
console.log(this.context); // this.context returns undefined.
}
render() {
return (
<div>
{/* Something important here */}
</div>
);
}
}
// Join.contextType = Context; // tried this too
export default Join;
在子组件 1 构造函数中尝试打印 this.context returns undefined
.
如何将上下文从父级传递给子级?我做错了什么?
尝试重写您的子组件,如下所示:
动态上下文
import React from 'react';
import Context from './Context'; // Context here is the name you defined as Context = React.createContext();
class Join extends React.Component {
render() {
let props = this.props;
let value = this.context;
return (
<div>
{/* Something important here */}
</div>
);
}
}
Join.contextType = Context; // Context here is the name you defined as Context = React.createContext();
export default Join;
Context.Consumer
import React from 'react';
import { Consumer } from './Context'; // the path is where your context file is
class Join extends React.Component {
constructor(props) {
super(props);
}
render() {
return (
<Consumer>
{value => (
{/* Here you can retrieve your messageThatllChange */}
<div>
{/* Something important here */}
</div>
)
</Consumer>
);
}
}
export default Join;
import React from "react";
import ReactDOM from "react-dom";
import "./styles.css";
const Context = React.createContext({ message: "hi" });
class Child extends React.Component {
constructor() {
super();
console.log("Constructor: ", this.context); // undefined here
}
render() {
const message = this.context;
return <p>{message}</p>; // hello here
}
}
Child.contextType = Context;
function App() {
return (
<div className="App">
<Context.Provider value="hello">
<Child />
</Context.Provider>
</div>
);
}
const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);
尝试在构造函数中打印上下文 returns 未定义,但您应该能够像这样在渲染函数中使用上下文。
你可以运行这里的例子:https://codesandbox.io/s/crazy-forest-89bd6?fontsize=14
App.js - 父组件
import React from 'react';
import { BrowserRouter as Router, Switch, Route } from 'react-router-dom';
import ChildComponent1 from './ChildComponent1';
import ChildComponent2 from './ChildComponent2';
import Context from './Context';
class App extends React.Component {
constructor(props) {
super(props);
this.state = {
messageThatllChange: "changing message",
};
}
render() {
return (
<Router>
<Switch>
<Context.Provider value={this.state.messageThatllChange}>
<Route exact path='/' component={ChildComponent1} />
<Route path='/chat' component={ChildComponent2} />
</Context.Provider>
</Switch>
</Router>
);
}
}
export default App;
ChildComponent1.js - 子组件
import React from 'react';
import Context from './Context';
class Join extends React.Component {
static contextType = Context;
constructor(props) {
super(props);
console.log(this.context); // this.context returns undefined.
}
render() {
return (
<div>
{/* Something important here */}
</div>
);
}
}
// Join.contextType = Context; // tried this too
export default Join;
在子组件 1 构造函数中尝试打印 this.context returns undefined
.
如何将上下文从父级传递给子级?我做错了什么?
尝试重写您的子组件,如下所示:
动态上下文
import React from 'react';
import Context from './Context'; // Context here is the name you defined as Context = React.createContext();
class Join extends React.Component {
render() {
let props = this.props;
let value = this.context;
return (
<div>
{/* Something important here */}
</div>
);
}
}
Join.contextType = Context; // Context here is the name you defined as Context = React.createContext();
export default Join;
Context.Consumer
import React from 'react';
import { Consumer } from './Context'; // the path is where your context file is
class Join extends React.Component {
constructor(props) {
super(props);
}
render() {
return (
<Consumer>
{value => (
{/* Here you can retrieve your messageThatllChange */}
<div>
{/* Something important here */}
</div>
)
</Consumer>
);
}
}
export default Join;
import React from "react";
import ReactDOM from "react-dom";
import "./styles.css";
const Context = React.createContext({ message: "hi" });
class Child extends React.Component {
constructor() {
super();
console.log("Constructor: ", this.context); // undefined here
}
render() {
const message = this.context;
return <p>{message}</p>; // hello here
}
}
Child.contextType = Context;
function App() {
return (
<div className="App">
<Context.Provider value="hello">
<Child />
</Context.Provider>
</div>
);
}
const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);
尝试在构造函数中打印上下文 returns 未定义,但您应该能够像这样在渲染函数中使用上下文。
你可以运行这里的例子:https://codesandbox.io/s/crazy-forest-89bd6?fontsize=14