前端技术学习记录:react+dvajs+ant design实现暴走计算器的页面重构(一)

  • 前言
  • 现在的效果
  • 安装 dva-cli
  • 创建新应用
  • 预览项目
  • 文件结构简单介绍
  • 使用 antd做页面
  • 定义自己的页面
  • 定义路由
  • 开始编写导航栏
  • 使用Layout等进行简单布局
  • LOGO和个人图标的加入
  • 新增事件读取当前选择菜单

前言

生命不停,学习不止。
最近在业余时间看了些react的视频和文档,本文作为本次学习后练习的一个DEMO,以此文章做记录。
因为我是一个做后端的,对前端的知识并不是那么的熟悉,所以可能存在一些设计不合理,可优化的问题,欢迎指正。
本次Demo基于我一年前玩过的一款游戏,部分玩家对其开发的【暴走英雄坛计算器】,本次只练习前端,后端接口就仍然调用其原本的接口。

现在的效果

【暴走英雄坛计算器H5】

安装 dva-cli

默认你们电脑安装了node,打开cmd命令。
通过 npm 全局安装 dva-cli 并确保版本是 0.9.1 或以上。我的是0.10.1。

$ npm install dva-cli -g
$ dva -v
dva-cli version 0.9.1

创建新应用

安装完 dva-cli 之后,就可以在命令行里访问到 dva 命令了。
首先我们新建一个文件夹作为工作空间。
然后通过 dva new 创建我们本次的应用,我就取名baozouApp吧。

$ dva new baozouApp

创建成功:

预览项目

创建好baozou爱趴趴之后,进入项目路径,通过npm启动项目

$ cd baozouApp
$ npm start

启动成功:
访问http://localhost:8000/#/可以看到默认页面:

文件结构简单介绍

我这里用的是WebStorm,也可以使用别的开发工具。打开项目初始化目录如下。

使用 antd做页面

在WebStorm中打开Terminal面板,在这里执行命令,为了方便不在cmd命令行执行了。

$ npm install antd babel-plugin-import --save

安装完成:
编辑 .webpackrc,使 babel-plugin-import 插件生效。

{"extraBabelPlugins": [["import", { "libraryName": "antd", "libraryDirectory": "es", "style": "css" }]]
}

定义自己的页面

删除初始化项目时components、models、routes、services这几个文件夹下的文件,在routes文件夹下新建一个页面BzMain.js。

import React from 'react';const BzMain = (props) => (<h2>欢迎来到:BzMain</h2>
);export default BzMain;

定义路由

路由可以想象成是组成应用的不同页面。
编辑router.js,将项目的默认加载页面改成BzMain。

import React from 'react';
import { Router, Route, Switch } from 'dva/router';
import BzMain from './routes/BzMain';function RouterConfig({ history }) {return (<Router history={history}><Switch><Route path="/" exact component={BzMain} /></Switch></Router>);
}export default RouterConfig;

然后在浏览器里打开 http://localhost:8000/#/,看看页面是否加载成功。

开始编写导航栏

安装ant的图标库

npm install --save @ant-design/icons

在之前的暴走计算器页面可以看到,导航栏是页面跳转中一直存在的,所以我们可以把他做成无状态组件,而不是页面。
在components文件夹下,新建BzMenu.js。

import React from 'react';
import {Menu} from 'antd';
import {AppstoreOutlined} from '@ant-design/icons';const BzMenu = () => {return (<Menu  mode="horizontal"><Menu.Item key="1" icon={<AppstoreOutlined/>}>真元</Menu.Item><Menu.Item key="2" icon={<AppstoreOutlined/>}>基础</Menu.Item><Menu.Item key="3" icon={<AppstoreOutlined/>}>装备</Menu.Item><Menu.Item key="4" icon={<AppstoreOutlined/>}>藏经阁</Menu.Item><Menu.Item key="5" icon={<AppstoreOutlined/>}>NPC查找</Menu.Item></Menu>);
};export default BzMenu;

在BzMain.js中引入BzMenu.js。

import React from 'react';
import BzMenu from '../components/BzMenu';const BzMain = (props) => (<BzMenu/>
);export default BzMain;

此时效果如下:

优化BzMenu,现在是很多重复代码,每个导航的标签都是Menu.Item,我们改成从数据读取,循环生成导航菜单,代码如下:

import React from 'react';
import {Menu} from 'antd';
import {AppstoreOutlined} from '@ant-design/icons';const BzMenu = () => {const list = [{key: '1',data: '真元',},{key: '2',data: '基础',},{key: '3',data: '装备',},{key: '4',data: '藏经阁',},{key: '5',data: 'NPC查找',},];return (<Menu mode="horizontal" defaultSelectedKeys={['1']}>{list.map((item) => {return (<Menu.Item key={item.key} icon={<AppstoreOutlined/>}>{item.data}</Menu.Item>);})}</Menu>);
};export default BzMenu;

此时的效果:

看着代码好像是多了,其实不然,这样数据更容易管理,实际开发中也可以查询后台动态生成菜单,做到不同角色能按需加载,以便看到不同的菜单。

使用Layout等进行简单布局

ant design提供了一些布局供我们使用,这里使用Layout做布局,Header是头部:把我们的顶部导航菜单放进去,Content是主体内容:之后切换菜单的时候主要是修改此处的内容,Footer是底部:一般在这里注明一下版权之类的信息。
另外,在routes下新建BzMain.js的样式文件BzMain.less,简单的编写一下样式,在BzMain.js中引入。
BzMain.js代码如下:

import React from 'react';
import BzMenu from '../components/BzMenu';
import {Layout} from 'antd';
import style from './BzMain.less';const {Header, Content, Footer} = Layout;
const BzMain = (props) => {return (<Layout><Header className={style.header}><BzMenu/></Header><Content className={style.content}><div className={style.contentBackground}>Content</div></Content><Footer className={style.footer}>BaoZouApp ©2020 Created by 泡泡糖</Footer></Layout>)
};export default BzMain;

BzMain.less如下:

.header{padding: 0 calc(~"(100vm - 768px)/(2048 - 768) * 50");background: white;width: 100%;position: fixed;z-index: 1;
}
.content{padding: 0 calc(~"(100vm - 768px)/(2048   - 768) * 50");margin-top: 70px;
}.footer{text-align: center;
}
.contentBackground {min-height:calc(~"100vh - 140px");padding: 24px;background: white;
}

效果如下:

less文件预编译样式有个好处,可以用calc做自适应布局,在加上antd本身组件也有响应式设计,这样f12切换到手机页面预览,效果也还好,想用手机打开也不会乱:

LOGO和个人图标的加入

在导航栏的组件中加入暴走英雄坛官方网站的logo和个人信息的图片,同样分为三部分,为了使用响应式布局,引入Row和Col,lg用于大屏幕,sm用于中屏幕,xs用于小屏幕。
BzMenu.js代码如下:

import React from 'react';
import {Col, Menu, Row} from 'antd';
import {AppstoreOutlined, UserOutlined} from '@ant-design/icons';const BzMenu = () => {const list = [{key: '1',data: '真元',},{key: '2',data: '基础',},{key: '3',data: '装备',},{key: '4',data: '藏经阁',},{key: '5',data: 'NPC查找',},];return (<Row><Col sm={{ span: 4, offset: 2, order: 1 }} xs={{ span: 12, offset: 2, order: 1 }}><img src={"http://bz.fy-game.com/state/img/common/header/logo.png"} alt={""} style={{height: "45px"}}/></Col><Col sm={{ span: 16, order: 2 }} xs={{ span: 24, order: 3 }}><Menu mode="horizontal" defaultSelectedKeys={['1']}>{list.map((item) => {return (<Menu.Item key={item.key} icon={<AppstoreOutlined/>} style={item.style}>{item.data}</Menu.Item>);})}</Menu></Col><Col sm={{ span: 1, offset: 1, order: 3 }} xs={{ span: 2, offset: 6, order: 2 }}><UserOutlined/></Col></Row>);
};export default BzMenu;

电脑网页效果:

手机浏览器效果:

但是有一点,导航栏太长,后面的被隐藏了,我们想让他在手机上也能全部显示出来。
同样新建一个与BzMenu.js同级的BzMenu.less,用了写BzMenu.less的样式,然后在BzMenu.js中引入。同样用calc来写表达式,根据宽度计算每个导航栏相关的属性:
BzMenu.js:

import React from 'react';
import {Col, Menu, Row} from 'antd';
import {AppstoreOutlined, UserOutlined} from '@ant-design/icons';
import style from './BzMenu.less';const BzMenu = () => {const list = [{key: '1',data: '真元',},{key: '2',data: '基础',},{key: '3',data: '装备',},{key: '4',data: '藏经阁',},{key: '5',data: 'NPC查找',},];return (<Row><Col sm={{ span: 4, offset: 2, order: 1 }} xs={{ span: 12, offset: 2, order: 1 }}><img src={"http://bz.fy-game.com/state/img/common/header/logo.png"} alt={""} className={style.img}/></Col><Col sm={{ span: 16, order: 2 }} xs={{ span: 24, order: 3 }}><Menu mode="horizontal" defaultSelectedKeys={['1']} className={style.menu}>{list.map((item) => {return (<Menu.Item key={item.key} icon={<AppstoreOutlined/>} className={style.item}>{item.data}</Menu.Item>);})}</Menu></Col><Col sm={{ span: 1, offset: 1, order: 3 }} xs={{ span: 2, offset: 6, order: 2 }}><UserOutlined/></Col></Row>);
};export default BzMenu;

BzMenu.less:

:global {.ant-menu-item {.anticon-appstore {margin-right: calc(~"100vw / 50 - 6px");}}
}
.item {padding: 0 calc(~"100vw / 50 - 2px");
}
.menu {padding-left: calc(~"100vw / 5 - 60px");
}
.img {height: 40px;
}

因为:global中的样式不会被less文件生成哈希值,所以可以用来覆盖ant的默认样式。
电脑效果:

手机效果:

新增事件读取当前选择菜单

这里设及到父组件与子组件的相互传值,我们在父组件定义方法,传递到子组件中,子组件在切换菜单时调用父组件的方法,传值当前下标,父组件方法中打印当前下标。
父组件增加方法:

...function handleMenuSelect(id) {console.log(id);}
...

并传递至子组件

...
<BzMenu onMenuSelect={handleMenuSelect}/>
...

子组件接收参数

...
const BzMenu = ({onMenuSelect}) => {
...

并且调用

...
<Menu mode="horizontal" defaultSelectedKeys={['1']} className={style.menu} onSelect={(value) => onMenuSelect(value.key)}>
...

f12,观察console面板是否在导航切换时,正确打印,效果如下:

今天就练习到这吧,明天再写。

前端技术学习记录:react+dvajs+ant design实现暴走计算器的页面重构(一)相关推荐

  1. 前端技术学习记录:react+dvajs+ant design实现暴走计算器的页面重构(二)

    前端技术学习记录:react+dvajs+ant design实现暴走计算器的页面重构(二) 前言 定义 Model connect 起来 更新state 拥抱变化 主题切换 更换页面 获取当前设备类 ...

  2. 2015.12.08-2015.12.11 硕士毕业大论文 前端技术学习

    毕业大论文:本周完成第二章:异步电机故障诊断机理分析 第二章 基于HHT的电机故障特征提取 前端技术学习:完成书本 第10章 DOM 12.08 异步电机故障诊断机理分析&DOM10.1.1 ...

  3. 第一周前端web学习记录

    第一周前端web学习记录 #什么是HTML.CSS? 如何写代码以及在哪里写 vs code 的基本使用方法 浏览器 网站开发 HTML 的结构基础和属性 创建标签 嵌套 HTML标签 设置属性 HT ...

  4. 前端技术学习:语义化

    前端技术学习 一.语义化 1. 为什么要使用语义化 2. 语义化标签 (1)容器标签 artical section div (2)关于页面的标签 nav aside header main foot ...

  5. Web前端技术学习路线图 初阶+中阶+高阶

    一.报告名称 前端技术学习路线图 二.作者 阿里前端委员会:孟令君 | 舒文亮 | 许智燕 | 赵兴越 | 王忆天 | 吴天豪 | 潘佳 | 包续兵 | 张伟 | 王卓 | 金擘 | 周祺 | 张舒迪 ...

  6. 基于React、Ant Design的ButtonGroup组件

    目录 介绍 使用方式 安装 使用 API Props children 介绍 本组件基于React.Ant Design,适用于React + Ant Design项目 本组件设计为超过一定数量的按钮 ...

  7. Ant Design 编写登录和注册页面

    Ant Design编写登录和注册页面 前言 一.登录 1.index.tsx页面 2.index.module.less 二,注册 1.index.tsx 2.index.module.less 总 ...

  8. 三维荧光平行因子学习记录--(三)使用DOMfluor工具箱进行平行因子分析--(二)

    三维荧光平行因子学习记录–(三)使用DOMfluor工具箱进行平行因子分析–(二) 注 本文仅作为自己的学习记录以备以后复习查阅 本文的参考文献: 本文的参考博客链接: https://zhuanla ...

  9. 2019腾讯前端技术大会 - 记录与思考

    2019年第三界腾讯前端技术大会,第一次参加这个大会,作为一个技术人,感觉还是有收获的,在此以博客的形式记录一下参会的点点滴滴以及个人思考 大会概况 时间:2019/11/16 9:00~18:00 ...

最新文章

  1. (shell脚本编程)linux如何利用脚本执行多条命令以及linux如何执行定时任务
  2. Swoole 1.8.12 发布,Bug修复版本
  3. .NET (C#) Internals: ASP.NET 应用程序与页面生命周期——吴秦(Tyler)
  4. hdfs mv命令_如何HDFS mv命令工作
  5. 微信小程序---setData
  6. RabbitMQ一个简单可靠的方案(.Net Core实现)
  7. 面试精讲之面试考点及大厂真题 - 分布式专栏 09 缓存必问:Reids持久化,高可用集群
  8. 使用System Center Essentials 2007查看计算机的软件清单
  9. 一份最新的、全面的NLP文本分类综述
  10. JAVAweb JSP飞机订票系统航空机票预订销售系统(机票预订系统)
  11. 联想台式电脑序列号查看方法
  12. 广东查出2190名裸官
  13. python opencv4.0 提取alpha 通道
  14. python统计(二)假设检验
  15. Git 版本回退方法
  16. 粗略的了解Javascript
  17. Flutter设置App的应用名字和应用logo图标的方法(android ios web)
  18. ValueError: only single character unicode strings can be converted to Py_UCS4, got length 0
  19. PHP 调用百度人脸检测
  20. 看一眼就会马上收藏的宝藏设计网站

热门文章

  1. OK-CC天天呼叫中心系统,外呼中心安装后如何使用
  2. 基于.net 6 Orleans Dapr 的 开发框架:Phenix Framework 7
  3. Windows 桌面点击右键反应慢的解决办法
  4. vbox 安装linux64,在Virtualbox下安装Lubuntu 18.04 64位教程
  5. 计算机主板桥烧坏了怎么办,电脑主板桥坏了导致关机吗?
  6. css中文本指什么,CSS中的文本属性
  7. js 正则是否包含某些字符串_js判断字符串中是否包含某个字符串
  8. 关于Navicat 报错1251连接不成功Mysql
  9. CCF NOI1054. 扫雷游戏 (C++)
  10. .php转为可执行文件,编译器构造 – 将PHP脚本转换为独立的Windows可执行文件