详解使用Next.js构建服务端渲染应用(3)
然后在index和about页面中引入header组件,这样就实现了公共的layout的header:
import Header from '../components/Header'; const Index = () => ( <div> <Header /> <p>Hello next.js</p> </div> ) export default Index;
如果要增加footer也可以按照header的方法实现。
除了引入多个header、footer组件,我们可以实现一个整体的Layout组件,避免引入多个组件的麻烦,同样在components中添加一个Layout.js文件,内容如下:
import Header from './Header';
const layoutStyle = {
margin: 20,
padding: 20,
border: '1px solid #DDD'
}
const Layout = (props) => (
<div style={layoutStyle}>
<Header />
{props.children}
</div>
)
export default Layout
这样我们只需要在页面中引入Layout组件就可以达到布局的目的:
import Layout from '../components/Layout'; const Index = () => ( <Layout> <p>Hello next.js</p> </Layout> ) export default Index;
页面间传值
通过url参数(query string)
next中的页面间传值方式和传统网页一样也可以用url参数实现,我们来做一个简单的博客应用:
首先将index.js的内容替换成如下来展示博客列表:
import Link from 'next/link';
import Layout from '../components/Layout';
const PostLink = (props) => (
<li>
<Link href={`/post?title=${props.title}`}>
<a>{props.title}</a>
</Link>
</li>
);
export default () => (
<Layout>
<h1>My Blog</h1>
<ul>
<PostLink title="Hello next.js" />
<PostLink title="next.js is awesome" />
<PostLink title="Deploy apps with Zeit" />
</ul>
</Layout>
);
通过在Link的href中添加title参数就可以实现传值。
现在我们再添加博客的详情页post.js:
import { withRouter } from 'next/router';
import Layout from '../components/Layout';
const Post = withRouter((props) => (
<Layout>
<h1>{props.router.query.title}</h1>
<p>This is the blog post content.</p>
</Layout>
));
export default Post;
上面代码通过withRouter将next的router作为一个prop注入到component中,实现对url参数的访问。
运行后显示如图:
列表页

点击进入详情页:
