#javascript #reactjs #react-router #react-context
#javascript #reactjs #react-маршрутизатор #реагировать-контекст
Вопрос:
Мое приложение использует маршрутизатор React (Router.js ), Я пытаюсь реализовать CentralStore, используя Context API для передачи состояния в Event.js компонент, отображаемый маршрутизатором.
Как передать context consumer компоненту (Event.js ) отображается только маршрутизатором React? Прямо сейчас AppContext не определен в Event.js.
Живой код:https://codesandbox.io/s/0x83zz0jmw
const AppContext = React.createContext();
class CentralStore extends React.Component {
state={
events: false,
}
componentDidMount() {
firebase
.collection("events")
.get()
.then( querySnapshot => {
const events = [];
querySnapshot.docs.forEach(doc => {
events.push(doc.data());
});
this.setState({
events: events
});
});
}
render(){
return(
<AppContext.Provider value={{
state: this.state
}}>
{this.props.children}
</AppContext.Provider>
)
}
}
import React from 'react';
import {BrowserRouter, Route, Switch} from 'react-router-dom';
import App from '../App';
import EventCreator from './EventCreator';
import NotFound from './NotFound';
import Event from './Event';
import Events from './Events';
import CentralStore from '../CentralStore';
const Router = () => (
<CentralStore>
<BrowserRouter>
<Switch>
<Route exact path="/" component={App}/>
<Route path="/create-event" component={EventCreator} />
<Route path="/events/:eventId" component={Event} />
<Route path="/events" component={Events} />
<Route component={NotFound}/>
</Switch>
</BrowserRouter>
</CentralStore>
);
export default Router;
//
const Event = (props) => {
console.log(props);
return (
<div className="event">
<AppContext.Consumer>
{(context) => (
console.log(context)
)}
</AppContext.Consumer> */}
</div>
);
}
export default Event;
Комментарии:
1. вы импортировали
AppContext
?2. Я пытался импортировать его в Event.js в качестве импорта импортируйте AppContext из ‘.. / CentralStore’ — не работает. Я никуда не экспортирую AppContext. Я понятия не имею, как это импортировать.
3. Я экспортировал AppContext в компонент CentralStore, теперь у меня есть доступ к состоянию в Event.js файл — это хороший метод обработки ContextAPI с помощью маршрутизатора React?
Ответ №1:
Проблема была решена путем экспорта AppContext из компонента CentralStore
// The missing export
export const AppContext = React.createContext();
class CentralStore extends React.Component {
state={
events: false,
}
componentDidMount() {
firebase
.collection("events")
.get()
.then( querySnapshot => {
const events = [];
querySnapshot.docs.forEach(doc => {
events.push(doc.data());
});
this.setState({
events: events
});
});
}
render(){
return(
<AppContext.Provider value={{
state: this.state
}}>
{this.props.children}
</AppContext.Provider>
)
}
}