一、antd按需加载原理
在使用Ant Design时,我们往往需要将整个Ant Design样式全部引入,但实际上我们很多时候只会用到其中的几个组件和样式。为了避免不必要的网络请求,我们可以按需加载Ant Design组件和样式。
具体实现原理是:通过babel-plugin-import插件,将每个组件的引入路径用按需加载的方式,来实现组件和样式的按需加载。当我们需要使用某个组件或样式时,babel-plugin-import就会根据需要自动加载相应的组件和样式。
下面是一个代码示例:
{
"plugins": [
[
"import",
{
"libraryName": "antd",
"style": true // 引入样式文件
}
]
]
}
二、antd按需加载设置
对于create-react-app的用户,可以在config-overrides.js文件中添加相关配置即可实现antd按需加载。首选需要安装 babel-plugin-import:
npm install babel-plugin-import --save-dev
然后在config-overrides.js文件中添加以下代码:
const { override, fixBabelImports } = require('customize-cra');
module.exports = override(
fixBabelImports('antd', {
libraryDirectory: 'es',
style: 'css',
}),
);
其中es表示使用ES6模块化引入组件,而css表示使用css文件引入样式。
三、antd按需加载不使用本身css
我们在使用antd按需加载时,可以设置不使用Ant Design自带的样式,而是使用我们自定义的样式。
在webpack的配置文件中,可以通过less变量覆盖来实现。下面是示例代码:
const lessToJS = require('less-vars-to-js');
const fs = require('fs');
const path = require('path');
const themeVariables = lessToJS(fs.readFileSync(path.resolve(__dirname, './src/styles/antd.less'), 'utf8'));
module.exports = {
loader: 'less-loader',
options: {
lessOptions: {
modifyVars: themeVariables,
javascriptEnabled: true,
},
},
};
其中我们需要先安装less和less-vars-to-js插件。
当然,我们也可以通过覆盖antd的less变量来达到自定义样式的效果。下面是示例代码:
// 将指定的antd主题less变量覆盖为自定义样式
@primary-color: #f00;
四、antd滚动加载
在Ant Design中,滚动加载可以通过使用react-infinite-scroller插件来实现:
import React from 'react';
import InfiniteScroll from 'react-infinite-scroller';
class Demo extends React.Component {
constructor(props) {
super(props);
this.state = {
items: [],
hasMore: true,
};
}
loadMore = (page) => {
fetch('/api/data?page=' + page)
.then(res => res.json())
.then(data => {
this.setState({
items: this.state.items.concat(data.results),
hasMore: data.results.length === 10,
});
});
}
render() {
return (
<InfiniteScroll
pageStart={0}
loadMore={this.loadMore}
hasMore={this.state.hasMore}
loader={
Loading ...
}
>
{this.state.items.map(item => (
<div className="item" key={item.id}>{item.title}