【问题标题】:React-Router can't import components within componentsReact-Router 无法在组件内导入组件
【发布时间】:2016-04-21 04:07:42
【问题描述】:

我在理解如何使用 react-router 构建路由和页面时遇到问题,我学习了 react 的原理,目前正在处理 24ways 上的帖子。我面临的问题是导入组件的能力。

例如,我的路由器设置如下:

// Router
export const routes = {
    path: '',
    component: appComponent,
    childRoutes: [
        {
            path: '/',
            components: {nav: navbarComponent, content: indexComponent}
        },
        {
            path: '/join',
            component: {nav: navbarComponent, content: joinComponent}
        }
    ]
};

// appComponent
import React from 'react';

export default class appComponent extends React.Component {
    render() {
        const { nav, content } = this.props;
        return (
            <div>
                <div className="nav">
                    {nav}
                </div>
                <div className="content">
                    {content}
                </div>
            </div>
        );
    }
}

有没有办法让我不必这样做,而是可以直接导入到我的每个组件中,例如:

// Router
export const routes = {
    path: '',
    component: appComponent,
    childRoutes: [
        {
            path: '/',
            components: indexComponent
        },
        {
            path: '/join',
            component: joinComponent
        }
    ]
};

// appComponent
import React from 'react';
import Navbar from 'Navbar';

export default class appComponent extends React.Component {
    render() {
        return (
            <div>
                <Navbar />
                {this.props.children}
            </div>
        );
    }
}

一直在寻找并找不到解决此问题的方法,想使用react-router和react,但如果不可能,目前似乎不可行。根据我对 React 的理解,在彼此之间构建和重用组件的能力是可能的。

这里是导航栏组件:

import React from 'react';
import Navbar from 'react-bootstrap/lib/Navbar';
import Nav from 'react-bootstrap/lib/Nav';
import NavItem from 'react-bootstrap/lib/NavItem';

export default class navbarComponent extends React.Component {
    render () {
        return (
            <Navbar inverse>
                <Navbar.Header>
                    <Navbar.Brand>
                        <a href="#">React-Bootstrap</a>
                    </Navbar.Brand>
                    <Navbar.Toggle />
                </Navbar.Header>
                <Navbar.Collapse className="bs-navbar-collapse">
                    <Nav>
                        <NavItem eventKey={1} href="/">Home</NavItem>
                    </Nav>
                    <Nav pullRight>
                        <NavItem eventKey={1} href="/join">Sign Up</NavItem>
                        <NavItem eventKey={2} href="/login">Login</NavItem>
                    </Nav>
                </Navbar.Collapse>
            </Navbar>
        )
    }
}

我的服务器代码如下:

// module imports
import express from 'express';
import http from 'http';

// react imports
import React from 'react';
import { renderToString } from 'react-dom/server';
import { match, RoutingContext } from 'react-router';

// route imports
import { routes } from './lib/routes';

const app = express();
app.use(express.static('public'));
app.set('views', __dirname + '/public/views');
app.set('view engine', 'ejs');

app.get('*', (req, res) => {
    match({ routes, location: req.url }, (err, redirectLocation, props) => {
        if (err) {
            res.status(500).send(err.message);
        } else if (redirectLocation) {
            res.redirect(302, redirectLocation.pathname + redirectLocation.search);
        } else if (props) {
            const markup = renderToString(<RoutingContext {...props} />);
            res.render('index', { markup })
        } else {
            res.sendStatus(404);
        }
    });
});

const server = http.createServer(app);

server.listen(3000);
server.on('listening', () => {
    console.log('Listening on 3000');
});

【问题讨论】:

  • 感觉我可能在这里遗漏了一些东西,因为您的第二个示例看起来不错。尝试时出了什么问题?
  • 只是不加载组件。生病添加组件。奇怪的是我也没有收到任何错误。
  • @N3dst4 是否与它是通用/同构的事实有关?
  • 如果你在服务器上渲染,也许吧?你去过github.com/rackt/react-router/blob/latest/docs/guides/advanced/…吗?
  • 我正在使用几乎(如果不完全相同的设置),将为服务器发布代码。

标签: node.js reactjs ecmascript-6 webpack react-router


【解决方案1】:

我一直在使用如下路线,我通过great tutorial from Egghead.io了解到这一点

App.js(主条目)

import React from 'react';
import ReactDOM from 'react-dom';
import { Router } from 'react-router';
import routes from './config/routes.jsx';

ReactDOM.render(
    <Router>{routes}</Router>,
    document.getElementById('my-app')
);

./config/routes.jsx

import React from 'react';
import Main from '../components/Main';
import Index from '../components/Index';
import { Route, IndexRoute } from 'react-router';

export default (
    <Route path="/" component={Main}>
        <IndexRoute component={Index} />
    </Route>
)

../components/Main.jsx

import React from 'react';

class Main extends React.Component {
    render() {
        return (
            <div>
                Hello World. Display my children:
                {this.props.children}
            </div>
        );
    }
}

export default Main;

../components/Index.jsx

import React from 'react';

class Index extends React.Component {
    render() {
        return (
            <div>
               I'm the index Route                   
            </div>
        );
    }
}

export default Index ;

【讨论】:

  • 感谢您的帮助,但这对我想要实现的目标不起作用,据我所知,这段代码仍然只允许每条路线有一个组件,而每条路线中没有子组件。
  • @DavidFH 不确定我是否理解 - 您可以将任何您希望的组件添加到 Main 或 Index 的渲染函数中,它们将被相应地渲染。
  • 这是我在初始代码中遇到的问题,即组件的非渲染。对不起,我的误解。我的代码是在没有任何内容的客户端上创建组件。这段代码能让我以通用的方式工作吗?
  • @DavidFH 如果我们将此示例应用于您的示例,则可以将 childRoutes 数组替换为 &lt;Route path="/" component={IndexComponent}&gt; &lt;Route path="/join" component={JoinComponent} /&gt; &lt;/Route&gt;
  • 您提供的代码示例将允许我渲染服务器端吗?
猜你喜欢
  • 2020-11-04
  • 2019-07-01
  • 2019-12-22
  • 1970-01-01
  • 2017-11-26
  • 2020-06-26
  • 1970-01-01
  • 2021-01-03
  • 1970-01-01
相关资源
最近更新 更多