【发布时间】: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