javascript - React-Router-Redux 和 React-Bootstrap

标签 javascript reactjs redux react-router-redux

我已经和这个问题斗争了一段时间了!

我想拥有始终带有 Logo 、导航的“主应用程序容器”...我想使用 react-bootstrap 来美化它。

目前我遇到了问题,我的项目基于 davezuko 的“react-redux-starter-kit”

我试着把我所有的 Bootstrap <NavBar><LinkContainers>在提供程序内的 Root 容器中。

一切都显示出来,看起来不错,但我的链接都不起作用,当我放置一个常规的 react 路由器时 <Link>我会遇到同样的问题。

我想,嗯,链接在路由调用的 View 中工作,所以我在之后将所有这些复制到路由中 导出默认值(商店)=>(

Babel、eslint 和 webpack 允许编译,但是当我运行页面时,这些都没有显示,当我查看 react-dev 控制台时,这些 react 节点甚至都没有出现。

这是我的 Root.js:

import React, { PropTypes } from 'react';
import { Provider } from 'react-redux';
import { Router } from 'react-router';

import { IndexLink, Link } from 'react-router';

import NavBar from 'react-bootstrap/lib/Navbar';
import Nav from 'react-bootstrap/lib/Nav';
import NavItem from 'react-bootstrap/lib/NavItem';
import LinkContainer from 'react-router-bootstrap/lib/LinkContainer';

export default class Root extends React.Component {
  static propTypes = {
    history: PropTypes.object.isRequired,
    routes: PropTypes.element.isRequired,
    store: PropTypes.object.isRequired
  };

  get content () {
    return (
      <Router history={this.props.history}>
        {this.props.routes}
      </Router>
    );
  }

  get devTools () {
    if (__DEBUG__) {
      if (__DEBUG_NEW_WINDOW__) {
        if (!window.devToolsExtension) {
          require('../redux/utils/createDevToolsWindow').default(this.props.store);
        } else {
          window.devToolsExtension.open();
        }
      } else if (!window.devToolsExtension) {
        const DevTools = require('containers/DevTools').default;
        return <DevTools />;
      }
    }
  }

  render () {
    const styles = require('./../containers/Root.scss');
    return (
      <Provider store={this.props.store}>
        <div>
          <div className={styles.Root}>
            <Link to='login'>login</Link>
            <NavBar fixedTop>
              <NavBar.Header>
                <NavBar.Brand>
                  <IndexLink to='/' activeStyle={{color: '#33e0ff'}}>
                    <div className={styles.brand}></div>
                    <span>Hero Energy Solutions</span>
                  </IndexLink>
                </NavBar.Brand>
                <NavBar.Toggle />
              </NavBar.Header>
              <NavBar.Collapse eventKey={0}>
                <Nav navbar>
                  <LinkContainer to='/chat'>
                    <NavItem eventKey={1}>Chat</NavItem>
                  </LinkContainer>
                  <LinkContainer to='/widgets'>
                    <NavItem eventKey={2}>Widgets</NavItem>
                  </LinkContainer>
                  <LinkContainer to='/survey'>
                    <NavItem eventKey={3}>Survey</NavItem>
                  </LinkContainer>
                  <LinkContainer to='/about'>
                    <NavItem eventKey={4}>About Us</NavItem>
                  </LinkContainer>
                  <LinkContainer to='/'>
                    <NavItem eventKey={5}>Login</NavItem>
                  </LinkContainer>
                </Nav>
              </NavBar.Collapse>
            </NavBar>
          </div>
          {this.content}
          {this.devTools}
        </div>
      </Provider>
    );
  }
}

路由.js:

import React from 'react';
import { Route, IndexRoute } from 'react-router';
import CoreLayout from 'layouts/CoreLayout/CoreLayout';
import HomeView from 'views/HomeView/HomeView';
import LoginView from 'views/LoginView/LoginView';
import NotFoundView from 'views/NotFoundView/NotFoundView';
import RestrictedView from 'views/RestrictedView/RestrictedView';
import AboutView from 'views/AboutView/AboutView';

import { IndexLink, Link } from 'react-router';

import NavBar from 'react-bootstrap/lib/Navbar';
import Nav from 'react-bootstrap/lib/Nav';
import NavItem from 'react-bootstrap/lib/NavItem';
import LinkContainer from 'react-router-bootstrap/lib/LinkContainer';

import {UserAuthWrapper} from 'redux-auth-wrapper';
import {routerActions} from 'react-router-redux';

const CheckAuth = UserAuthWrapper({
  authSelector: (state) => state.user, // how to get the user state
  redirectAction: routerActions.replace, // the redux action to dispatch for redirect
  wrapperDisplayName: 'CheckAuth', // a nice name for the auth check
  failureRedirectPath: 'login'  // default anyway but meh!
});
export default (store) => (
    <div>
      <Route path='/' component={CoreLayout}>
        <IndexRoute component={HomeView} />
        <Route path='login' component={LoginView} />
        <Route path='home' component={HomeView} />
        <Route path='about' component={AboutView} />
        <Route path='restricted' component={CheckAuth(RestrictedView)} />
      </Route>
      <Route path='*' component={NotFoundView}/>
    </div>
);

我不确定这是否有帮助,但这是带有 React 控制台的客户端屏幕截图。 React 开发控制台截图:

Screenshot of react dev console

最佳答案

对不起大家!解决方案非常简单。

CoreLayout查看,是所有这些东西应该去的地方。我最大的问题是没有正确理解 react-router 的工作原理!现在我明白了,这是推理:

路线 /匹配所有具有 / 的请求在其中(基本上是所有请求)。但它是一个 React 组件,包含其他 React 组件!所以 CoreLayout返回组件,但 CoreLayout 的内容是对应的View,即About, Home...

编辑: 您需要包括 <div> {this.props.children} </div>CoreLayout查看您希望其他 subview 呈现的位置(否则它们不会呈现!)。

关于javascript - React-Router-Redux 和 React-Bootstrap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36057045/

相关文章:

javascript - React JS 应用程序 - 未捕获的语法错误 : Unexpected token <

reactjs - 关于现实世界示例的 Redux 问题

reactjs - prop 更改时重新渲染 React 组件

javascript - this.props 在方法内部未定义

javascript - 如何在reactjs中优化我的验证代码?

javascript - React Native 中的“预渲染”屏幕

reactjs - 以 redux-form 形式使用 axios 和 redux-thunk 发布请求

c# - 如何正确设置 ASP.NET 开发服务器?

javascript - 在页面中使用两个框架实现平滑滚动

javascript - Canvas 正在绘制旋转图像