項目github地址:https://github.com/replaceroot/React-manageSystemjavascript
補充:調用setState以後會並列調用should update,will update,did update生命週期函數css
Babel插件的做用:解析E6達到兼容效果java
yarn add react-router-dom axios --dev
yarn add antd
yarn add react-app-rewired customize-cra
修改`package.json`配置文件的`scripts`字段react
"scripts": { "start": "react-app-rewired start", "build": "react-app-rewired build", "test": "react-app-rewired test", "eject": "react-scripts eject" }
而後在項目根目錄建立一個 config-overrides.js
用於修改默認配置。webpack
module.exports = function override(config, env) { // do stuff with the webpack config... return config; };
babel-plugin-import 是一個用於按需加載組件代碼和樣式的 babel 插件(原理),如今咱們嘗試安裝它並修改 config-overrides.js
文件。git
yarn add babel-plugin-import
+ const { override, fixBabelImports } = require('customize-cra'); - module.exports = function override(config, env) { - // do stuff with the webpack config... - return config; - }; + module.exports = override( + fixBabelImports('import', { + libraryName: 'antd', + libraryDirectory: 'es', + style: 'css', + }), + );
記錄一個小坑:github
若是遇到錯誤,將 react-scripts添加到dev依賴中。web
yarn add react-scripts --dev
若是遇到找不到babel模塊的錯誤,就將整個 modules刪除,而後從新yarn install安裝一下就能解決。json
從新運行項目,此時就能正常顯示Button按鈕了。
import React from "react"; import Child from "./Child"; import { Button } from 'antd'; import "./index.less"; export default class Life extends React.Component { state = { count: 0 }; handleAdd = () => { this.setState({ count: this.state.count + 1 }); }; render(){ return ( <div className="demo"> <input type="text" placeholder="請輸入內容..."/> <Button onClick={this.handleAdd}>點擊一下</Button> <p>{this.state.count}</p> {/* 給子組件傳參 */} <Child name={this.state.count}></Child> </div> ) } }
可是有一個問題,就是咱們配置的less沒有生效,下面解決Less和按鈕主題顏色問題。
yarn add less less-loader
按照 配置主題 的要求,自定義主題須要用到 less 變量覆蓋功能。咱們能夠引入 customize-cra
中提供的 less 相關的函數 addLessLoader 來幫助加載 less 樣式,同時修改 config-overrides.js
文件以下。
- const { override, fixBabelImports } = require('customize-cra'); + const { override, fixBabelImports, addLessLoader } = require('customize-cra'); module.exports = override( fixBabelImports('import', { libraryName: 'antd', libraryDirectory: 'es', - style: 'css', + style: true, }), + addLessLoader({ + javascriptEnabled: true, + modifyVars: { '@primary-color': '#1DA57A' }, + }), );
修改後重啓 yarn start
,若是看到一個綠色的按鈕就說明配置成功了。
到這裏, 基本的環境算是搭建好了,坑是真的多,也只能本身摸索,百度、Google查文檔,作記錄總結。
具體代碼參考個人github的commit代碼
佈局使用的柵格系統:https://ant.design/components/grid-cn/
左側菜單渲染:https://ant.design/components/menu-cn/
具體實現能夠參考我github上的源碼和官網給出的demo的源碼進行對比就知道我如何使用的。
重點就是動態渲染的代碼
import React from "react"; import { Menu, Icon, Divider } from "antd"; import menuConfig from "../../config/menuConfig"; import "./index.less"; const { SubMenu } = Menu; export default class NavLeft extends React.Component { // 加載時的生命週期函數 componentWillMount() { const menuTreeNode = this.renderMenu(menuConfig); this.setState({ menuTreeNode }); } // 菜單動態渲染 renderMenu = data => { return data.map(item=>{ // 若是item中還有子項,那麼就把子項遞歸遍歷渲染到頁面 if(item.children){ return ( <SubMenu title={item.title} key={item.key}> {this.renderMenu(item.children)} </SubMenu> ); } return <Menu.Item title={item.title} key={item.key}>{item.title}</Menu.Item> }) }; render() { return ( <div> <div className="logo"> <img src="assets/logo-ant.svg" alt="" /> <h1>木子單車管理系統</h1> </div> <Menu theme="dark">{this.state.menuTreeNode}</Menu> </div> ); } }
這個部分須要發送跨域請求百度天氣的API來獲取數據渲染,須要安裝一個JsonP。
yarn add jsonp
這裏部分須要使用jsonp封裝一個axios來發送跨域請求,這裏涉及了jsonp使用和ES6中promise的使用方法,若是忘記了這些技術,趕忙翻下之前的筆記,百度看下博客吧。
簡單的jsonp demo
getjsonp(){ // jsonp能發起跨域請求 this.$http.jsonp('http://127.0.0.1:3003/getlist') .then((res) => { console.log(res) },(err) => { console.log(err) }) }
// 封裝axios發送跨域請求 import JsonP from 'jsonp' export default class Axios { /* 這裏使用static關鍵字聲明瞭一個靜態方法,實例不能直接調用,只能經過類來調用 */ static jsonp(options){ // 成功就是resolve,失敗就是reject return new Promise((resolve, reject)=>{ JsonP(options.url, { params: 'callback' }, function(err, response){ if(response.status === 'success'){ resolve(response) }else { reject(response.message); } }) }) } }
/* 封裝一個格式化時間戳的方法 */ export default { formateDate(time) { // 若是爲空就返回空字符串 if (!time) return ""; let date = new Date(time); return ( date.getFullYear() + "-" + (date.getMonth() + 1) + "-" + date.getDate() + " " + date.getHours() + ":" + date.getMinutes() + ":" + date.getSeconds() ); } };
增長小箭頭樣式
/* 實現小箭頭 */ &:after{ position: absolute; content: ''; left: 110px; top:39px; border-top: 9px solid @colorM; border-left: 12px solid transparent; border-right: 12px solid transparent; }
到此爲止首頁就編寫完成了,之後會根據課程的目錄來更新React路由相關的知識,其餘業務功能的實現。
總結一下:不少都是基礎知識,稍微難一點的就是Promise、jsonp、還有初期的環境搭建遇到的幾個坑,幾乎沒有太難的知識點,結構和flex佈局相關的內容就是一個熟練度的問題,代碼量上去了,看到一個效果就知道要怎麼實現,多敲多練多思考就完事了。