ConfigProvider全局化配置 - 图1

ConfigProvider 全局化配置

为组件提供统一的全局化配置。

使用

ConfigProvider 使用 Vue 的 provide / inject 特性,只需在应用外围包裹一次即可全局生效。

  1. <template>
  2. <a-config-provider :getPopupContainer="getPopupContainer">
  3. <app />
  4. </a-config-provider>
  5. </template>
  6. <script>
  7. export default {
  8. methods: {
  9. getPopupContainer(el, dialogContext) {
  10. if (dialogContext) {
  11. return dialogContext.getDialogWrap();
  12. } else {
  13. return document.body;
  14. }
  15. },
  16. },
  17. };
  18. </script>

Content Security Policy

部分组件为了支持波纹效果,使用了动态样式。如果开启了 Content Security Policy (CSP),你可以通过 csp 属性来进行配置:

  1. <a-config-provider :csp="{ nonce: 'YourNonceCode' }">
  2. <a-button>My Button</a-button>
  3. </a-config-provider>

代码演示

ConfigProvider全局化配置 - 图2

ConfigProvider全局化配置 - 图3

国际化

此处列出 Ant Design Vue 中需要国际化支持的组件,你可以在演示里切换语言。

  1. <template>
  2. <div class="change-locale">
  3. <span style="margin-right: 16px">Change locale of components:</span>
  4. <a-radio-group v-model:value="locale">
  5. <a-radio-button key="en" :value="enUS.locale">English</a-radio-button>
  6. <a-radio-button key="cn" :value="zhCN.locale">中文</a-radio-button>
  7. </a-radio-group>
  8. </div>
  9. <a-config-provider :locale="locale === 'en' ? enUS : zhCN">
  10. <div class="locale-components">
  11. <div class="example">
  12. <a-pagination :total="50" show-size-changer />
  13. </div>
  14. <div class="example">
  15. <a-select show-search style="width: 200px">
  16. <a-select-option value="jack">jack</a-select-option>
  17. <a-select-option value="lucy">lucy</a-select-option>
  18. </a-select>
  19. <a-date-picker />
  20. <a-time-picker />
  21. <a-range-picker style="width: 200px" />
  22. </div>
  23. <div class="example">
  24. <a-button type="primary" @click="visible = true">Show Modal</a-button>
  25. <a-button @click="info">Show info</a-button>
  26. <a-button @click="confirm">Show confirm</a-button>
  27. <a-popconfirm title="Question?">
  28. <a href="#">Click to confirm</a>
  29. </a-popconfirm>
  30. </div>
  31. <div class="example">
  32. <a-transfer :data-source="[]" show-search :target-keys="[]" :render="item => item.title" />
  33. </div>
  34. <div style="width: 319px; border: 1px solid #d9d9d9; border-radius: 4px">
  35. <a-calendar :fullscreen="false" :value="moment()" />
  36. </div>
  37. <div class="example">
  38. <a-table :data-source="[]" :columns="columns" />
  39. </div>
  40. <a-modal v-model:visible="visible" title="Locale Modal">
  41. <p>Locale Modal</p>
  42. </a-modal>
  43. </div>
  44. </a-config-provider>
  45. </template>
  46. <script>
  47. import { Modal } from 'ant-design-vue';
  48. import enUS from 'ant-design-vue/es/locale/en_US';
  49. import zhCN from 'ant-design-vue/es/locale/zh_CN';
  50. import moment from 'moment';
  51. import 'moment/dist/locale/zh-cn';
  52. import { defineComponent, ref, watch } from 'vue';
  53. moment.locale('en');
  54. const columns = [
  55. {
  56. title: 'Name',
  57. dataIndex: 'name',
  58. filters: [
  59. {
  60. text: 'filter1',
  61. value: 'filter1',
  62. },
  63. ],
  64. },
  65. {
  66. title: 'Age',
  67. dataIndex: 'age',
  68. },
  69. ];
  70. export default defineComponent({
  71. setup() {
  72. const visible = ref(false);
  73. const locale = ref(enUS.locale);
  74. watch(locale, val => {
  75. moment.locale(val);
  76. });
  77. const info = () => {
  78. Modal.info({
  79. title: 'some info',
  80. content: 'some info',
  81. });
  82. };
  83. const confirm = () => {
  84. Modal.confirm({
  85. title: 'some info',
  86. content: 'some info',
  87. });
  88. };
  89. return {
  90. columns,
  91. visible,
  92. locale,
  93. moment,
  94. enUS,
  95. zhCN,
  96. info,
  97. confirm,
  98. };
  99. },
  100. });
  101. </script>
  102. <style scoped>
  103. .locale-components {
  104. border-top: 1px solid #d9d9d9;
  105. padding-top: 16px;
  106. }
  107. .example {
  108. margin: 16px 0;
  109. }
  110. .example > * {
  111. margin-right: 8px;
  112. }
  113. .change-locale {
  114. margin-bottom: 16px;
  115. }
  116. </style>

API

参数说明类型默认值版本
autoInsertSpaceInButton设置为 false 时,移除按钮中 2 个汉字之间的空格booleantrue
csp设置 Content Security Policy 配置{ nonce: string }-
renderEmpty自定义组件空状态。参考 空状态slot-scope | Function(componentName: string): VNode-
getPopupContainer弹出框(Select, Tooltip, Menu 等等)渲染父节点,默认渲染到 body 上。Function(triggerNode, dialogContext)() => document.body
locale语言包配置,语言包可到 ant-design-vue/es/locale 目录下寻找object-1.5.0
pageHeader统一设置 pageHeader 的 ghost,参考 pageHeader{ ghost: boolean }‘true’1.5.0
transformCellTextTable 数据渲染前可以再次改变,一般用户空数据的默认配置Function({ text, column, record, index }) => any-1.5.4 |

FAQ

为什么我使用了 ConfigProvider locale,时间类组件的国际化还有问题?

请检查是否设置了 moment.locale('zh-cn'),或者是否有两个版本的 moment 共存。 如果你使用 Vite 作为构建工具,因 Vite 尚不完善,你需要在你的项目中额外执行 npm i --save moment 进行安装。

配置 getPopupContainer 导致 Modal 报错?

当如下全局设置 getPopupContainer 为触发节点的 parentNode 时,由于 Modal 的用法不存在 triggerNode,这样会导致 triggerNode is undefined 的报错,需要增加一个判断条件。

  1. <ConfigProvider
  2. - getPopupContainer={triggerNode => triggerNode.parentNode}
  3. + getPopupContainer={node => {
  4. + if (node) {
  5. + return node.parentNode;
  6. + }
  7. + return document.body;
  8. + }}
  9. >
  10. <App />
  11. </ConfigProvider>