
Vant Search 搜索组件完全指南从基础用法到源码级实现原理【免费下载链接】vantA lightweight, customizable Vue UI library for mobile web apps.项目地址: https://gitcode.com/GitHub_Trending/va/vant搜索框是移动端应用中最常见的交互组件之一无论是商品检索、好友查找还是站内内容搜索都离不开一个体验良好的搜索输入框。Vant 的 Search 组件正是为这一场景设计的专用输入组件它内置了搜索图标、清除按钮、右侧取消按钮等移动端搜索交互的标准能力同时通过v-model、search/cancel事件与表单体系无缝衔接。本文将基于 Search 官方文档 展开完整讲解该组件的引入方式、全部 Props/Events/插槽/方法并结合 Search.tsx、index.less 与 test/index.spec.ts 等源码与测试带你理解其底层实现原理与设计取舍最终能够在实际项目中熟练、正确地使用并定制它。组件介绍与引入组件定位Search 是 Vant 中用于搜索场景的输入框组件。与通用的 Field 输入框相比它针对搜索这一高频交互做了专门的封装默认带左侧搜索图标、支持清除输入、支持右侧取消/操作按钮、监听键盘搜索键回车这些能力共同构成了移动端搜索框的标准交互范式。引入方式通过以下方式来全局注册组件。更多注册方式如按需引入、自动按需解析等请参考组件注册文档。import { createApp } from vue; import { Search } from vant; const app createApp(); app.use(Search);从源码看Search通过withInstall包装导出并额外声明了全局组件类型因此注册后即可在模板中直接使用van-search标签并享受完整的 TypeScript 类型提示见 index.tsdeclare module vue { export interface GlobalComponents { VanSearch: typeof Search; } }注册完成后van-search与Search两种写法等价。仓库内 demo/index.vue 演示了组件在真实文档站点中的完整用法可作为参考。代码演示基础用法v-model用于控制搜索框中的文字background可以自定义搜索框外部背景色。van-search v-modelvalue placeholder请输入搜索关键词 /import { ref } from vue; export default { setup() { const value ref(); return { value }; }, };这里v-model对应的就是文档 API 中的modelValue属性与update:modelValue事件。当用户输入时组件会实时把最新值回传给value实现双向绑定。事件监听Search 组件提供了search和cancel事件search事件在点击键盘上的搜索/回车按钮后触发cancel事件在点击搜索框右侧取消按钮时触发。form action/ van-search v-modelvalue show-action placeholder请输入搜索关键词 searchonSearch cancelonCancel / /formimport { ref } from vue; import { showToast } from vant; export default { setup() { const value ref(); const onSearch (val) showToast(val); const onCancel () showToast(取消); return { value, onSearch, onCancel, }; }, };Tips在 van-search 外层增加form标签且action不为空即可在 iOS 输入法中显示搜索按钮。这一 Tips 与源码实现相互印证在 Search.tsx 中search事件实际上是通过监听输入框的keypress事件、判断按键码为 13Enter后触发的并调用preventDefault阻止默认的表单提交行为const onKeypress (event: KeyboardEvent) { const ENTER_CODE 13; if (event.keyCode ENTER_CODE) { preventDefault(event); emit(search, props.modelValue); } };也就是说无论是否包裹form点击回车都会触发search而包上form并设置action只是为了让 iOS 键盘把回车键显示为搜索按钮属于纯 UI 层面的优化。搜索框内容对齐通过input-align属性设置搜索框内容的对齐方式可选值为center、right。van-search v-modelvalue placeholder请输入搜索关键词 input-aligncenter /input-align最终会透传给内部基于 Field 实现的输入区域见下文源码解析取值包括left默认、center、right。禁用搜索框通过disabled属性禁用搜索框。van-search v-modelvalue disabled placeholder请输入搜索关键词 /禁用后输入框不可聚焦、不可输入适用于搜索条件尚未就绪或等待结果返回等交互状态。自定义背景色通过background属性可以设置搜索框外部的背景色通过shape属性设置搜索框的形状可选值为round。van-search v-modelvalue shaperound background#4fc08d placeholder请输入搜索关键词 /shape的默认值是square直角设置为round后搜索框内容区域会呈现胶囊形圆角。从 index.less 可以看到圆角实际上是通过修饰类--round将内容区域的border-radius从var(--van-radius-sm)提升为var(--van-radius-max)实现的__content { border-radius: var(--van-radius-sm); --round { border-radius: var(--van-radius-max); } }自定义按钮使用action插槽可以自定义右侧按钮的内容。使用插槽后cancel事件将不再触发。van-search v-modelvalue show-action label地址 placeholder请输入搜索关键词 searchonSearch template #action div clickonClickButton搜索/div /template /van-searchimport { ref } from vue; import { showToast } from vant; export default { setup() { const value ref(); const onSearch (val) showToast(val); const onClickButton () showToast(value.value); return { value, onSearch, onClickButton, }; }, };这一行为同样有明确的源码与测试依据。在 Search.tsx 中取消逻辑会先判断是否存在action插槽只有未使用插槽时才会清空输入框并触发cancelconst onCancel () { if (!slots.action) { emit(update:modelValue, ); emit(cancel); } };对应地test/index.spec.ts 中的测试用例 should not emit cancel event when using action slot 验证了使用action插槽后点击操作区不会触发cancel事件。因此当你需要点击自定义按钮后再清空输入框时需在按钮的点击回调里自行处理。APIProps参数说明类型默认值v-model当前输入的值number | string-label搜索框左侧文本string-name名称作为提交表单时的标识符string-shape搜索框形状可选值为roundstringsquareid搜索框 id同时会设置 label 的 for 属性stringvan-search-n-inputbackground搜索框外部背景色string#f2f2f2maxlength输入的最大字符数number | string-placeholder占位提示文字string-clearable是否启用清除图标点击清除图标后会清空输入框booleantrueclear-icon清除图标名称或图片链接等同于 Icon 组件的 name 属性stringclearclear-trigger显示清除图标的时机always表示输入框不为空时展示focus表示输入框聚焦且不为空时展示stringfocusautofocus是否自动聚焦iOS 系统不支持该属性booleanfalseshow-action是否在搜索框右侧显示取消按钮booleanfalseaction-text取消按钮文字string取消disabled是否禁用输入框booleanfalsereadonly是否将输入框设为只读状态只读状态下无法输入内容booleanfalseerror是否将输入内容标红booleanfalseerror-message底部错误提示文案为空时不展示string-formatter输入内容格式化函数(val: string) string-format-trigger格式化函数触发的时机可选值为onBlurstringonChangeinput-align输入框内容对齐方式可选值为centerrightstringleftleft-icon输入框左侧图标名称或图片链接等同于 Icon 组件的 name 属性stringsearchright-icon输入框右侧图标名称或图片链接等同于 Icon 组件的 name 属性string-autocompleteinput 标签原生的自动完成属性string-几个值得注意的默认值实现细节依据 Search.tsxclearable的默认值为true通过truthProp声明这与普通输入框的惯例一致——搜索场景下清除输入是高频需求leftIcon默认是search图标这是 Search 区别于通用 Field 的典型特征shape默认squarebackground默认由样式变量--van-search-background提供文档标注为#f2f2f2id属性在文档中标为默认van-search-n-input而从源码看未显式传id时实际由useId()生成唯一 id 并拼接-input后缀见 Search.tsx 的getInputId并同时用于label的for属性保证点击左侧文字可聚焦输入框action-text未设置时取消按钮文案取自多语言包中的cancel字段中文环境为取消见 zh-CN.ts。Events事件名说明回调参数search确定搜索时触发value: string (当前输入的值)update:model-value输入框内容变化时触发value: string (当前输入的值)focus输入框获得焦点时触发event: Eventblur输入框失去焦点时触发event: Eventclick-input点击输入区域时触发event: MouseEventclick-left-icon点击左侧图标时触发event: MouseEventclick-right-icon3.4.0点击右侧图标时触发event: MouseEventclear点击清除按钮后触发event: MouseEventcancel点击取消按钮时触发-组件完整声明了以上 9 个事件见 Search.tsx。其中大部分事件focus、blur、clear、clickInput、clickLeftIcon、clickRightIcon等在源码中是透传自内部 Field 输入区域的测试用例 test/index.spec.ts 逐一验证了clickLeftIcon、clickRightIcon等事件的触发行为。方法通过 ref 可以获取到 Search 实例并调用实例方法详见组件实例方法。方法名说明参数返回值focus获取输入框焦点--blur取消输入框焦点--在源码中这两个方法通过useExpose({ focus, blur })暴露见 Search.tsx内部实际是调用底层 Field 实例的focus()/blur()最终作用于原生input。对应的测试 should call input.focus when vm.focus is called 与 should call input.blur when vm.blur is called见 test/index.spec.ts验证了方法可正确触发原生输入框的聚焦与失焦。类型定义组件导出以下类型定义import type { SearchProps, SearchShape, SearchInstance } from vant;SearchInstance是组件实例的类型用法如下import { ref } from vue; import type { SearchInstance } from vant; const searchRef refSearchInstance(); searchRef.value?.focus();从 types.ts 可以看到SearchShape被精确约束为square | round两个取值SearchInstance由ComponentPublicInstanceSearchProps, SearchExpose派生其中SearchExpose即上面提到的focus/blur两个方法。此外该文件还导出了SearchThemeVars用于主题定制场景下的 TypeScript 类型约束。Slots名称说明left自定义左侧内容搜索框外action自定义右侧内容搜索框外设置show-action属性后展示label自定义左侧文本搜索框内left-icon自定义左侧图标搜索框内right-icon自定义右侧图标搜索框内从渲染结构Search.tsx看组件整体布局为外层容器内依次渲染left插槽、内容区content包含label插槽与输入区和action插槽/取消按钮。其中left-icon、right-icon两个插槽会被转发给内部 Field 使用v-slots{pick(slots, [left-icon, right-icon])}。label插槽与label属性互斥使用当传入label文本或label插槽时会渲染一个指向输入框的label元素见 Search.tsx点击文字即可聚焦输入框。主题定制样式变量组件提供了下列 CSS 变量可用于自定义样式使用方法请参考 ConfigProvider 组件。名称默认值描述--van-search-padding10px var(--van-padding-sm)---van-search-backgroundvar(--van-background-2)---van-search-content-backgroundvar(--van-gray-1)---van-search-input-height34px---van-search-label-padding0 5px---van-search-label-colorvar(--van-text-color)---van-search-label-font-sizevar(--van-font-size-md)---van-search-left-icon-colorvar(--van-gray-6)---van-search-action-padding0 var(--van-padding-xs)---van-search-action-text-colorvar(--van-text-color)---van-search-action-font-sizevar(--van-font-size-md)-这些变量的默认值定义在 index.less 的:root, :host作用域下均基于 Vant 的全局设计令牌如--van-padding-sm、--van-text-color、--van-gray-6等组合而成因此通过ConfigProvider覆盖全局令牌或直接覆盖上述变量都能实现风格统一的自定义。值得注意的是--van-search-content-background在文档表中标注的默认值为var(--van-gray-1)而当前 index.less 中的实际实现为var(--van-background)以实际构建产物的源码为准。此外--van-search-input-height默认34px同时决定了输入区与取消按钮的行高是调整搜索框整体高度最直接的入口见 index.less。常见问题在桌面端点击清除按钮无效清除按钮监听的是移动端 Touch 事件参见桌面端适配。源码级原理补充Search 是如何构建出来的理解了 API 之后再来看 Search.tsx 的整体设计可以更清楚地把握组件的扩展边界1. 基于 Field 的组合 透传架构searchProps通过extend({}, fieldSharedProps, {...})继承了 Field 的共享属性见 Field.tsx 中的fieldSharedProps因此maxlength、placeholder、clearable、clear-icon、clear-trigger、autofocus、formatter、format-trigger、input-align、error、error-message、autocomplete等一系列能力本质上来自 FieldSearch 在渲染时把相关属性通过pick筛选后透传给内部Field typesearch。这意味着 Search 天然继承了 Vant 输入组件家族统一的输入、校验与格式化体系使用成本极低。2. 渲染结构清晰、可扩展最终渲染的 DOM 结构为对应 Search.tsx 与 index.less.van-searchflex 布局容器背景 --van-search-background / background prop ├── left 插槽搜索框外左侧 ├── .van-search__content圆角内容区shape 控制直角/胶囊 │ ├── label搜索框内左侧文本for 指向输入框 │ └── Fieldtypesearch隐藏原生 WebKit 搜索装饰按钮 └── .van-search__action右侧取消按钮 / action 插槽show-action 时渲染组件还在样式中隐藏了 WebKit 内核下input[typesearch]自带的装饰元素见 index.less确保各端搜索框外观一致。3. 行为均有测试保障test/index.spec.ts 覆盖了组件的关键行为契约输入触发update:modelValue并携带最新值、点击取消按钮触发cancel且清空输入、回车触发search、使用action插槽后cancel不再触发、label/left等插槽正常渲染、id同时作用于 input 与 label、name/autocomplete正确落到原生 input 属性、实例focus/blur方法有效等。这些测试用例既是组件行为的事实说明书也是你在自定义封装或派生组件时可以对照的参考基准。综上Vant Search 是一个小而精的组件对外暴露简洁的 Props/Events/插槽/方法接口对内则通过继承 Field 能力、组合插槽结构、以 CSS 变量驱动主题的方式为移动端搜索场景提供了一套开箱即用且高度可定制的解决方案。掌握本文介绍的 API 与实现原理后无论是直接使用、主题定制还是基于它二次封装业务搜索框都能做到心中有数。【免费下载链接】vantA lightweight, customizable Vue UI library for mobile web apps.项目地址: https://gitcode.com/GitHub_Trending/va/vant创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考