Skip to content

ProComponentProvider

全局组件默认配置提供者,通过 componentVars 统一设置所有 Pro 组件的默认属性,避免在每处重复传入相同的 Props。

介绍

ProComponentProvider 利用 Vue 的 provide/inject 机制向下提供全局默认配置。子组件会将全局配置与局部 Props 深度合并,局部 Props 优先级更高。

示例

vue
<script setup lang="ts">
import { ProComponentProvider } from '@qin-ui/antdv-next-pro';

const componentVars = {
  // ProForm 全局默认配置
  'pro-form': {
    grid: { gutter: 24 },
    labelCol: { span: 6 },
    wrapperCol: { span: 18 },
  },
  // ProForm 每个字段的 FormItem 默认配置
  'pro-form-item': {
    validateFirst: true,
    span: 6,
  },
  // ProTable 全局默认配置
  'pro-table': {
    addIndexColumn: true,
    immediateSearch: true,
    bordered: true,
    pagination: { showTotal: total => `共 ${total} 条`, showSizeChanger: true },
  },
  // 全局 Input 默认配置
  input: { allowClear: true, maxlength: 200 },
  // 全局 Select 默认配置
  select: { allowClear: true, placeholder: '请选择' },
  // 全局 DatePicker 默认配置
  'date-picker': { style: { width: '100%' }, format: 'YYYY-MM-DD' },
};
</script>

<template>
  <ProComponentProvider :component-vars="componentVars">
    <RouterView />
  </ProComponentProvider>
</template>

API

Props

属性类型说明
componentVarsComponentVars各组件的默认 Props 配置(见下方支持的 key)
componentMapComponentMap注册新增自定义组件,或覆盖内置原生组件

ComponentVars 支持的 key

Key对应组件类型说明
pro-tableProTableTableProps + { control, searchFormConfig, immediateSearch, addIndexColumn, tableContainer }
pro-formProFormFormProps(排除 formgrid)+ { grid: GridProps }
pro-form-item每个字段的 FormItem + GridItemFormItemProps + GridItemPropsspanxs~xxl)+ { formItemContainer }
inputInputComponentProps<typeof Input> + Base 组件公共属性
textareaTextAreaComponentProps<typeof TextArea> + Base
input-passwordInputPasswordComponentProps<typeof InputPassword> + Base
input-searchInputSearchComponentProps<typeof InputSearch> + Base
input-numberInputNumberComponentProps<typeof InputNumber> + Base
input-otpInputOTPComponentProps<typeof InputOTP> + Base
auto-completeAutoCompleteComponentProps<typeof AutoComplete> + Base
selectSelectComponentProps<typeof Select> + Base
cascaderCascaderComponentProps<typeof Cascader> + Base
date-pickerDatePickerComponentProps<typeof DatePicker> + Base
date-picker.dateDatePicker (date 模式)同上
date-picker.weekDatePicker (week 模式)同上
date-picker.monthDatePicker (month 模式)同上
date-picker.yearDatePicker (year 模式)同上
date-picker.quarterDatePicker (quarter 模式)同上
range-pickerRangePickerComponentProps<typeof RangePicker> + Base
time-pickerTimePickerComponentProps<typeof TimePicker> + Base
time-range-pickerTimeRangePickerComponentProps<typeof TimeRangePicker> + Base
checkbox-groupCheckboxGroupComponentProps<typeof CheckboxGroup> + Base
radio-groupRadioGroupComponentProps<typeof RadioGroup> + Base
switchSwitchComponentProps<typeof Switch> + Base
sliderSliderComponentProps<typeof Slider> + Base
tree-selectTreeSelectComponentProps<typeof TreeSelect> + Base
transferTransferComponentProps<typeof Transfer> + Base

其中 Base 公共属性包含:valueFormattercomponentContainermodelPropcomponentClasscomponentStyle

进阶用法:注册与覆盖组件

ProComponentProvider 除了能够统一下发配置,还可以用于扩展内置表单组件库。借助 componentMap 属性,你可以向作用域内的 ProFormProTable 注入属于你的业务组件,甚至拦截并重写基础组件。

1. 注册新组件

vue
<script setup lang="ts">
import { ProComponentProvider } from '@qin-ui/antdv-next-pro';
import MyCustomUpload from '@/components/MyCustomUpload.vue';

// 注入全新的自定义组件
const customComponents = {
  'custom-upload': MyCustomUpload,
};
</script>

<template>
  <ProComponentProvider :component-map="customComponents">
    <RouterView />
  </ProComponentProvider>
</template>

注册后,作用域内的 ProForm 就可以直接在 Schema 中写 component: 'custom-upload' 进行渲染。
(注:为使 TypeScript 类型完美推断,请结合文档中 TypeScript 类型推导与覆盖 章节进行全局类型声明扩展。)

2. 覆盖默认组件

如果你想给所有的、或者是某个页面域内的 input 增加特定逻辑(如添加全局的 XSS 过滤、或者默认带上某个自定义前缀图标),你可以写一个壳子组件,并直接用它覆盖默认配置

vue
<script setup lang="ts">
import { ProComponentProvider } from '@qin-ui/antdv-next-pro';
import SafeInput from '@/components/SafeInput.vue';

// 直接拦截原生组件
const overrideComponents = {
  input: SafeInput,
};
</script>

<template>
  <ProComponentProvider :component-map="overrideComponents">
    <RouterView />
  </ProComponentProvider>
</template>

此时页面内所有声明为 component: 'input' 的字段,都会静默代理为你编写的 SafeInput 组件。