創建項目:
npx create-react-app demo cd demo npm start
引入antd:
yarn add antd
import React from "react";
import Button from "antd/es/button";
import "antd/dist/antd.css";
function App() {
return (
<div className="App">
app
<Button type="primary">btn</Button>
</div>
);
}
export default App;
// ps:此時使用antd組件時的方式較麻煩且樣式全部引入增加代碼量,推薦按需引入的方式
引入antd按需加載時的配置:
首先安裝插件:
yarn add react-app-rewired customize-cra babel-plugin-import
其次添加配置項文件config-overrides.js:
const { override, fixBabelImports } = require("customize-cra");
module.exports = override(
fixBabelImports("import", {
libraryName: "antd",
libraryDirectory: "es",
style: "css",
})
);
然后修改package.json文件中的啟動命令scripts:
{
"name": "demo-react",
"version": "0.1.0",
"private": true,
"dependencies": {
"@testing-library/jest-dom": "^4.2.4",
"@testing-library/react": "^9.3.2",
"@testing-library/user-event": "^7.1.2",
"antd": "^4.4.3",
"babel-plugin-import": "^1.13.0",
"customize-cra": "^1.0.0",
"react": "^16.13.1",
"react-app-rewired": "^2.1.6",
"react-dom": "^16.13.1",
"react-scripts": "3.4.1"
},
"scripts": {
"start": "react-app-rewired start",
"build": "react-app-rewired build",
"test": "react-app-rewired test",
"eject": "react-app-rewired eject"
},
"eslintConfig": {
"extends": "react-app"
},
"browserslist": {
"production": [
">0.2%",
"not dead",
"not op_mini all"
],
"development": [
"last 1 chrome version",
"last 1 firefox version",
"last 1 safari version"
]
}
}
最后按需引入antd中的組件,無需再單獨引入樣式文件,App.js:
import React from "react";
// import Button from "antd/es/button";
// import "antd/dist/antd.css";
import { Button } from "antd";
function App() {
return (
<div className="App">
app
<Button type="primary">btn</Button>
</div>
);
}
export default App;
antd自定義主題:需要用到less變量,可引入customize-cra中提供的less相關函數addLessLoader來幫助加載less樣式,同時修改config-overrides.js文件:
安裝less-loader:
yarn add less less-loader@5.0.0
修改配置文件config-overrides.js文件:
const { override, fixBabelImports, addLessLoader } = require("customize-cra");
module.exports = override(
fixBabelImports("import", {
libraryName: "antd",
libraryDirectory: "es",
style: true,
}),
addLessLoader({
javascriptEnabled: true,
modifyVars: { "@primary-color": "red" },
})
);
高階組件-HOC:參數為組件,返回值為新組件的函數
const foo = (Cmp) => {
return (props) => {
return (
<div className="border">
<Cmp {...props} />
</div>
);
};
};
// 雙箭頭函數等價於上面的雙return函數
const foo = (Cmp) => (props) => {
return (
<div className="border">
<Cmp {...props} />
</div>
);
};
// 高階組件及鏈式調用:
import React, { Component } from "react";
// HOC 是個函數,接收一個組件,返回一個新的組件
function Child(props) {
return <div>child</div>;
}
// Cmp這里是function或class組件 雙箭頭函數
const foo = (Cmp) => (props) => {
return (
<div className="border">
<Cmp {...props} />
</div>
);
};
const foo2 = (Cmp) => (props) => {
return (
<div className="border1">
<Cmp {...props} />
</div>
);
};
const Foo = foo2(foo(foo(Child)));
export default class HocPage extends Component {
render() {
return (
<div>
<h3>HocPage</h3>
<Foo />
</div>
);
}
}
裝飾器:
安裝裝飾器:
npm install -D @babel/plugin-proposal-decorators
更新config-overrides.js文件:
const { override, fixBabelImports, addLessLoader,addDecoratorsLegacy } = require("customize-cra");
module.exports = override(
// antd按需加載配置
fixBabelImports("import", {
libraryName: "antd",
libraryDirectory: "es",
style: true,
}),
// 主題樣式配置
addLessLoader({
javascriptEnabled: true,
modifyVars: { "@primary-color": "red" },
}),
addDecoratorsLegacy() // 配置裝飾器
);
文件中的裝飾器寫法:
import React, { Component } from "react";
// HOC 是個函數,接收一個組件,返回一個新的組件
// Cmp這里是function或class組件 雙箭頭函數
const foo = (Cmp) => (props) => {
return (
<div className="border">
<Cmp {...props} />
</div>
);
};
const foo2 = (Cmp) => (props) => {
return (
<div className="border1">
<Cmp {...props} />
</div>
);
};
@foo
@foo2
@foo
class Child extends Component {
render() {
return <div>child</div>;
}
}
export default class DecoratorsPage extends Component {
render() {
return (
<div>
<h3>DecoratorsPage</h3>
<Child />
</div>
);
}
}
修正:
裝飾器按上述方法之后現在居然報錯了,需要額外多加一些修改:
將項目配置打散,然后在package.json配置文件中的babel屬性追加plugins配置
npm run eject
"babel": { "plugins": [ [ "@babel/plugin-proposal-decorators", { "legacy": true } ] ], "presets": [ "react-app" ] },
參考&感謝各路大神:
https://www.e-learn.cn/topic/3824897

