pro-components 介绍
ProComponents 是基于 Ant Design 而开发的模板组件,提供了更高级别的抽象支持,开箱即用。可以显著的提升制作 CRUD 页面的效率,更加专注于页面。
- ProLayout 解决布局的问题,提供开箱即用的菜单和面包屑功能
- ProTable 表格模板组件,抽象网络请求和表格格式化
- ProForm 表单模板组件,预设常见布局和行为
- ProCard 提供卡片切分以及栅格布局能力
- ProDescriptions 定义列表模板组件,ProTable 的配套组件
- ProSkeleton 页面级别的骨架屏
ProTable 自定义列原理
查看源码得通过三个字段{"show":true,"fixed":"left","order":0}控制自定义列,即show控制显示与否,fixed控制左右固定,order控制字段显示顺序,核心代码位置如下
踩坑
- less import no support webpack alias '~' ,具体如下
报错原因:由于procomponents基于umi开发,而umi内置的构建工具为webpack,暂时未完全兼容vite等ESM构建工具,因此无法识别
解决方法:修改config文件,移除*.less中的@import ~ 前置符号
参考链接:github.com/ant-design/…
export default defineConfig({
// ...
resolve: {
alias: [
{ find: /^~/, replacement: '' }
],
}
});
- ProTable 使用columnsState之后,只要persistenceType给了值,页面就无限渲染了,具体如下
persistenceType API介绍
报错原因:大概率为procomponents和vite版本问题
解决方法:一种取巧的解决方式如下,不使用persistenceType,通过onChange控制缓存,因为persistenceType API 内部源码也为同样操作,后续也可通过onChange更好的控制其他需求,如重置、排序等
columnsState={{
//列设置-操作
value: columnsStateMap, //列状态的值,支持受控模式
onChange: handleOnChangeColumn, //列状态的值发生改变之后触发
}}
const columnsStore =
JSON.parse(localStorage.getItem("columnsManagement")) || {};
const [columnsStateMap, setColumnsStateMap] = useState(columnsStore);
const handleOnChangeColumn = (val) => {
localStorage.setItem("columnsManagement", JSON.stringify(val));
setColumnsStateMap(val);
};
- 排序显示英文问题,具体如下
报错原因:大概率为procomponents、vite版本或者moment配置的问题
解决方法:直接配置中文显示,注意locale为普通antd组件具备的api,protable文档未标注,但是也能使用。 或者直接自定义protable的国际化相关配置
locale={{
cancelSort: "点击取消排序",
triggerDesc: "点击降序",
triggerAsc: "点击升序",
}}
options={{
fullScreen: false,
reload: false,
setting: {
checkedReset: false,
extra: [
// eslint-disable-next-line jsx-a11y/anchor-is-valid
<a key="confirm" onClick={resetColumns}>
重置
</a>,
],
children: <Button>自定义列</Button>,
},
density: false,
}}
注意事项:
由于ProComponents功能全面且强大,导致内部包高耦合,如ProTable就依赖了其他ProComponents,如下所示
这样造成了打包文件很大,虽然可以压缩文件,但是需要打包 压缩时间较长,如下所示
我们可以通过在config.ts中配置externals来解决,externals通过 排除某些 import 的包(package)打包到bundle中,而在运行时(runtime)再去从外部获取扩展依赖,可以大幅度提高打包效率,而外部依赖可以通过cdn引入提高加载速度,如下所示为umi配置:
webpack.config.js配置添加,注意大小写:
如何得知第三方包对应的key,value是啥,key是package.json中安装的包名,value时包真实注册或者说暴露的全局变量的值,比如@ant-design/pro-table的value是ProTable,打开ProTable的源码,格式化可以看到如下,注册的值是ProTable,且依赖了React、ReactDOM、antd、moment;其他包同样思路
externals: {
react: 'window.React',
'react-dom': 'window.ReactDOM',
antd: 'window.antd',
'@ant-design/pro-table': 'window.ProTable',
},
index.html 添加,注意库的版本:
unpkg 国内访问速度比cdn.jsdelivr快
<script src="https://unpkg.com/react@17.0.2/umd/react.production.min.js"></script>
<script src="https://unpkg.com/react-dom@17.0.2/umd/react-dom.production.min.js"></script>
<link
rel="stylesheet"
href="https://unpkg.com/antd@4.24.8/dist/antd.min.css"
/>
<script src="https://unpkg.com/antd@4.24.8/dist/antd.min.js"></script>
<link
rel="stylesheet"
href="https://unpkg.com/@ant-design/pro-table@2.78.3/dist/table.min.css"
/>
<script src="https://unpkg.com/@ant-design/pro-table@2.78.3/dist/table.min.js"></script>
<script
src="https://cdn.jsdelivr.net/npm/react@17.0.2/umd/react.production.min.js"
integrity="sha256-Ipu/TQ50iCCVZBUsZyNJfxrDk0E2yhaEIz0vqI+kFG8="
crossorigin="anonymous"
></script>
<script
src="https://cdn.jsdelivr.net/npm/react-dom@17.0.2/umd/react-dom.production.min.js"
integrity="sha256-nbMykgB6tsOFJ7OdVmPpdqMFVk4ZsqWocT6issAPUF0="
crossorigin="anonymous"
></script>
<link
rel="stylesheet"
href="https://cdn.jsdelivr.net/npm/antd@4.24.8/dist/antd.min.css"
integrity="sha256-driOVzl4rOtE7ngEgzJC6QLX2A3AQ4kSF40Gaek+iWo="
crossorigin="anonymous"
/>
<script
src="https://cdn.jsdelivr.net/npm/antd@4.24.8/dist/antd.min.js"
integrity="sha256-P0q+yT4XkoVRKbINPeb++LzYtZuNRjASPFTug+QnSs8="
crossorigin="anonymous"
></script>
<link
rel="stylesheet"
href="https://cdn.jsdelivr.net/npm/@ant-design/pro-table@2.78.3/dist/table.min.css"
integrity="sha256-xqFhCjASaUakXEsCs8VbsRe26MPvYGUAw19O9DlWljc="
crossorigin="anonymous"
/>
<script
src="https://cdn.jsdelivr.net/npm/@ant-design/pro-table@2.78.3/dist/table.min.js"
integrity="sha256-kkzD6iK42o/yrDiupbLzUChaygUMYyOwyVrhtrIsdNE="
crossorigin="anonymous"
></script>
目前测试结果,webpack项目配置externals后打包的dist文件可以正常运行,但是vite项目仍然存在一定的问题。所以如果项目使用的是umi、webpack构建工具,可以尝试使用ProComponents,Vite项目如果不考虑打包时长 也可以谨慎使用,目前ProComponents对Vite的兼容性不太友好,感兴趣的可以关注github,期待后续版本更新。
参考链接如下:
webpack.docschina.org/configurati…
juejin.cn/post/700113…
github.com/ant-design/…