封装el-autocomplete,接口调用

组件

<template><el-autocompletev-model="selectedValue":fetch-suggestions="fetchSuggestions":placeholder="placeholder"@select="handleSelect"clearablev-bind="$attrs"/>
</template><script lang="ts" setup>
import { ref, computed, onMounted, withDefaults } from 'vue'
import type { AutocompleteProps, AutocompleteEmits } from 'element-plus'interface AutocompleteItem {value: string[key: string]: any
}interface Props {placeholder?: stringdebounce?: numberapiFn?: (query: string) => Promise<AutocompleteItem[]> // 模拟接口函数localData?: AutocompleteItem[] // 本地数据filterFn?: (query: string, item: AutocompleteItem) => boolean // 自定义过滤函数
}const props = withDefaults(defineProps<Props>(), {placeholder: '请输入内容',debounce: 300,localData: () => [],filterFn: undefined
})const emit = defineEmits<{(e: 'update:modelValue', value: string): void(e: 'select', item: AutocompleteItem): void
}>()const selectedValue = ref('')
const loading = ref(false)
const suggestions = ref<AutocompleteItem[]>([])
let timeout: number | undefined// 默认过滤函数 - 开头匹配(不区分大小写)
const defaultFilter = (query: string) => {const lowerQuery = query.toLowerCase()return (item: AutocompleteItem) => item.value.toLowerCase().startsWith(lowerQuery)
}// 模拟接口获取数据
const mockApiFetch = async (query: string): Promise<AutocompleteItem[]> => {// 这里模拟API请求延迟await new Promise(resolve => setTimeout(resolve, 500))// 模拟数据const mockData = [{ value: 'Vue', link: 'https://vuejs.org' },{ value: 'React', link: 'https://reactjs.org' },{ value: 'Angular', link: 'https://angular.io' },{ value: 'Svelte', link: 'https://svelte.dev' },{ value: 'TypeScript', link: 'https://www.typescriptlang.org' },]// 模拟接口过滤return mockData.filter(item => item.value.toLowerCase().includes(query.toLowerCase()))
}// 获取建议列表
const fetchSuggestions = async (query: string, cb: (arg: AutocompleteItem[]) => void
) => {clearTimeout(timeout)if (!query) {cb(props.localData)return}loading.value = truetimeout = setTimeout(async () => {try {let results: AutocompleteItem[] = []if (props.apiFn) {// 使用传入的接口函数获取数据results = await props.apiFn(query)} else if (props.localData.length) {// 使用本地数据过滤const filter = props.filterFn ? (item: AutocompleteItem) => props.filterFn!(query, item): defaultFilter(query)results = props.localData.filter(filter)} else {// 使用默认模拟接口results = await mockApiFetch(query)}suggestions.value = resultscb(results)} catch (error) {console.error('获取建议列表失败:', error)cb([])} finally {loading.value = false}}, props.debounce) as unknown as number
}// 选择事件
const handleSelect = (item: AutocompleteItem) => {emit('update:modelValue', item.value)emit('select', item)
}// 暴露方法
defineExpose({focus: () => {// 这里可以访问el-autocomplete的方法// 需要在实际使用时通过ref获取组件实例}
})
</script><style scoped>
.el-autocomplete {width: 100%;
}
</style>

基本用法(使用内置模拟接口)

<template><CustomAutocomplete v-model="selectedValue" />
</template><script setup lang="ts">
import { ref } from 'vue'
import CustomAutocomplete from './CustomAutocomplete.vue'const selectedValue = ref('')
</script>

使用自定义接口函数

<template><CustomAutocomplete v-model="selectedValue":api-fn="fetchDataFromApi"/>
</template><script setup lang="ts">
import { ref } from 'vue'
import CustomAutocomplete from './CustomAutocomplete.vue'const selectedValue = ref('')const fetchDataFromApi = async (query: string) => {// 这里可以替换为真实的API调用console.log('查询:', query)return [{ value: `${query}-结果1`, id: 1 },{ value: `${query}-结果2`, id: 2 }]
}
</script>

自定义过滤逻辑

<template><CustomAutocomplete v-model="selectedValue":local-data="techList":filter-fn="customFilter"/>
</template><script setup lang="ts">
import { ref } from 'vue'
import CustomAutocomplete from './CustomAutocomplete.vue'const selectedValue = ref('')
const techList = ref([{ value: 'Vue.js', category: 'frontend' },{ value: 'React', category: 'frontend' },{ value: 'Express', category: 'backend' }
])const customFilter = (query: string, item: any) => {// 同时匹配value和categoryreturn item.value.toLowerCase().includes(query.toLowerCase()) || item.category.toLowerCase().includes(query.toLowerCase())
}
</script>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/77468.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GPUStack昇腾Atlas300I duo部署模型DeepSeek-R1【GPUStack实战篇2】

2025年4月25日GPUStack发布了v0.6版本&#xff0c;为昇腾芯片910B&#xff08;1-4&#xff09;和310P3内置了MinIE推理&#xff0c;新增了310P芯片的支持&#xff0c;很感兴趣&#xff0c;所以我马上来捣鼓玩玩看哈 官方文档&#xff1a;https://docs.gpustack.ai/latest/insta…

Linux进程详细解析

1.操作系统 概念 任何计算机系统都包含⼀个基本的程序集合&#xff0c;称为操作系统(OS)。笼统的理解&#xff0c;操作系统包括&#xff1a; • 内核&#xff08;进程管理&#xff0c;内存管理&#xff0c;文件管理&#xff0c;驱动管理&#xff09; • 其他程序&#xff08…

解决两个技术问题后小有感触-QZ Tray使用经验小总结

老朋友都知道&#xff0c;我现在是一家软件公司销售部门的项目经理和全栈开发工程师&#xff0c;就是这么“奇怪”的岗位&#xff0c;大概我是公司销售团队里比较少有技术背景、销售业绩又不那么理想的销售。 近期在某个票务系统项目上驻场&#xff0c;原来我是这个项目的项目…

Centos 7.6安装redis-6.2.6

1. 安装依赖 确保系统已经安装了必要的编译工具和库&#xff1a; sudo yum groupinstall "Development Tools" -y sudo yum install gcc make tcl -y 2. 解压 Redis 源码包 进入 /usr/local/ 目录并解压 redis-6.2.6.tar.gz 文件&#xff1a; cd /usr/local/ sudo ta…

Ejs模版引擎介绍,什么是模版引擎,什么是ejs,ejs基本用法

** EJS 模板引擎**&#xff0c;让你彻底搞明白什么是模板引擎、什么是 EJS、怎么用、语法、最佳实践等等&#xff1a; &#x1f4da; 一、什么是模板引擎&#xff1f; 模板引擎是前后端分离之前的一种服务器端“渲染技术”。它的主要作用是&#xff1a; 将 HTML 页面和后端传递…

2025.4.21-2025.4.26学习周报

目录 摘要Abstract1 文献阅读1.1 模型架构1.1.1 动态图邻接矩阵的构建1.1.2 多层次聚合机制模块1.1.3 AHGC-GRU 1.2 实验分析 总结 摘要 在本周阅读的论文中&#xff0c;作者提出了一种名为AHGCNN的自适应层次图卷积神经网络。AHGCNN通过将监测站点视为图结构中的节点&#xf…

6.1 客户服务:智能客服与自动化支持系统的构建

随着企业数字化转型的加速&#xff0c;客户服务作为企业与用户交互的核心环节&#xff0c;正经历从传统人工服务向智能化、自动化服务的深刻变革。基于大语言模型&#xff08;LLM&#xff09;和智能代理&#xff08;Agent&#xff09;的技术为构建智能客服与自动化支持系统提供…

java Optional

我还没用过java8的一些语法&#xff0c;有点老古董了&#xff0c;记录下Optional怎么用。 从源码看&#xff0c;Optional内部持有一个对象&#xff0c; 有一些api对这个对象进行判空处理。 静态方法of &#xff0c;生成Optional对象&#xff0c; 但这个value不能为空&#…

【Java面试笔记:进阶】24.有哪些方法可以在运行时动态生成一个Java类?

在Java中,运行时动态生成类是实现动态编程、框架扩展(如AOP、ORM)和插件化系统的关键技术。 1.动态生成Java类的方法 1.从源码生成 直接生成源码文件:通过Java程序生成源码并保存为文件。编译源码: 使用ProcessBuilder启动javac进程进行编译。使用Java Compiler API(ja…

基于Jamba模型的天气预测实战

深入探索Mamba模型架构与应用 - 商品搜索 - 京东 DeepSeek大模型高性能核心技术与多模态融合开发 - 商品搜索 - 京东 由于大气运动极为复杂&#xff0c;影响天气的因素较多&#xff0c;而人们认识大气本身运动的能力极为有限&#xff0c;因此以前天气预报水平较低 。预报员在预…

GAMES202-高质量实时渲染(Real-Time Shadows)

目录 Shadow MappingshadowMapping的问题shadow mapping背后的数学PCF&#xff08;Percentage Closer Filtering&#xff09;PCSS&#xff08;Percentage closer soft shadows&#xff09;VSSM&#xff08;Variance Soft Shadow Mapping&#xff09;优化步骤3优化步骤1SAT&…

iphonex uniapp textarea标签兼容性处理过程梳理

嗨&#xff0c;我是小路。今天主要和大家分享的主题是“iphonex uniapp textarea标签兼容性处理过程梳理”。 在uniapp项目中&#xff0c;经常会使用到uniapp原生的textarea标签&#xff0c;但在手机兼容性这块&#xff0c;textarea并不是很好用&#xff0c;会出现一些…

C++ 区分关键字和标识符

1. 关键字&#xff08;Keywords&#xff09; 定义&#xff1a;关键字是编程语言预定义的具有特定意义的单词。它们是语言的一部分&#xff0c;C编译器具有特殊的理解规则&#xff0c;不能作为用户自定义的标识符。作用&#xff1a;关键字用于定义语言结构&#xff0c;如声明变…

杭电oj(1087、1203、1003)题解

DP 即动态规划&#xff08;Dynamic Programming&#xff09;&#xff0c;是一种通过把原问题分解为相对简单的子问题&#xff0c;并保存子问题的解来避免重复计算&#xff0c;从而解决复杂问题的算法策略。以下从几个方面简述动态规划&#xff1a; 基本思想 动态规划的核心在…

一键多环境构建——用 Hvigor 玩转 HarmonyOS Next

引言 在 HarmonyOS Next 的应用开发中&#xff0c;常常需要针对不同环境&#xff08;测试、预发、线上&#xff09;或不同签名&#xff08;调试、正式&#xff09;输出多个 APP/HAP 包。虽然 HarmonyOS 提供了多目标构建&#xff08;Multi-Target Build&#xff09;能力&#…

qt/c++云对象浏览器

简介 本项目为基于QT5和C11的云对象存储可视化管理工具 源码获取 int main(){ printf("源码联系绿泡泡:%s","joyfelic"); return 0; }

【Ubuntu】提升 docker ps -a 输出的可读性:让 Docker 容器状态更清晰

提升 docker ps -a 输出的可读性&#xff1a;让 Docker 容器状态更清晰 当我们使用 docker ps -a 查看所有 Docker 容器时&#xff0c;输出的信息通常会非常多&#xff0c;尤其是在容器数量较多时。默认输出中包含容器 ID、名称、镜像、状态、端口等信息&#xff0c;容易让人眼…

Spring Security自定义身份认证

尽管项目启动时&#xff0c;Spring Security会提供了默认的用户信息&#xff0c;可以快速认证和启动&#xff0c;但大多数应用程序都希望使用自定义的用户认证。对于自定义用户认证&#xff0c;Spring Security提供了多种认证方式&#xff0c;常用的有In-Memory Authentication…

在亚马逊云服务器上部署WordPress服务

在亚马逊云服务器上部署WordPress服务第一步&#xff1a;创建EC2实例第二步&#xff1a;初始设置与安装第三步&#xff1a;配置MySQL与WordPress第四步&#xff1a;配置Apache与WordPress第五步&#xff1a;访问WordPress第六步&#xff1a;测试数据库连接第七步&#xff1a;使…

Web3.0的认知补充(去中心化)

涉及开发技术&#xff1a; Vue Web3.js Solidity 基本认知 Web3.0含义&#xff1a; 新一代互联网思想&#xff1a;去中心化及用户为中心的互联网 数据&#xff1a;可读可写可授权 核心技术&#xff1a;区块链、NFT 应用&#xff1a;互联网上应用 NFT &…