详解使用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参数的访问。
运行后显示如图:
列表页
点击进入详情页: