Skip to content

n-search 搜索框 ​

灰底圆角搜索条:放大镜图标 + 单行输入 + 一键清除 + 右侧动作按钮,键盘右下角固定为搜索键。内嵌原生 input 承接输入,受控模式与 n-input 同构(v-model 即用)。

  1. 零配置即用:<n-search v-model="keyword" @search="onSearch" />;占位文字与动作按钮文字内置多语言(简体中文"请输入搜索" / "搜索")
  2. 右侧动作按钮:点击发 custom 事件并自动收起键盘——按钮文字可换"取消",跳真实搜索页形态用 disabled(点击发 click 事件)
  3. 前置分类:label(商品 / 店铺等分类词,点击发 labelclick 可挂分类菜单);清除按钮有值即现,搜索图标可换位右缘

平台兼容性 ​

App H5 微信小程序 支付宝小程序 百度小程序 头条小程序 QQ小程序
√ √ √ × × × ×

如何调用 ​

html
<n-search v-model="keyword" @search="onSearch" />

API ​

属性 ​

参数 说明 类型 默认值 可选值
model-value 输入框的值;支持 v-model(update:modelValue 与 input 同参同发),也可 :model-value + @input 手动绑定 String "" -
placeholder 占位提示文字;留空时用内置多语言文案(简体中文"请输入搜索") String "" -
placeholder-style 占位提示文字的行内样式,颜色默认跟随主题由组件下发 String "" 与 css 相同
maxlength 最大输入长度,-1 为不限制(搜索词无自然上限,默认不限) Number -1 -
clearable 可清除:有内容且非禁用时显示清除按钮,点击清空值并发出 update:modelValue / input / clear 事件 Boolean true -
disabled 禁用(保色相降透明;透明拦截层盖住输入区拦截焦点与键入,此时点击发 click 事件——静态入口跳搜索页形态) Boolean false -
focus 自动获取焦点(置 true 聚焦;置回 false 不会主动收起键盘) Boolean false -
shape 形状:round 全圆角胶囊(搜索框主流形态)/ square 小圆角 String round round<br/>square
label 输入区左侧的前置文字(商品 / 店铺等分类词,点击整区发 labelclick 事件可挂分类菜单) String "" -
search-icon 搜索图标名称(n-icon 内置图标名);空串关闭图标 String search -
search-icon-size 搜索图标字号(px) Number 16 -
icon-position 搜索图标位置:left 输入区左侧 / right 输入区右缘 String left left<br/>right
show-action 是否显示右侧动作按钮(「搜索 / 取消」类动作,点击发 custom 事件并收起键盘) Boolean true -
action-text 右侧动作按钮文字;留空时用内置多语言文案(简体中文"搜索") String "" -
adjust-position 键盘弹起时是否自动上推页面(原生避让机制,输入框在文档流内即可零配置避让)。仅特殊场景(自建聊天栏等自行处理避让)才需要关闭 Boolean true -
cursor-spacing 光标与键盘保持的距离(px):键盘弹起时原生上推量按此值计算;默认 20 保证整个输入框露出键盘上沿 Number 20 -
color 输入文字颜色(留空随深浅主题自动切换;以行内样式直达,不受 App 端 input 类色变量不可靠问题影响) String "" 与 css 相同
input-style 微调原生 input 的行内样式,如 "font-size:14px;text-align:center" String "" 与 css 相同
custom-class 挂到根节点的额外 class(类需定义在组件样式表内) String "" -
custom-style 根节点行内样式 String "" 与 css 相同

事件 ​

事件名 说明 回调参数
update:modelValue 与 input 同参同发(含清除按钮置空),v-model 绑定通道 最新值(String)
input 每次键入或删除时实时触发(手动受控主通道:在回调里同步使用侧状态) 最新值(String)
change 输入内容有变化且失焦时触发(与聚焦时的值比较,无变化不触发) 最终值(String)
search 点击键盘搜索键(右下角)或回车时触发,触发后自动收起键盘 当前输入值(String)
custom 点击右侧动作按钮时触发,触发后自动收起键盘(「搜索 / 取消」类动作入口) 当前输入值(String)
clear 点击清除按钮时触发(值已置空,update:modelValue 与 input 同步发出) 事件对象
focus 输入框获得焦点时触发(禁用态不触发) 事件对象
blur 输入框失去焦点时触发(禁用态不触发;change 在本事件之前发出) 事件对象
keyboardheightchange 键盘高度变化时触发(弹起/收起均发,height 为最新高度,收起为 0) 事件对象(detail.height 为键盘高度)
click 禁用态点击组件时触发——搜索框作静态入口跳转真实搜索页的形态(非禁用态不触发) 事件对象
clickicon 点击搜索图标时触发,触发后自动收起键盘(图标作搜索执行入口) 当前输入值(String)
labelclick 点击前置分类区时触发——经此打开分类菜单(label 挂分类选择的场景) 事件对象

插槽 ​

插槽名 说明
label 前置分类区整段覆盖(默认渲染 label prop 文字;放下拉分类控件时经 labelclick 事件挂菜单)
icon 搜索图标位整段覆盖(默认渲染 search-icon prop 指定的 n-icon;多色 / 品牌图标在此放)
right 输入容器右缘扩展区(语音 / 扫码等动作图标,与输入区的间距由组件负责)
action 右侧动作按钮整段覆盖(默认渲染 action-text prop 文字;放图标按钮或胶囊时在此放)

主题令牌 ​

令牌 默认值 说明
--n-search-bg var(--n-bg-2) 输入容器底色(缺省挂全局表面色,深浅主题自动切换)
--n-search-height 40px 搜索框高度(字段同步取高)
--n-search-padding-x 12px 输入容器水平内边距
--n-search-gap 8px 图标 / 清除区 / 右缘插槽与输入区的间距
--n-search-radius 8px square 形态圆角
--n-search-radius-circle 999px round 形态全圆角
--n-search-font-size 15px 输入文字与图标字号
--n-search-label-margin 12px 前置分类区与输入容器的间距
--n-search-action-margin 12px 右侧动作按钮与输入容器的间距
--n-search-disabled-opacity 0.5 禁用态整体降透明幅度

同名的 SCSS 覆盖变量($n-search-height 等)支持编译期覆盖,用法见库 readme「样式与主题的引入规则」。

实现说明 ​

  • 受控与事件同 n-input:内部 input 用 :value + @input,update:modelValue 与 input 同参同发;change 为失焦值变化语义(与聚焦时快照对比)。search / custom / clickicon 的参数直接给当前输入值(搜索场景要的就是词,原生事件对象无增量信息)。
  • 禁用不绑原生 disabled:保色相整体降透明 + 透明拦截层盖住输入区(焦点进不来、键盘弹不出),点击根节点发 click 事件承接「跳真实搜索页」形态;focus prop 同步做守卫。
  • 清除按钮常驻宽度折叠:clearable 开启期间不插拔节点(App 端动态插拔不即时重绘),显隐走容器 0↔24px 宽度折叠 + 字形 scale/opacity 双通道,宽度翻转由 flex 输入区吸收。
  • 键盘收起联动:search(键盘搜索键)/ custom(动作按钮)/ clickicon(图标点击)触发后自动 uni.hideKeyboard()——键盘挡住后续页面反馈。
  • 输入文字与占位符色行走内:原生 input 上 class color 引用 CSS 变量在 App 端不可靠,按深浅主题算出具体色值后行内直达(color prop 可覆盖)。
  • 图标位置走元素级变体:iconPosition=left 时图标位是输入区前的元素,right 时是右缘插槽之后的独立元素(清除按钮更靠左)——两处整段 v-if 变体、绑定完全一致,翻转随装配位 key 重建根节点(uvue 的 App 端不支持 CSS order)。

取舍记录(对照参考实现) ​

能力 取舍 理由
输入框 / 占位标签双态切换(点占位标签才出输入框) 不收 该机制为「focus 属性不支持的平台」兜底的兼容包袱,uni-app x 全端 input focus 可用
右侧取消 / 搜索双按钮随值切换 不收 双按钮切换依赖占位标签双态;单动作按钮 + action-text 自定义("取消")覆盖等价场景
动作按钮聚焦展开动画 不收 弱需求;本库组件动画统一 JS 帧循环驱动,为按钮展开引入整条动画链路成本不成比例
输入框文字对齐(input-align) 不收 input-style 行内样式可达(如 "text-align:center"),不设重复通道
组件级外边距 / 容器背景与内边距 不收 库内红线:组件零外距,搜索条所在页面的背景与留白归使用方(custom-style 可直达)
键盘失焦自动收起(auto-blur) 不收 失焦场景用 uni.hideKeyboard 主动收;本组件在 search / custom / clickicon 后已自动收
高度自定义 prop(height) 走令牌 单一 40px 令牌(--n-search-height)+ custom-style 覆盖,不设重复通道
搜索图标色 / 动作按钮色 prop 走令牌 图标色与占位符同链(主题算色),按钮色走品牌色令牌;特殊配色用插槽覆盖
输入容器描边色(borderColor) 不收 灰底胶囊主流形态靠与页面底色的色差区分边界、不加描边;白底描边的表单形态归 n-input
动作按钮样式(actionStyle) 不收 #action 插槽整段覆盖(放图标按钮 / 胶囊等任意形态),比样式串通道表达力完整
占位符类名(placeholderClass) 不收 样式隔离下页面类打不进组件内部,placeholder-style 行内样式是可靠直达通道
复位实例方法(reset 清空并收键盘) 不收 等价操作是 v-model 置空 + uni.hideKeyboard() 两行调用方代码;组件无占位标签双态机,无内部状态需要复位
清除按钮仅聚焦时显示 不收 有值即现更直接(聚焦条件在真机上反而难满足:点清除时输入框先失焦)

记录 · 思考 · 创作