【发布时间】:2019-12-25 13:15:00
【问题描述】:
我正在尝试将 context api 与 react-router 一起使用。我有一个容器,它的 trackList prop 中有一个来自 mapStateToProps 的歌曲列表,我想使用上下文 api(没有 react-redux)将它传递给一个名为 TrackDetail 的无状态组件。正如您将在下面看到的,我同时使用了 useContext 钩子和渲染道具模式,但没有成功从上下文中获取该值。
这是我在 Routes 文件中的内容:
import React, { Component } from "react";
import { BrowserRouter as Router, Route, Switch, Redirect } from "react-router-dom";
import TrackList from "../../containers/TrackList/TrackList";
import TrackDetail from "../TrackDetail/TrackDetail";
class Routes extends Component {
render() {
return (
<div className="Routes">
<Router>
<Switch>
{this.props.children}
<Route path="/tracks" component={TrackList} exact />
<Route path="/tracks/:id" component={TrackDetail} exact/>
<Route exact path="/" render={() => (<Redirect to="/tracks" />)} />
<Route path="*" render={() => (<Redirect to="/tracks" />)} />
</Switch>
</Router>
</div>
);
}
}
export default Routes;
这是我的 TrackList.jsx 容器(连接到 redux):
import React, { Component } from "react";
import { connect } from "react-redux";
import "./TrackList.scss";
import Spinner from "../../components/shared/Spinner/Spinner";
export const TrackListContext = React.createContext();
class TrackListProvider extends Component {
state = {
foo: "bar"
}
render() {
return (
<TrackListContext.Provider value={this.state}>
{this.props.children}
</TrackListContext.Provider>
)
}
};
export class UnConnectedTrackList extends Component {
constructor(props) {
super(props);
this.state = {
value: ""
};
}
componentDidMount() {
if (this.props.trackList.length === 0) {
this.props.getTracks()
.then(()=>this.props.changeSpinnerState());
}
}
render() {
if (this.props.spinnerState) return <Spinner />;
return <TrackListProvider trackList={this.props.trackList}>
<div>
more content
</div>
</TrackListProvider>;
}
}
const mapStateToProps = state => {
const trackList = state.trackList.length !== 0 ? state.trackList : [];
return {
trackList,
};
};
export default connect(
mapStateToProps,
null
)(UnConnectedTrackList);
这是我的 TrackDetail.jsx:
import React, { useContext } from "react";
import {TrackListContext} from '../../containers/TrackList/TrackList';
import "./TrackDetail.scss";
const TrackDetailCmp = (props) => {
const value = useContext(TrackListContext);
// value is undefined
const currentTrackIndex = 0;
const { trackList} = props;
// trackList is undefined
return (
<div className="container">
<h3></h3>
</div>
);
};
const withContext = (Component) => {
return (props) => <TrackListContext.Consumer>
{(value) => <Component {...props} trackList={value} />}
</TrackListContext.Consumer>
};
const TrackDetail = withContext(TrackDetailCmp);
export default TrackDetail;
但我越来越不确定了。
可能是版本的问题。
这是我的 package.json:
{
"dependencies": {
"react": "^16.9.0",
"react-dom": "^16.9.0",
"react-redux": "^7.1.0",
"react-router": "^5.0.1",
"react-router-dom": "^5.0.0",
"redux": "^4.0.4",
"redux-thunk": "^2.3.0"
},
"devDependencies": {
"@types/jest": "^24.0.17",
"@types/react": "^16.9.2",
"enzyme": "^3.10.0",
"enzyme-adapter-react-16": "^1.14.0",
"node-sass": "^4.12.0"
}
}
【问题讨论】:
标签: reactjs react-router react-context