React Router в разных компонентах - PullRequest
0 голосов
/ 09 мая 2018

Итак, у меня есть два компонента: App.js и MainNav.js. Моя цель здесь состоит в том, чтобы App.js содержал всю информацию о маршрутизации, а MainNav.js содержал навигацию.

App.js

import React, { Component } from 'react';
import './App.css';
import * as ReadableAPI from './Utils/ReadableAPI';
import { Route, Link, withRouter } from 'react-router-dom'
import {addPost} from "./Actions/Posts";
import { connect } from 'react-redux'
import MainNav from "./Components/MainNav";

class App extends Component {

    componentWillMount = () => {
        const { store } = this.props;
        console.log(store.getState());
    }
    addPost = () => {
        let timestamp = Date.now();
        this.props.store.dispatch(addPost({
            id: 'fdafsf',
            timestamp: timestamp,
            body: 'this is the body',
            author: 'this is the title',
            category: 'category',
            title: 'this is the title'
        }))
    }
    render() {
        const { category, posts } = this.props;
        console.log(category);
        return (
          <div className="App">
              <Route exact path={"/"} render={() => (
                  <div>
                      <MainNav categories={category} active={"all"}/>
                  </div>
              )}/>
              <Route path={"/react"} render={() => (
                  <div>
                    <MainNav categories={category} active={"react"}/>
                  </div>
              )}/>
              <Route path={"/redux"} render={() => (
                  <div>
                    <MainNav categories={category} active={"redux"}/>

                  </div>
              )}/>
              <Route path={"/udacity"} render={() => (
                  <div>
                    <MainNav categories={category} active={"udacity"}/>
                  </div>
              )}/>
          </div>
        );
  }
}

function mapStateToProps({posts, category}) {
    return {
        posts: posts,
        category: category
    }
}
export default withRouter(connect(
    mapStateToProps
)(App))
// export default App;

MainNav.js

import React, { Component } from 'react';
import PropTypes from 'prop-types';
import { Route, Link } from 'react-router-dom'

class MainNav extends Component{
    static propTypes = {
        categories: PropTypes.array.isRequired,
        active: PropTypes.string.isRequired
    }

    render() {
        const { categories, active } = this.props;
        const currentTab = active;
        return (

            <div className={"main-nav-container"}>
                <ul className={"main-nav-list"}>
                    <li className={"main-nav-list-item " + (currentTab === 'all' ? 'active':'')}>
                        <Link
                            to={"/"}
                        >
                            <div className={"category"}>
                                All
                            </div>
                        </Link>
                    </li>
                    {categories.map( (category) => (
                        <li className={"main-nav-list-item " + (currentTab === category.name ? 'active':'')} key={category.path}>
                            <Link
                                to={"/" + category.path}
                            >
                                <div className={"category"}>
                                    {category.name}
                                </div>
                            </Link>
                        </li>
                    ))}
                </ul>
            </div>
        )
    }
}

export default MainNav

Проблема в том, что компоненты ссылок действительно меняют URL, но, похоже, не обновляют реквизиты в MainNav (мне нужно обновить их, чтобы изменить, какой элемент навигации считается активным). Это правильный метод или мне нужно, чтобы весь этот код повторялся в App.js?

редактирование:

Как я и просил, это мой файл index.js, который является моим файлом верхнего уровня:

import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
import registerServiceWorker from './registerServiceWorker';
import { createStore, applyMiddleware, compose } from 'redux'
import reducer from './Reducers'
import { Provider } from 'react-redux';
import logger from 'redux-logger';
import { combineReducers } from 'redux';
import * as ReadableAPI from './Utils/ReadableAPI';
import {addInitialStatePost} from "./Actions/Posts";
import {addInitialStateCategories} from "./Actions/Categories";
import { BrowserRouter } from 'react-router-dom'


const composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__  || compose;

const store = createStore(
    reducer,
    composeEnhancers(
        applyMiddleware(logger)
    )
);

ReactDOM.render(
    <BrowserRouter><Provider store={store}>
        <App store={store}/>
    </Provider></BrowserRouter>, document.getElementById('root')

);
registerServiceWorker();

//set up the initial state of the app
ReadableAPI.getAllPosts().then(res => res.forEach((p) => {
    store.dispatch(addInitialStatePost({
        id: p.id,
        author: p.author,
        body: p.body,
        category: p.category,
        commentCount: p.commentCount,
        deleted: p.deleted,
        timestamp: p.timestamp,
        title: p.title,
        voteScore: p.voteScore
    }))
}));

ReadableAPI.getCategories().then(res => res.forEach((c) => {
    store.dispatch(addInitialStateCategories({
        name: c.name,
        path: c.path
    }))
}));
...