说明
实现 路由跳转、redux
文件版本
- “next”: “^4.2.3”,
- “react”: “^16.2.0”,
- “react-dom”: “^16.2.0”
Next.js GitHub 文档
项目源码
使用
Next.js 使用文件体统作为API,可以自动进行服务器端渲染和代码分割
1. 安装
yarn add next react react-dom
2. package.json 中添加 npm script
"scripts": { "dev": "next", "build": "next build", "start": "next start" },
3. 创建 /pages 文件夹,其中文件会映射为路由
/pages 文件夹是顶级组件文件夹 其中 /pages/index.js 文件会映射文 / 路由,其他文件根据文件名映射
目录结构
映射路由
/pages/index.js
/
/pages/about.js
/about
/pages/home/index.js
/home
/pages/home/about.js
/home/about
每一个路由js文件都会 export 一个 React 组件,这个组件可以是函数式的也可以是通过集成 React.Component 得到的类
export default () => <div>this is index page </div>;
4. 创建 /static 文件夹,存放静态资源
静态资源文件夹文件会映射到 /static/ 路由下,直接通过 http://localhost:3000/static/test.png 访问
5. 使用内置组件 <head> 定制每个页面的 head 部分
import Head from 'next/head'; // 引入内置组件 export default () => ( <div> <Head> <title>index page</title> <meta name="viewport" content="initial-scale=1.0, width=device-width"/> </Head> <div>this is index page</div> </div> );
6. 使用内置组件 <Link> 进行路由跳转
import Link from 'next/link'; export default () => ( <div> <p>this is home index page</p> <Link href="/about" rel="external nofollow" rel="external nofollow" > <a> to about page</a> </Link> </div> );
更多 Link 使用方式
import React, {Component} from 'react'; import Link from 'next/link'; export default class About extends Component { constructor(props) { super(props); } render() { // href 值可以是一个对象 const href = { pathname: '/home', query: {name: 'test'} }; return ( <div> <p>this is about page </p> <img src="/UploadFiles/2021-04-02/test.png">7. 使用内置 router 方法,手动触发路由跳转
next/router 提供一套方法和属性,帮助确认当前页面路由参数,和手动触发路由跳转
import router from 'next/router'; /* router.pathname ==> /home router.query ==> {} router.route - 当前路由 asPath - 显示在浏览器地址栏的实际的路由 push(url, as=url) - 跳转页面的方法 replace(url, as=url) - 跳转页面 */更好的方式使用路由 – router 的 withRouter 方法
import Link from 'next/link'; import {withRouter} from 'next/router'; const Home = (props) => { // 这里的 props 会得到 {router, url} 两个属性 // router: {push: "/home", asPath: "/home", back: "/about" rel="external nofollow" rel="external nofollow" > <a> to about page</a> </Link> */} </div> ); } export default withRouter(Home);8. 使用 next-redux-wrapper 插件辅助实现 redux
1. 安装依赖
sudo yarn add next-redux-wrapper redux react-redux redux-devtools-extension redux-thunk2. 创建 initializeStore.js 一个可以返回 store 实例的函数
在这个文件中会完成装载中间件、绑定reducer、链接浏览器的redux调试工具等操作
import { createStore, applyMiddleware } from 'redux'; import { composeWithDevTools } from 'redux-devtools-extension'; import thunk from 'redux-thunk'; import reducer from '../modules/reducers'; const middleware = [thunk]; const initializeStore = initialState => { return createStore( reducer, initialState, composeWithDevTools(applyMiddleware(...middleware)) ); }; export default initializeStore;3. 创建 reducer , action
与普通 react-redux 项目创建 reducer, action 的方法一致,我把这部分代码都提取到一个名为 modules的文件夹中
// /modules/reducers.js import { combineReducers } from 'redux'; import about from './about/reducer'; // 合并到主reducer const reducers = { about }; // combineReducers() 函数用于将分离的 reducer 合并为一个 reducer export default combineReducers(reducers);// /modules/about/reudcer.js // /about 页面的 reducer import { CHANGE_COUNT } from '../types-constant'; const initialState = { count: 0 }; const typesCommands = { [CHANGE_COUNT](state, action) { return Object.assign({}, state, { count: action.msg }); }, } export default function home(state = initialState, action) { const actionResponse = typesCommands[action.type]; return actionResponse "htmlcode">// /modules/about/actions.js // /about 页面的 action import { CHANGE_COUNT } from '../types-constant'; export function changeCount(newCount) { return { type: CHANGE_COUNT, msg: newCount }; }4. 页面中使用
需要用到 next-redux-wrapper 提供的 withRedux 高阶函数,以及 react-redux 提供的 connect 高阶函数
import React, { Component } from 'react'; import withRedux from 'next-redux-wrapper'; import { connect } from 'react-redux'; import { bindActionCreators } from 'redux'; import AboutCom from '../components/About/index'; import initializeStore from '../store/initializeStore'; import { changeCount } from '../modules/about/actions'; class About extends Component { constructor(props) { super(props); } render() { const { about: { count }, changeCount } = this.props; return <AboutCom count={count} changeCount={changeCount} />; } } const connectedPage = connect( state => ({ about: state.about }), dispatch => ({ changeCount: bindActionCreators(changeCount, dispatch) }) )(About); export default withRedux(initializeStore)(connectedPage);更多
查看 github官网
react-next github上一个next架构为主实现React服务端渲染的模板
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
- 小骆驼-《草原狼2(蓝光CD)》[原抓WAV+CUE]
- 群星《欢迎来到我身边 电影原声专辑》[320K/MP3][105.02MB]
- 群星《欢迎来到我身边 电影原声专辑》[FLAC/分轨][480.9MB]
- 雷婷《梦里蓝天HQⅡ》 2023头版限量编号低速原抓[WAV+CUE][463M]
- 群星《2024好听新歌42》AI调整音效【WAV分轨】
- 王思雨-《思念陪着鸿雁飞》WAV
- 王思雨《喜马拉雅HQ》头版限量编号[WAV+CUE]
- 李健《无时无刻》[WAV+CUE][590M]
- 陈奕迅《酝酿》[WAV分轨][502M]
- 卓依婷《化蝶》2CD[WAV+CUE][1.1G]
- 群星《吉他王(黑胶CD)》[WAV+CUE]
- 齐秦《穿乐(穿越)》[WAV+CUE]
- 发烧珍品《数位CD音响测试-动向效果(九)》【WAV+CUE】
- 邝美云《邝美云精装歌集》[DSF][1.6G]
- 吕方《爱一回伤一回》[WAV+CUE][454M]