前言:最近在作公司的一個後臺管理系統項目,前端是用React的Ant Design Pro 2.0 ,能夠開箱即用,底層使用了dva和umi代替了redux和umi,使用起來更方便了。javascript
第一次用Ant Design Pro,這裏爲進一步學習作一個梳理便於本身和你們翻閱(O(∩_∩)O~css
1、項目準備html
$ git clone --depth=1 https://github.com/ant-design/ant-design-pro.git my-project
$ cd my-project
├── config # umi 配置,包含路由,構建等配置
├── mock # 本地模擬數據
├── public
│ └── favicon.png # Favicon
├── src
│ ├── assets # 本地靜態資源
│ ├── components # 業務通用組件
│ ├── e2e # 集成測試用例
│ ├── layouts # 通用佈局
│ ├── models # 全局 dva model
│ ├── pages # 業務頁面入口和經常使用模板
│ ├── services # 後臺接口服務
│ ├── utils # 工具庫
│ ├── locales # 國際化資源
│ ├── global.less # 全局樣式
│ └── global.js # 全局 JS
├── tests # 測試工具
├── README.md
└── package.json
$ npm install
$ npm start
啓動完成:會自動打開瀏覽器訪問 http://localhost:8000前端
2、佈局java
config/router.config.js
下module.exports = [{
path: '/',
component: '../layouts/BasicLayout', // 指定如下頁面的佈局
routes: [
// dashboard
{ path: '/', redirect: '/dashboard/analysis' },
{
path: '/dashboard',
name: 'dashboard',
icon: 'dashboard',
routes: [
{ path: '/dashboard/analysis', name: 'analysis', component: './Dashboard/Analysis' },
{ path: '/dashboard/monitor', name: 'monitor', component: './Dashboard/Monitor' },
{ path: '/dashboard/workplace', name: 'workplace', component: './Dashboard/Workplace' },
],
},
],
}]
router.config.js
擴展了一些關於 pro 全局菜單的配置
{
name: 'dashboard', //當前路由在菜單和麪包屑中的名稱,國際化配置的key
icon: 'dashboard', //當前路由在菜單下的圖標名
hideInMenu: true, //當前路由在菜單中不展示,默認 false
hideChildrenInMenu: true, //當前路由的子級在菜單中不展示,默認 false
hideInBreadcrumb: true, //當前路由在麪包屑中不展示,默認 false
authority: ['admin'], //容許展現的權限,不設則均可見
}
Grid 組件:柵格佈局按比例劃分頁面,具備彈性佈局的特色,能設置間距、支持響應式的比例設置和flex模式 (Grid)react
Layout 組件:輔助頁面框架級別的佈局設計,只須要填空就能夠開發規範專業的頁面總體佈局(Layout)git
注意:一般會把抽象出來的佈局組件,放到跟 pages
、 components
平行的 layouts
文件夾中方便管理 es6
3、路由和菜單 github
router.config.js
中配置路由router.config.js
來統一管理router.config.js
生成,具體邏輯在 src/models/menu.js
中的 formatter
方法實現。BasicLayout
中刪除 SiderMenu
組件的掛載。並在 src/layouts/BasicLayout
中設置 const MenuData = []
。PageHeaderWrapper
實現,MenuContext
將 根據 MenuData
生成的 breadcrumbNameMap
經過 props 傳遞給了 PageHeader。
breadcrumbNameMap
來解決。{
path: '/dashboard/:page',
hideInMenu:true,
name: 'analysis',
component: './Dashboard/Analysis',
},
import router from 'umi/router';
router.push('/dashboard/anyParams')
//or
import Link from 'umi/link';
<Link to="/dashboard/anyParams">go</Link>
在路由組件中,能夠經過this.props.match.params
來得到路由參數
4、新增頁面和業務組件
src/pages
下新建頁面的 js 及 less 文件,多個頁面能夠新建文件夾放置http://localhost:8000/#/new 便可看到新增頁面
src/models
src/services
中創建相應的 model 和 servicesrc/components
下新建一個以組件名命名的文件夾,注意首字母大寫,命名儘可能體現組件的功能
5、樣式
Less: Ant Design Pro 默認使用 less 做爲樣式語言
CSS Modules: 模塊化引入css文件
// example.js
import styles from './example.less';
export default ({ title }) => <div className={styles.title}>{title}</div>;
// example.less
.title {
color: @heading-color;
font-weight: 600;
margin-bottom: 16px;
}
js 文件的改變就是在設置 className 時,用一個對象屬性取代了原來的字符串,屬性名跟 less 文件中對應的類名相同,對象從 less 文件中引入
.title只會在本文件中生效,要定義全局樣式,使用:global
/* 定義全局樣式 */
:global(.text) {
font-size: 16px;
}
/* 定義多個全局樣式 */
:global {
.footer {
color: #ccc;
}
.sider {
background: #ebebeb;
}
}
樣式文件類別
全局樣式文件(由於 antd 會自帶一些全局設置,如字號,顏色,行高等,因此這裏只須要關注本身的個性化需求便可,不用進行大量的 reset)
src/utils/utils.less:工具函數供調用,如.clearfox清除浮動
src/layouts/BasicLayout.less: 基本佈局樣式(如項目須要使用其餘佈局,也建議將佈局相關的 js 和 less 放在這裏
src/layouts
)
src/routes/Dashborad/Monitor.less:具體頁面相關的樣式,裏面的內容僅和本頁面的內容相關
組件級樣式:重複使用的組件,其相關的樣式也應該提煉出來放在組件中,而不是混淆在頁面裏
style={{ ... }}
覆蓋組件樣式
被覆蓋的類名必須放到
:global
中,此時覆蓋是全局性的
爲了防止對其餘 同類 組件形成影響,因此須要包裹額外的 className 限制樣式的生效範圍
6、和服務端進行交互
namespace:model 的命名空間,只能用字符串。一個大型應用可能包含多個 model,經過namespace區分。
state:當前 model 狀態的初始值,表示當前狀態。
reducers:用於處理同步操做,能夠修改 state,由 action 觸發。reducer 是一個純函數,它接受當前的 state 及一個數據體(payload)做爲入參,返回一個新的 state。
effects:用於處理異步操做(例如:與服務端交互)和業務邏輯,也是由 action 觸發。可是,它不能夠修改 state,要經過觸發 action 調用 reducer 實現對 state 的間接操做。
action:是 reducers 及 effects 的觸發器,通常是一個對象,形如{ type: ‘add’, payload: todo },經過 type 屬性能夠匹配到具體某個 reducer 或者 effect,payload 屬性則是數據體,用於傳送給 reducer 或 effect。
在根目錄下新建mock文件夾
新建 mock/xxx.js
// 代碼中會兼容本地 service mock 以及部署站點的靜態數據
export default {
// 支持值爲 Object 和 Array
// GET POST 可省略
'POST /api/register': (req, res) => {
res.send({ status: 'ok', currentAuthority: 'user' });
}
}
mock文件夾在umi中,會自動引入使用,能夠新建多個mock文件。會根據請求路徑對應攔截
代理請求:跨域問題
config/config.js
添加
proxy: {
'/login': {
target: 'http://192.168.1.106:9099', //代理請求的服務器地址
changeOrigin: true,
pathRewrite: { '^/login/': '' }
},
}
7、構建和發佈
npm run build
browserHistory
和 hashHistory
能夠在 config/config.js
中配置選擇用哪一種方式:
export default {
history: 'hash', // 默認是 browser
}
index.html,在來回刷新路由後,請求正常內容能夠正常顯示
8、學習推薦
參考資料
注:轉載請註明出處