wangzhibo
2026-07-16 b57020623cf0c946706573bf102e548c3a544423
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
<template>
    <div class="scope">
        <div class="h">
            <el-tag size="small" effect="dark" disable-transitions>search</el-tag>
            <span>表头搜索</span>
        </div>
 
        <div class="c">
            <el-button @click="open">预览</el-button>
            <demo-code :files="['table/search.vue']" />
 
            <!-- 自定义表格组件 -->
            <cl-dialog v-model="visible" title="表头搜索" width="80%">
                <cl-crud ref="Crud">
                    <cl-row>
                        <cl-table ref="Table" />
                    </cl-row>
 
                    <cl-row>
                        <cl-flex1 />
                        <cl-pagination />
                    </cl-row>
                </cl-crud>
            </cl-dialog>
        </div>
 
        <div class="f">
            <span class="date">2024-01-01</span>
        </div>
    </div>
</template>
 
<script setup lang="tsx">
import { useCrud, useTable } from '@cool-vue/crud';
import { ref } from 'vue';
import { useDict } from '/$/dict';
import { Plus } from '@element-plus/icons-vue';
 
const { dict } = useDict();
 
// cl-crud 配置
const Crud = useCrud(
    {
        service: 'test'
    },
    app => {
        app.refresh();
    }
);
 
// cl-table 配置
const Table = useTable({
    autoHeight: false,
    contextMenu: ['refresh'],
 
    columns: [
        {
            label: '姓名',
            prop: 'name',
            minWidth: 140,
 
            //【很重要】搜索参数配置
            search: {
                isInput: false, // 默认false,是否输入框模式
                value: '', // 默认值
                refreshOnChange: true, // 默认false,搜索时刷新数据,service 的 page 接口请求参数为 { page: 1, [绑定的prop]: 输入值 }
                // 自定义渲染组件
                component: {
                    name: 'el-input',
                    props: {
                        placeholder: '搜索姓名'
                    }
                }
            }
        },
        {
            label: '手机号',
            prop: 'phone',
            minWidth: 140,
 
            //【很重要】搜索参数配置
            search: {
                // 是否显示搜索图标
                icon: () => <Plus />,
 
                // 自定义渲染组件
                component: {
                    name: 'el-input',
                    props: {
                        placeholder: '搜索手机号',
 
                        // 自定义 change 事件
                        onChange(val) {
                            Crud.value?.refresh({
                                page: 1,
                                phone: val
                            });
                        }
                    }
                }
            }
        },
        {
            label: '工作',
            prop: 'occupation',
            dict: dict.get('occupation'),
            minWidth: 140,
 
            //【很重要】搜索参数配置
            search: {
                // 是否显示搜索图标
                icon: () => <cl-svg name="icon-app" size={14} />,
                // 自定义渲染组件
                component: {
                    name: 'cl-select',
                    props: {
                        placeholder: '搜索工作',
                        options: dict.get('occupation')
                    }
                }
            }
        },
        {
            label: '创建时间',
            prop: 'createTime',
            minWidth: 170,
            sortable: 'desc'
        }
    ]
});
 
const visible = ref(false);
 
function open() {
    visible.value = true;
}
</script>