@xiaohaih/condition-el-plus
TypeScript icon, indicating that this package has built-in type declarations

0.6.0 • Public • Published

基于 element-plus 实现的条件搜索, 校验组件(条件之间相互依赖)

在线demo

在线demo(备份)

使用示例(条件形式)
<template>
    <HWrapper
        :datum="conditions"
        :backfill="query"
        @search="log('搜索事件', $event)"
        @reset="log('重置事件', $event)"
    ></HWrapper>
</template>

<script lang="ts">
import { HWrapper, defineCondition } from '@xiaohaih/condition-plus';

const conditions = () =>
    defineCondition({
        name: { t: 'input', placeholder: '名称搜索' },
        address: { t: 'input', placeholder: '地址搜索' },
    });

export default {
    components: {
        HWrapper,
    },
    data: () =({
        conditions: conditions(),
        query: { name: '名称存在默认值' },
        log: console.log,
    }),
};
</script>
使用示例(表单形式)
<template>
    <div>
        <HWrapper
            ref="formRef"
            :datum="formCondition"
            :rules="rules"
            :backfill="query"
            :render-btn="false"
            :realtime="true"
            @search="query = $event"
        ></HWrapper>
        <div style="min-height: 50px; line-height: 50px">{{ query }}</div>
        <ElButton @click="validate">校验</ElButton>
        <ElButton @click="validateField">逐个校验</ElButton>
        <ElButton @click="clearValidate">清空校验</ElButton>
    </div>
</template>

<script lang="ts">
import { ref } from 'vue';
import { HWrapper, defineCondition } from '@xiaohaih/condition-plus';

const conditions = () =>
    defineCondition({
        name: { t: 'input', placeholder: '名称搜索' },
        address: { t: 'input', placeholder: '地址搜索' },
    });

export default {
    components: {
        HWrapper,
    },
    setup(props, ctx) {
        const formRef = ref<InstanceType<typeof HWrapper>>();
        const query = ref<Record<string, any>>({
            // 设置默认值
            input1: '1',
            // input2: '2',
            // select1: '1',
            // select2: '22',
            // cas1: 'aa',
            // cas2: 'cas2AA1',
            // datepikcer1: '2024-03-24',
            // datepikcer2: ['2024-03-24', '2024-03-28'],
            // check1: ['check1'],
            // check2: ['che1'],
            // radio1: 'radio1',
            // radio2: 'rad1',
        });
        const formCondition = defineCondition({
            input1: {
                t: 'input',
                label: 'input1',
                placeholder: '哈哈哈',
            },
            input2: {
                t: 'input',
                label: 'input2222',
                placeholder: '666',
                rules: [{ required: true, message: '必填项' }],
            },
            select1: {
                t: 'select',
                label: 'sel1',
                placeholder: '哈哈哈',
                options: [
                    { label: '第一', value: '1' },
                    { label: '第二', value: '2' },
                    { label: '第三', value: '3' },
                ],
            },
            select2: {
                t: 'select',
                label: 'sel2',
                placeholder: 'test',
                labelKey: 'dictLabel',
                valueKey: 'dictValue',
                options: [],
                getOptions(cb) {
                    setTimeout(() => {
                        cb([
                            { dictLabel: '第一一', dictValue: '11' },
                            { dictLabel: '第二二', dictValue: '22' },
                            { dictLabel: '第三三', dictValue: '33' },
                        ]);
                    }, 1000);
                },
                rules: [{ required: true, message: '必填项' }],
            },
            datepikcer1: {
                t: 'datepicker',
                label: 'date1',
                placeholder: 'fff',
                format: 'MM-DD',
                valueFormat: 'YYYY-MM-DD',
            },
            date11: {
                t: 'datepicker',
                type: 'daterange',
                label: 'date2',
                fields: ['date11', 'date22'],
                placeholder: '999',
                startPlaceholder: '',
                endPlaceholder: '',
                rules: [{ required: true, message: '必填项' }],
            },
            cas1: {
                t: 'cascader',
                label: 'cas1',
                placeholder: 'fff',
                fields: ['cas1', 'cas1_1'],
                props: { checkStrictly: true },
                options: [
                    {
                        label: 'aa',
                        value: 'aa',
                        children: [
                            { label: 'AA1', value: 'AA1' },
                            { label: 'AA2', value: 'AA2' },
                        ],
                    },
                    {
                        label: 'bb',
                        value: 'bb',
                        children: [
                            { label: 'BB1', value: 'BB1' },
                            { label: 'BB2', value: 'BB2' },
                        ],
                    },
                ],
            },
            cas2: {
                t: 'cascader',
                type: 'daterange',
                label: 'cas2',
                placeholder: '999',
                rules: [{ required: true, message: '必填项' }],
                getOptions(cb) {
                    cb([
                        {
                            label: 'cas2aa',
                            value: 'cas2aa',
                            children: [
                                { label: 'cas2AA1', value: 'cas2AA1' },
                                { label: 'cas2AA2', value: 'cas2AA2' },
                            ],
                        },
                        {
                            label: 'cas2bb',
                            value: 'cas2bb',
                            children: [
                                { label: 'cas2BB1', value: 'cas2BB1' },
                                { label: 'cas2BB2', value: 'cas2BB2' },
                            ],
                        },
                    ]);
                },
            },
            check1: {
                t: 'checkbox',
                label: 'check1',
                placeholder: 'ddd',
                type: 'button',
                options: [
                    { label: 'check1', value: 'check1' },
                    { label: 'check2', value: 'check2' },
                ],
            },
            check2: {
                t: 'checkbox',
                label: 'check2',
                placeholder: 'ddd',
                rules: [{ required: true, message: '必填项' }],
                getOptions(cb) {
                    setTimeout(() => {
                        cb([
                            { label: 'che1', value: 'che1' },
                            { label: 'che2', value: 'che2' },
                        ]);
                    }, 1000);
                },
            },
            radio1: {
                t: 'radio',
                label: 'radio1',
                placeholder: 'ddd',
                type: 'button',
                options: [
                    { label: 'radio1', value: 'radio1' },
                    { label: 'radio2', value: 'radio2' },
                ],
            },
            radio2: {
                t: 'radio',
                label: 'radio2-cancelable',
                placeholder: 'ddd',
                rules: [{ required: true, message: '必填项' }],
                cancelable: true,
                getOptions(cb) {
                    setTimeout(() => {
                        cb([
                            { label: 'rad1', value: 'rad1' },
                            { label: 'rad2', value: 'rad2' },
                        ]);
                    }, 1000);
                },
            },
        });
        const rules = {
            input1: [{ required: true, message: 'formRules' }],
            input2: [
                {
                    validator: (rule: any, val: string, cb: (arg?: any) => void) =>
                        val !== '123' ? cb('not 123 from formRules') : cb(),
                    message: 'not 123 from formRules',
                },
            ],
            select1: [{ required: true, message: 'select form FormRules' }],
            datepikcer1: [{ required: true, message: 'datepicker form FormRules' }],
            cas1: [{ required: true, message: 'cascader form FormRules' }],
            check1: [{ required: true, message: 'check form FormRules' }],
            radio1: [{ required: true, message: 'radio form FormRules' }],
        };
        const keys = Object.keys(forms);
        let idx = 0;
        function validate() {
            formRef.value?.formRef?.validate();
        }
        function validateField() {
            clearValidate();
            formRef.value?.formRef?.validateField(keys[idx % keys.length]);
            idx = (idx + 1) % keys.length;
        }
        function clearValidate() {
            formRef.value?.formRef?.clearValidate();
        }

        return {
            formRef,
            query,
            formCondition,
            rules,
            validate,
            validateField,
            clearValidate,
        };
    },
};
</script>
  • TODO
    • 文件上传
    • 虚拟列表下拉框
容器Props

tips: 支持 element-plus.Form 所有 props(model 属性除外)

属性名 是否必填 类型 描述 默认值
datum object 条件数据源 -
sortable boolean 是否开启排序 false
realtime boolean 是否实时触发搜索事件(值发生改变时) -
backfill object 回填信息(使条件内部值与该对象的值保持一致) -
toast (msg: string) => void 校验失败时产生的提示(与属性 validator 配合使用) -
searchAtDatumChanged boolean 是否在数据源发生改变后触发搜索事件 -
resetToInitialValue boolean 重置时是否置为初始值 -
immediateSearch boolean 初始是否触发搜索事件来返回当前的 query -
renderBtn boolean 是否渲染搜索重置按钮 true
resetTriggerSearch boolean 重置时触发搜索事件 -
searchText string 搜索按钮文字 搜索
resetText string 重置按钮文字 重置
rules object|object[] Form.rules props -
公共属性

tips: 支持element-ui.FormItem 所有 props

属性名 是否必填 类型 描述 默认值
label string formItem.label 属性 -
rules object|object[] formItem.rules 属性 -
postfix VNode | string | Function 条件间的分隔符 -
emptyValue string 值为空时提交的值 undefined
resetToInitialValue string 重置时是否置为初始值 false
disabled boolean | (obj: { query: object, backfill: object }) =boolean 是否禁用该条件 -
hide boolean | (obj: { query: object, backfill: object }) =boolean 是否隐藏该条件 -
validator (query: object) =string | Promise<string| void 校验该属性是否合格(不合格应返回字符串) -
defaultValue string | string[] | (query: object, backfill?: object) =string | string[] 默认值 -
depend boolean 是否依赖其它字段 -
dependFields string | string[] 依赖的字段集合 -
conditionSortIndex boolean 当前条件排序下标 -

input.props

tips: 支持 element-plus.input 所有 props

属性名 是否必填 类型 描述 默认值
realtime boolean 是否实时触发搜索事件(当 wrapper.realtimetrue 时, 可将该值设为 false 并设置抖动时间) true
waitTime number 实时触发事件的防抖动时长 300
clearable boolean 是否可清空 true
slotPrefix VNode | (option: { query, backfill, search, insideSearch }) => VNode input.prefix插槽(search 触发外部搜索, insideSearch 触发内部搜索) -
slotSuffix VNode | (option: { query, backfill, search, insideSearch }) => VNode input.suffix插槽 -
slotPrepend VNode | (option: { query, backfill, search, insideSearch }) => VNode input.prepend插槽 -
slotAppend VNode | (option: { query, backfill, search, insideSearch }) => VNode input.append插槽 -

select.props

tips: 支持 element-plus.select 所有 props

属性名 是否必填 类型 描述 默认值
labelKey string 选项的标签 label
valueKey string 选项的值 value
options any[] 数据源 -
getOptions (cb: (data: any[], query: object) =void) =void 异步设置数据源 -
filterable boolean 是否可筛选 true
filterMethod (val: string, item: 选项值) =boolean 自定义筛选逻辑 -
clearable boolean 是否可清空 true

datepicker.props

tips: 支持 element-plus.datePicker 所有 props

属性名 是否必填 类型 描述 默认值
valueFormat string 日期格式 YYYY-MM-DD
fields string[] | [begin: number, end: number] 日期范围选择时对应多个字段时使用 -
clearable boolean 是否可清空 true

cascader.props

tips: 支持 element-plus.cascader 所有 props

注意: 当 cascader 是单选时 cascader.props.emitPath 默认为 false, 此处与官方文档表现不一致

属性名 是否必填 类型 描述 默认值
valueKey string 选项的值 value
childrenKey string 子级 key children
emitPath boolean 是否以数组格式返回的值 -
options any[] 数据源 -
getOptions (cb: (data: any[], query: object) =void) =void 异步设置数据源 -
fields string[] 不同层级对应不同的字段 -
filterable boolean 是否可筛选 true
filterMethod (val: string, item: 选项值) =boolean 自定义筛选逻辑 -
clearable boolean 是否可清空 true

radio.props

tips: 支持 element-plus.radioGroup 所有 props

属性名 是否必填 类型 描述 默认值
valueKey string 选项的值 value
labelKey string 选项的文本内容 label
type radio | button 单选框类型 radio
cancelable boolean 是否可取消 -
options any[] 数据源 -
getOptions (cb: (data: any[], query: object) =void) =void 异步设置数据源 -

checkbox.props

tips: 支持 element-plus.checkbox 所有 props

属性名 是否必填 类型 描述 默认值
valueKey string 选项的值 value
labelKey string 选项的文本内容 label
type checkbox | button 单选框类型 checkbox
options any[] 数据源 -
getOptions (cb: (data: any[], query: object) =void) =void 异步设置数据源 -
fields string[] 不同层级对应不同的字段 -

color-picker.props

tips: 支持 element-plus.color-picker 所有 props

input-number.props

tips: 支持 element-plus.input-number 所有 props

属性名 是否必填 类型 描述 默认值
realtime boolean 是否实时触发搜索事件(当 wrapper.realtimetrue 时, 可将该值设为 false 并设置抖动时间) true
waitTime number 实时触发事件的防抖动时长 300
slotIncreaseIcon VNode input-number.increase-icon插槽 -
slotDecreaseIcon VNode input-number.decrease-icon插槽 -

rate.props

tips: 支持 element-plus.rate 所有 props

slider.props

tips: 支持 element-plus.slider 所有 props

switch.props

tips: 支持 element-plus.switch 所有 props

time-picker.props

tips: 支持 element-plus.time-picker 所有 props

属性名 是否必填 类型 描述 默认值
fields string[] 不同下标对应不同的字段 -
valueFormat string 时间格式 HH:mm:ss

time-select.props

tips: 支持 element-plus.time-select 所有 props

Package Sidebar

Install

npm i @xiaohaih/condition-el-plus

Weekly Downloads

9

Version

0.6.0

License

MIT

Unpacked Size

147 kB

Total Files

51

Last publish

Collaborators

  • xiaohaih