了解到很多 RD 在开发项目的过程中(尤其是管理平台)需要同时支持前后端的开发。大部分后端同学平时都是在处理数据,由于技术不同,做前端经常会对后端大牛们造成活多或少的困扰。再加上前端技术的演变,react和vue的使用,更增加了学习的成本。之前整理了一个后端如何启动一个(管理平台)前端项目。希望能帮助大家从0到1的搭建一个管理平台的前端部分。
下面我们就以 antd pro 为基础,讲一下 antd pro 的操作,顺便了解一下 react 的书写方式。
备注:需要新了解的前端概念
node环境 (建议使用nvm来管理安装node)
安装nvm
curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.8/install.sh | bash 复制代码
关联全局变量
touch ~/.bash_profile 复制代码
安装node
nvm install 10.4.0 复制代码
查看是否安装成功
node --version 复制代码
概述:umi中集成了pro.ant.design的安装方式,可以通过以下命令安装react的环境
官网: pro.ant.design/docs/gettin…
mkdir first-fe-demo npm create umi 复制代码
注意:所有操作此项目的同学在拿到项目的第一步都需要安装依赖文件,安装一遍即可
安装依赖文件
npm install 复制代码
启动项目
npm run start 复制代码
config: 配置项
src:代码书写位置
全部模板继承于 src/layouts/BasicLayout.jsx,想改变框架样式,修改此文件 红色框内的内容是上面文件所定义。
重点有四个:state/setState/props/生命周期 (记得这四个,react就可以用了)
每个新项目都可以复制这个文件作为开始(建议复制后面的,后面对此文档有增加) 在 src/page/ 新建文件夹 demo,并创建两个文件:index.js、style.less
/* index.js */
import React, { Component } from 'react';
import { connect } from 'dva';
// 继承全局模板
import { PageHeaderWrapper } from '@ant-design/pro-layout';
import styles from './style.less';
class Index extends Component {
// 声明组件,放置state属性
constructor(props) {
super(props);
this.state = {
show: 'hello world',
}
}
// 生命周期部分,常用componentDidMount,详见https://www.jianshu.com/p/46022f1cbbb3
componentDidMount() {
this.addRd();
}
// 函数声明部分,备注 (a,b,c) => {} 的意义是 function(a,b,c) {}
addRd = () => {
setTimeout(() => {
this.setState({
show: 'hello RDs',
}, alert('success'));
}, 2000);
}
// 页面渲染
render() {
return (
<div className={styles.red}>
{this.state.show}
</div>
);
}
}
export default connect()(Index);
复制代码
路由配置位置:config/config.js 文件
路由文件会配合左侧列表进行布局,也可以层层深入,类似左侧的子菜单。
类似上图一样,我们配置好箭头指向的新路径(copy welcome)保存后,打开 http://localhost:8000/welcome2
备注:端口默认会选择8000,如果发现机器有8000占用,项目运行的时候会自动指定新端口并通知我们,可能是8001或其它,请查看启动完毕时输出的log信息。
项目正常运行(后续有改动不需要重新启动,项目提供了热更新功能)
启动后端服务
在config/proxy.js中配置后端服务地址,配置方式类似nginx,注意后端配置cros跨域开放。
如图,例如我们本地3000端口下启动了web服务,并编写了/api/test接口。前端项目需要将/api的所有请求打到3000端口的web项目上。
使用前端地址直接访问接口,如:localhost:8000/api/test,应该正常返回后端接口内容。
开始代码联调,在前面的demo页面加入代码,同时需要关注下面两点:
/* index.js */
import React, { Component } from 'react';
import { connect } from 'dva';
import { PageHeaderWrapper } from '@ant-design/pro-layout';
// 引入 request(请求接口方法)
import request from '@/utils/request';
import styles from './style.less';
class Index extends Component {
// 声明组件,放置state属性
constructor(props) {
super(props);
this.state = {
show: 'hello world',
}
}
// 生命周期部分,常用componentDidMount,详见 https://www.jianshu.com/p/46022f1cbbb3
componentDidMount() {
// this.addRd();
// 【新加】页面加载完成后,请求需要的数据
this.getData();
}
// 函数声明部分
addRd () {
setTimeout(() => {
this.setState({
show: 'hello RDs',
}, () => {alert('success')});
}, 2000);
}
// 【新加】请求后端服务,返回数据
getData = () => {
request('/api/test?mount=1', {
method: 'GET',
data: {
mount: 1,
},
}).then((res) => {
this.setState({show: res.data});
});
}
render() {
return (
<div className={styles.red}>
{this.state.show}
</div>
);
}
}
export default connect()(Index);
复制代码
查看 src/layouts/SecurityLayout.jsx
在componentDidMount方法中,书写请求登录方法;首先后端项目中需要添加是否登录接口,可以通过校验是否登录,从而选择进入功能页,还是去跳转到登录页面登录;
引入request(同5中说明)
写请求login的登录方法,重置登录的state isReady:
componentDidMount() {
request('/api/islogin', {}).then((res) => {
if(res.success) {
this.setState({
isReady: true,
});
} else {
location.href = "";
}
})
}
复制代码
翻阅antd文档,Api文档: ant.design/docs/react/…
选取需要使用的组件,并可以拷贝组件下方的生成代码:
例子:选取 Input 输入框 ant.design/components/…
// 文件头部引入组件
import {Input} from 'antd'
// render方法中添加对应HTML代码
render() {
return (
<div className={styles.red}>
<Input placeholder="Basic usage" />
</div>
)
}
复制代码
添加事件 如何让用户触发组件的交互,肯定离不开事件,下面时react绑定事件的方法。基本的属性都是 on + js原生的事件名(首字母大写)
常用事件属性:onClick,onChange,onInput,onSelect
定义一个事件方法: onClick={() => {return ''}}
render() {
return (
<div className={styles.red}>
{this.state.show}
<Input placeholder="Basic usage" onChange={(e) => {
this.setState({inputText: e.target.value})
}} />
<p>输入内容:{this.state.inputText}</p>
</div>
)
}
复制代码 在项目根目录下执行:
npm run build 复制代码
执行结果:
同时,在打包结束后,项目的根目录下会多一个 ./dist 文件夹,这里存的时编译后的前端文件。
将 dist 文件夹部署到服务器上,则项目全部完成。
** 参考:与 java 项目一起上线