next.js的框架
2021-01-25 14:14
标签:而且 OLE onclick 文件中 syn 支持 tle function bbb 学习目标 Next.js官网 Next.js是一个基于React的一个服务端渲染简约框架。它使用React语法,可以很好的实现代码的模块化,有利于代码的开发和维护。 Next.js带来了很多好的特性: 使用服务器端渲染好处: 配置package.json中的scripts属性 此时 创建一个pages/index.js Hello Next.js 创建一个pages/next-route/teacher.js页面 教师页面 组件 URL对象语法: 注意:如果没有匹配到的话,默认会去找 普通组件 组件的创建可以在任何的文件夹下面,但是不要放在pages下面,因为组件并不需要url 布局组件 利用this.props.children 全局布局组件, 创建_app.js,模板入下: 通过as属性,给browser history来个路由掩饰,但是按刷新按钮路由就找不到了,因为服务器回去重新找/p/xxxx页面,但是实际上此时并不存在xxxx页面 创建自定义服务 项目的根目录新建 使用异步静态方法 当页面初次加载时, 注意:getInitialProps 不能 在子组件上使用,只能使用在 如果你的组件是一个类组件,你需要这样写: {item.title} css样式文件 css in js styled-jsx scoped 如果添加了 global 作用于当前组件,包括子组件 接口 获取电影列表: 获取电影详情: 引入next/head 注意:在卸载组件时, next.js的框架 标签:而且 OLE onclick 文件中 syn 支持 tle function bbb 原文地址:https://www.cnblogs.com/wangyuwei5955616/p/13236348.html2. Next.js服务器端渲染
2.1 什么是Next.js?
2.2 Next.js初体验
mkdir hello-next
cd hello-next
npm init -y
npm install --save react react-dom next
mkdir pages
{
"scripts": {
"dev": "next",
"build": "next build",
"start": "next start"
}
}
npm run dev
会得到一个404页面const Index = () => (
const Teacher = () => (
2.3 页面导航
2.3.1 路由跳转
import Link from ‘next/link‘
教师页面
可接收 URL 对象,而且它会自动格式化生成 URL 字符串。例如:
教师页面
import Router from ‘next/router‘
export default () => (
Router.push({pathname: ‘/teacher‘, query: {id: 1}})
_error.js
中定义的组件; 路由跳转不会向服务器发送请求页面的请求。2.3.2 创建组件
import React from ‘react‘
import App, {Container} from ‘next/app‘
class Layout extends React.Component {
render () {
const {children} = this.props
return
2.3.3 query strings
withRouter
高阶组件。从next/router中引入withRouter,注入路由对象到Next.js中的组件作为组件属性,从而获取query对象2.3.4 Clean URLs with Route Masking
// /post?title=xxxx 会变成 /p/xxxx
{props.title}
2.3.5 服务器端支持Clean URLs
npm install --save express
const express = require(‘express‘)
const next = require(‘next‘)
const dev = process.env.NODE_ENV !== ‘production‘
const app = next({ dev })
const handle = app.getRequestHandler()
app.prepare()
.then(() => {
const server = express()
server.get(‘*‘, (req, res) => {
return handle(req, res)
})
server.listen(3000, (err) => {
if (err) throw err
console.log(‘> Ready on http://localhost:3000‘)
})
})
.catch((ex) => {
console.error(ex.stack)
process.exit(1)
})
"scripts": {
"dev": "node server.js",
"build": "next build",
"start": "NODE_ENV=production node server.js"
}
server.get(‘/teacher/:id‘, (req, res) => {
const actualPage = ‘/teacher/detail‘
const queryParams = { id: req.params.id }
app.render(req, res, actualPage, queryParams)
})
2.4 静态文件服务
static
文件夹,代码通过 /static/
开头的路径来引用此文件夹下的文件,例如:export default () =>
2.5 获取页面数据
npm install --save isomorphic-unfetch
import fetch from ‘isomorphic-unfetch‘;
getInitialProps
获取数据,此静态方法能够获取所有的数据,并将其解析成一个 JavaScript
对象,然后将其作为属性附加到 props
对象上getInitialProps
只会在服务端执行一次。getInitialProps
只有在路由切换的时候(如Link
组件跳转或命名式路由跳转)时,客户端的才会被执行。pages
页面中。// Index是一个组件
Index.getInitialProps = async function() {
const res = await fetch(‘http://localhost:3301/in_theaters‘)
const data = await res.json()
// 这段数据会在服务器端打印,客户端连请求都不会发
console.log(data)
return {
// 组件中通过props.shows可以访问到数据
movieList: data
}
}
export default class extends React.Component {
static async getInitialProps() {
const res = await fetch(‘http://localhost:3301/in_theaters‘)
const data = await res.json()
console.log(data);
return {movieList: data}
}
render() {
return (
getInitialProps
: 接收的上下文对象包含以下属性:
pathname
: URL
的 path
部分query
: URL
的 query string
部分,并且其已经被解析成了一个对象asPath
: 在浏览器上展示的实际路径(包括 query
字符串)req
: HTTP request
对象 (只存在于服务器端)res
: HTTP response
对象 (只存在于服务器端)jsonPageRes
: 获取的响应数据对象 Fetch Response (只存在于客户端)err
: 渲染时发生错误抛出的错误对象// 在另外一个组件中,可以使用context参数(即上下文对象)来获取页面中的query
Post.getInitialProps = async function (context) {
const { id } = context.query
const res = await fetch(`http://localhost:3301/in_theaters/${id}?_embed=details`)
const data = await res.json()
console.log(data)
return {movieDetail: data}
}
2.6 组件样式
jsx
属性,只作用于当前组件,不包括子组件
2.7 豆瓣电影案例
http://localhost:3301/in_theaters
(in_theaters可以替换为coming_soon及top250)http://localhost:3301/in_theaters/1?_embed=details
2.7.1 豆瓣电影首页
MovieHeader
组件样式 .movie-header {
position: fixed;
top: 0;
left: 0;
right: 0;
}
ul {
display: flex;
justify-content: space-around;
align-items: center;
padding: 15px 0;
background-color: #1e2736;
margin: 0;
}
li {
list-style: none;
line-height: 30px;
height: 30px;
}
li a {
color: white;
}
li a:hover {
color: red;
}
2.7.2 豆瓣电影列表页
.movie-type {
display: flex;
flex-direction: column;
align-items: center;
}
.movie-box {
display: flex;
flex-direction: column;
align-items: center;
margin: 20px 0;
padding: 10px 0;
width: 40%;
box-shadow: 0 0 10px #bbb;
}
.movie-box:hover {
box-shadow: rgba(0,0,0,0.3) 0px 19px 60px;
}
2.7.3 豆瓣电影详情页
.detail {
width: 40%;
margin: 0 auto;
padding: 20px;
box-sizing: border-box;
box-shadow: 0 0 10px #bbb;
}
.detail-box {
text-align: center;
}
2.8 自定义头部元素head
export default () => {
的内容将被清除。请确保每个页面都在其
定义了所需要的内容,而不是假设其他页面已经加过了