npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2025 – Pkg Stats / Ryan Hefner

element-advanced-search

v1.0.7

Published

功能强大的 Vue 3 搜索组件,基于 Element Plus 构建

Readme

Element Advanced Search

npm version Vue.js Element Plus NPM Downloads GitHub stars GitHub issues

English | 简体中文

Element Advanced Search 是一个功能强大的 Vue 3 搜索组件,基于 Element Plus 构建,提供了丰富的搜索功能,包括快速搜索、高级筛选、搜索条件缓存、自定义插槽等。本组件及其文档均由通义灵码智能编码助手完成开发与编写,旨在为开发者提供高效、易用的搜索解决方案。查看功能演示

组件截图展示

基础搜索界面

基础搜索界面

搜索结果界面

高级搜索界面

版本历史

有关每个版本的详细变更,请查看 更新日志 | Changelog

目录

功能特性

  • 🚀 快速搜索:提供简单的关键词搜索功能
  • 🎛️ 高级筛选:支持多种表单控件的复杂筛选条件
  • 💾 搜索条件缓存:可将搜索条件保存到 localStorage 中
  • 🧩 自定义插槽:支持完全自定义的表单控件
  • 🏷️ 搜索标签显示:自动显示当前搜索条件的标签
  • 📱 响应式布局:支持多种屏幕尺寸的自适应显示
  • 🌐 远程数据支持:支持远程搜索和异步数据加载
  • 📝 多种表单控件:支持输入框、选择框、日期选择器、数字输入框等多种表单控件
  • ⚙️ Element Plus 属性透传:可通过 elProps 属性为不同组件类型传递特定属性
  • 📍 自定义标签位置:通过 Teleport 功能将搜索标签显示在页面任意位置

依赖说明

本组件依赖以下库:

| 依赖项 | 版本要求 | 说明 | | --- | --- | --- | | Vue.js | ^3.2.0 | Vue 3 框架 | | Element Plus | ^2.0.0 | Element Plus UI 组件库 | | @element-plus/icons-vue | ^2.0.0 | Element Plus 图标库 | | Sass/SCSS | ^1.32.0 | 样式预处理器 |

开发依赖:

{
  "vue": "^3.2.0",
  "element-plus": "^2.0.0",
  "@element-plus/icons-vue": "^2.0.0",
  "sass": "^1.32.0"
}

安装与使用

# 安装组件
npm install element-advanced-search
<template>
  <ElementAdvancedSearch
    v-model="searchParams"
    :search-config="searchConfig"
    cache-key="user-search"
    quick-search-field="keywords"
    @search="handleSearch"
  />
</template>

<script setup>
import { ref } from 'vue'
import ElementAdvancedSearch from 'element-advanced-search'
import 'element-advanced-search/dist/style.css'

const searchParams = ref({})
const searchConfig = {
  itemsPerRow: 2,
  popoverWidth: 800,
  labelWidth: '100px',
  inline: true,
  formItems: [
    // 表单配置项
  ]
}

const handleSearch = (params) => {
  console.log('搜索参数:', params)
  // 执行搜索逻辑
}
</script>

Props

| 属性名 | 类型 | 默认值 | 说明 | | --- | --- | --- | --- | | searchConfig | SearchConfig | 必填 | 搜索配置对象 | | quickSearchField | string | 'keyword' | 快速搜索字段名 | | quickSearchPlaceholder | string | '请输入搜索关键词' | 快速搜索占位符 | | modelValue | Record<string, any> | {} | v-model 绑定值 | | cacheKey | string | '' | 缓存键名,用于区分不同页面的搜索条件 | | teleportTo | string | undefined | 将搜索标签传送到指定CSS选择器位置 |

Events

| 事件名 | 参数 | 说明 | | --- | --- | --- | | search | (value: Record<string, any>) | 搜索事件,返回搜索参数 | | update:modelValue | (value: Record<string, any>) | v-model 更新事件 |

SearchConfig 配置项

基础配置

| 属性名 | 类型 | 默认值 | 说明 | | --- | --- | --- | --- | | itemsPerRow | number | 2 | 每行显示的表单项数量 | | popoverWidth | number | 800 | 高级搜索弹出层宽度 | | labelWidth | string | '100px' | 表单项标签宽度 | | inline | boolean | true | 是否使用内联表单布局 | | formItems | FormItem[] | [] | 表单项配置数组 |

FormItem 配置项

所有表单项都包含以下基础属性:

| 属性名 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | field | string | 是 | 字段名 | | label | string | 是 | 标签名 | | type | string | 否 | 表单控件类型,默认为 'input' | | default | any | 否 | 默认值 | | hidden | boolean | 否 | 是否隐藏该表单项 | | displayValue | Function | 否 | 自定义标签显示函数 | | elProps | Object/Function | 否 | 透传给 Element Plus 组件的属性,可为对象或函数 |

根据不同类型,还有额外的特定属性:

Input 类型 (type: 'input')

文本输入框

| 属性名 | 类型 | 默认值 | 说明 | | --- | --- | --- | --- | | placeholder | string | 请输入${label} | 占位符文本 | | clearable | boolean | true | 是否可清空 |

Textarea 类型 (type: 'textarea')

文本域,支持自动扩展

| 属性名 | 类型 | 默认值 | 说明 | | --- | --- | --- | --- | | shortPlaceholder | string | 请输入${label} | 简短占位符文本 | | longPlaceholder | string | 请输入${label} | 详细占位符文本 | | clearable | boolean | true | 是否可清空 |

Select 类型 (type: 'select')

下拉选择框

| 属性名 | 类型 | 默认值 | 说明 | | --- | --- | --- | --- | | placeholder | string | 请选择${label} | 占位符文本 | | clearable | boolean | true | 是否可清空 | | multiple | boolean | false | 是否多选 | | filterable | boolean | false | 是否可过滤 | | remote | boolean | false | 是否远程搜索 | | remoteMethod | Function | undefined | 远程搜索方法 | | loadOptions | Function | undefined | 异步加载选项方法 | | options | SelectOption[] | [] | 选项列表 |

Treeselect 类型 (type: 'treeselect')

树形选择框

| 属性名 | 类型 | 默认值 | 说明 | | --- | --- | --- | --- | | placeholder | string | 请选择${label} | 占位符文本 | | clearable | boolean | true | 是否可清空 | | multiple | boolean | false | 是否多选 | | showCheckbox | boolean | false | 是否显示复选框 | | maxDropdownHeight | number | 300 | 下拉框最大高度 | | filterable | boolean | false | 是否可过滤 | | nodeKey | string | 'value' | 节点键名 | | props | object | { value: 'value', label: 'label', children: 'children' } | 配置选项 | | options | SelectOption[] | [] | 选项列表 | | remote | boolean | false | 是否远程搜索 | | remoteMethod | Function | undefined | 远程搜索方法 | | loadOptions | Function | undefined | 异步加载选项方法 |

Radio 类型 (type: 'radio')

单选框

| 属性名 | 类型 | 默认值 | 说明 | | --- | --- | --- | --- | | options | SelectOption[] | [] | 选项列表 |

Checkbox 类型 (type: 'checkbox')

复选框

| 属性名 | 类型 | 默认值 | 说明 | | --- | --- | --- | --- | | options | SelectOption[] | [] | 选项列表 |

Date 类型 (type: 'date')

日期选择器

| 属性名 | 类型 | 默认值 | 说明 | | --- | --- | --- | --- | | placeholder | string | 请选择${label} | 占位符文本 | | clearable | boolean | true | 是否可清空 |

Daterange 类型 (type: 'daterange')

日期范围选择器

| 属性名 | 类型 | 默认值 | 说明 | | --- | --- | --- | --- | | startPlaceholder | string | '开始日期' | 开始日期占位符 | | endPlaceholder | string | '结束日期' | 结束日期占位符 | | clearable | boolean | true | 是否可清空 |

Time 类型 (type: 'time')

时间选择器

| 属性名 | 类型 | 默认值 | 说明 | | --- | --- | --- | --- | | placeholder | string | 请选择${label} | 占位符文本 | | clearable | boolean | true | 是否可清空 | | format | string | undefined | 时间格式 |

Timerange 类型 (type: 'timerange')

时间范围选择器

| 属性名 | 类型 | 默认值 | 说明 | | --- | --- | --- | --- | | startPlaceholder | string | '开始时间' | 开始时间占位符 | | endPlaceholder | string | '结束时间' | 结束时间占位符 | | clearable | boolean | true | 是否可清空 | | format | string | undefined | 时间格式 |

Number 类型 (type: 'number')

数字输入框

| 属性名 | 类型 | 默认值 | 说明 | | --- | --- | --- | --- | | min | number | undefined | 最小值 | | max | number | undefined | 最大值 | | placeholder | string | 请输入${label} | 占位符文本 | | controlsPosition | string | 'right' | 控制按钮位置 |

Numberrange 类型 (type: 'numberrange')

数字范围输入框

| 属性名 | 类型 | 默认值 | 说明 | | --- | --- | --- | --- | | min | number | undefined | 最小值 | | max | number | undefined | 最大值 | | minPlaceholder | string | '最小值' | 最小值占位符 | | maxPlaceholder | string | '最大值' | 最大值占位符 | | controlsPosition | string | 'right' | 控制按钮位置 |

Custom 类型 (type: 'custom')

自定义插槽类型

| 属性名 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | slotName | string | 否 | 插槽名称,默认为字段名 | | displayValue | Function | 否 | 自定义标签显示函数 |

SelectOption 配置项

| 属性名 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | label | string | 是 | 选项标签 | | value | any | 是 | 选项值 | | children | SelectOption[] | 否 | 子选项(用于树形结构) |

Slots

自定义表单项插槽

对于 type: 'custom' 的表单项,可以通过指定的插槽名称来自定义表单控件:

<template>
  <ElementAdvancedSearch
    v-model="searchParams"
    :search-config="searchConfig"
  >
    <template #status="{ model, field }">
      <el-switch
        v-model="model[field]"
        active-text="启用"
        inactive-text="禁用"
      />
    </template>
  </ElementAdvancedSearch>
</template>

插槽作用域参数:

  • model: 表单数据对象
  • field: 当前字段名

自定义标签显示

对于 type: 'custom' 的表单项,可以通过 displayValue 函数来自定义搜索标签的显示内容:

const searchConfig = {
  formItems: [
    {
      field: 'status',
      label: '状态',
      type: 'custom',
      slotName: 'status',
      default: false,
      displayValue: (value) => {
        return value ? '启用' : '禁用'
      }
    }
  ]
}

自定义标签显示位置

通过 teleport-to 属性,可以将搜索标签显示在页面的任何位置:

<template>
  <!-- 自定义标签显示区域 -->
  <div id="custom-tags-container">
    <h3>搜索条件</h3>
    <div id="teleport-target"></div>
  </div>

  <!-- 搜索组件 -->
  <ElementAdvancedSearch
    v-model="searchParams"
    :search-config="searchConfig"
    teleport-to="#teleport-target"
    @search="handleSearch"
  />
</template>

当使用 teleport-to 属性时,搜索标签将不会显示在默认位置,而是通过 Vue 3 的 Teleport 功能显示在指定的 DOM 元素中。

用户也可以通过 teleported-search-tags 插槽自定义传送区域的标签显示:

<template>
  <ElementAdvancedSearch
    v-model="searchParams"
    :search-config="searchConfig"
    teleport-to="#teleport-target"
    @search="handleSearch"
  >
    <template #teleported-search-tags="{ tags, removeTag, clearAll }">
      <div class="custom-teleport-tags">
        <span v-for="tag in tags" :key="tag.key" class="tag">
          {{ tag.label }}: {{ tag.value }}
          <button @click="removeTag(tag.key)">×</button>
        </span>
        <button v-if="tags.length" @click="clearAll">清除所有</button>
      </div>
    </template>
  </ElementAdvancedSearch>
</template>

使用示例

基础用法

<template>
  <ElementAdvancedSearch
    v-model="searchParams"
    :search-config="basicSearchConfig"
    @search="handleSearch"
  />
</template>

<script setup>
import { ref } from 'vue'
import ElementAdvancedSearch from 'element-advanced-search'

const searchParams = ref({})

const basicSearchConfig = {
  formItems: [
    {
      field: 'name',
      label: '姓名',
      type: 'input',
      placeholder: '请输入姓名'
    },
    {
      field: 'status',
      label: '状态',
      type: 'select',
      placeholder: '请选择状态',
      options: [
        { label: '启用', value: '0' },
        { label: '禁用', value: '1' }
      ]
    }
  ]
}

const handleSearch = (params) => {
  console.log('搜索参数:', params)
}
</script>

带缓存功能

<template>
  <ElementAdvancedSearch
    v-model="searchParams"
    :search-config="cacheSearchConfig"
    cache-key="user-management"
    quick-search-field="keywords"
    @search="handleSearch"
  >
    <template #status="{ model, field }">
      <el-switch
        v-model="model[field]"
        active-text="启用"
        inactive-text="禁用"
      />
    </template>
  </ElementAdvancedSearch>
</template>

<script setup>
import { ref } from 'vue'
import ElementAdvancedSearch from 'element-advanced-search'

const searchParams = ref({})

const cacheSearchConfig = {
  itemsPerRow: 2,
  popoverWidth: 800,
  labelWidth: '100px',
  inline: true,
  formItems: [
    {
      field: 'userName',
      label: '用户名称',
      type: 'input',
      placeholder: '请输入用户名称'
    },
    {
      field: 'status',
      label: '状态',
      type: 'custom',
      slotName: 'status',
      displayValue: (value) => value ? '启用' : '禁用'
    }
  ]
}

const handleSearch = (params) => {
  console.log('搜索参数:', params)
}
</script>

远程搜索

const remoteSearchConfig = {
  formItems: [
    {
      field: 'assignUser',
      label: '指派用户',
      type: 'select',
      placeholder: '请选择指派用户',
      filterable: true,
      remote: true,
      remoteMethod: async (query) => {
        // 模拟API调用
        const response = await fetch(`/api/users?keyword=${query}`)
        return response.json()
      },
      loadOptions: async () => {
        // 加载默认选项
        const response = await fetch('/api/users')
        return response.json()
      }
    }
  ]
}

自定义标签显示位置

<template>
  <!-- 自定义标签显示区域 -->
  <div id="custom-tags-container">
    <h3>搜索条件</h3>
    <div id="teleport-target"></div>
  </div>

  <!-- 搜索组件 -->
  <ElementAdvancedSearch
    v-model="searchParams"
    :search-config="searchConfig"
    teleport-to="#teleport-target"
    @search="handleSearch"
  />
</template>

<script setup>
import { ref } from 'vue'
import ElementAdvancedSearch from 'element-advanced-search'

const searchParams = ref({})

const searchConfig = {
  itemsPerRow: 2,
  popoverWidth: 800,
  labelWidth: '100px',
  inline: true,
  formItems: [
    {
      field: 'name',
      label: '姓名',
      type: 'input',
      placeholder: '请输入姓名'
    },
    {
      field: 'status',
      label: '状态',
      type: 'select',
      placeholder: '请选择状态',
      options: [
        { label: '启用', value: '0' },
        { label: '禁用', value: '1' }
      ]
    }
  ]
}

const handleSearch = (params) => {
  console.log('搜索参数:', params)
}
</script>

类型声明使用说明

如果您使用的是TypeScript编写项目,本组件提供了完整的 TypeScript 类型支持,您可以通过以下方式使用类型声明:

1. 导入 SearchConfig 类型

import type { SearchConfig } from 'element-advanced-search'

// 使用示例
const searchConfig: SearchConfig = {
  itemsPerRow: 2,
  popoverWidth: 800,
  labelWidth: '100px',
  inline: true,
  formItems: [
    // 表单配置项
  ]
}

2. 主要类型说明

本组件导出的主要类型包括:

| 类型名称 | 说明 | | --- | --- | | SearchConfig | 搜索配置对象类型,用于定义搜索表单的整体配置 | | FormItem | 表单项配置类型,定义每个表单项的属性 | | SelectOption | 选择项配置类型,用于 select、radio 等组件的选项 |

3. 在 Vue 项目中使用类型

<template>
  <ElementAdvancedSearch
    v-model="searchParams"
    :search-config="searchConfig"
    @search="handleSearch"
  />
</template>

<script setup lang="ts">
import { ref } from 'vue'
import ElementAdvancedSearch, { type SearchConfig } from 'element-advanced-search'
import 'element-advanced-search/dist/style.css'

// 定义搜索参数
const searchParams = ref<Record<string, any>>({})

// 定义搜索配置并使用类型声明
const searchConfig: SearchConfig = {
  itemsPerRow: 2,
  popoverWidth: 800,
  labelWidth: '100px',
  inline: true,
  formItems: [
    {
      field: 'name',
      label: '姓名',
      type: 'input',
      placeholder: '请输入姓名'
    },
    {
      field: 'status',
      label: '状态',
      type: 'select',
      placeholder: '请选择状态',
      options: [
        { label: '启用', value: '0' },
        { label: '禁用', value: '1' }
      ]
    }
  ]
}

// 搜索事件处理函数
const handleSearch = (params: Record<string, any>) => {
  console.log('搜索参数:', params)
  // 执行搜索逻辑
}
</script>

4. 自定义类型扩展

如果需要扩展组件提供的类型,可以使用 TypeScript 的类型合并功能:

// 在您的项目中扩展 FormItem 类型
declare module 'element-advanced-search' {
  interface FormItem {
    // 添加自定义属性
    customProperty?: string
  }
}

通过以上方式,您可以在项目中充分利用 TypeScript 的类型检查功能,提高开发效率和代码质量。

注意事项

  1. 使用缓存功能时,确保为每个页面设置唯一的 cacheKey
  2. 对于自定义插槽,需要提供相应的 slotName 并在模板中定义对应插槽
  3. 自定义插槽的搜索标签显示可以通过 displayValue 函数进行自定义
  4. 所有表单项都应设置合适的默认值,以确保表单行为的一致性
  5. 远程搜索功能需要提供 remoteMethodloadOptions 方法来处理数据加载
  6. 组件会自动处理表单数据的响应式更新和搜索标签的显示
  7. 组件支持多种表单控件类型,包括输入框、选择框、日期选择器、数字输入框等
  8. 数字范围和日期范围类型的值以数组形式存储和传递
  9. 使用 teleport-to 属性时,确保目标元素在DOM中存在,否则标签将不会显示

浏览器支持

  • 现代浏览器 (Chrome, Firefox, Safari, Edge)

许可证

MIT