UniApp 实现搜索页逻辑详解

在小程序中,搜索功能是非常常见的需求。今天分享一个搜索页的实现逻辑,包含 搜索输入、历史记录、热门搜索、分页加载、无数据处理 等核心功能


一、页面结构设计

页面主要分为以下几个部分:

1.搜索框:输入关键字,支持回车触发搜索、清除、取消。

2.历史搜索:存储用户输入过的搜索关键字。

3.热门搜索:给用户推荐一些固定的搜索词。

4.搜索结果列表:展示接口返回的数据。

5.无数据提示:当搜索不到结果时展示空状态。

二、核心逻辑拆解

1.搜索输入框

当用户输入关键字并点击回车(confirm 事件)时,需要触发搜索逻辑。

关键点

1.先 trim 输入内容,避免全是空格。

2.如果关键字为空,直接 return,不做请求。

  1. 把关键字加入 历史搜索数组 ,并保存到 localStorage

4.重置参数对象 queryParams,重新发起请求。

scss 复制代码
const onSearch = () => {
  uni.showLoading()
  queryParams.value.keyword = queryParams.value.keyword.trim()
  if (!queryParams.value.keyword) {
    uni.hideLoading()
    return
  }
  // 去重 + 限制长度
  historySearch.value = [...new Set([...historySearch.value, queryParams.value.keyword])].slice(0,10)
  uni.setStorageSync("historySearch", historySearch.value)
  initParams(queryParams.value.keyword) // 重置参数
  searchData() // 发请求
}

2.点击标签搜索

无论是历史搜索还是热门搜索,点击后逻辑一样:

把 tab 的值赋给 keyword

触发搜索函数

scss 复制代码
const clickTab = (value) => {
  initParams(value)
  onSearch()
}

3.请求数据

发起请求时,把结果追加到 classList,并做以下判断:

如果 res.data.length < pageSize,说明没有更多数据了,设置 noData = true

如果返回数据为空并且当前列表也为空,说明完全没有结果,设置 noSearch = true

ini 复制代码
const searchData = async () => {
  try {
    let res = await apiSearchData(queryParams.value)
    classList.value = [...classList.value, ...res.data]
    uni.setStorageSync("storgClassList", classList.value)

    if (res.data.length < queryParams.value.pageSize) {
      noData.value = true
    }
    if (res.data.length === 0 && classList.value.length === 0) {
      noSearch.value = true
    }
  } finally {
    uni.hideLoading()
  }
}

4.下拉触底加载更多

小程序中可以用 onReachBottom 监听触底事件,实现分页加载:

scss 复制代码
onReachBottom(() => {
  if(noData.value) return
  queryParams.value.pageNum++
  searchData()
})

5.初始化参数

每次新搜索时,需要清空旧数据、重置状态:

ini 复制代码
const initParams = (value = "") => {
  classList.value = []
  noData.value = false
  noSearch.value = false
  queryParams.value = {
    pageNum: 1,
    pageSize: 12,
    keyword: value || "",
  }
}

三、无数据处理

搜索结果可能有三种情况:

1.正常有数据 → 渲染列表

2.没有更多数据 → 底部显示 uni-load-more

3.完全没有搜索结果 → 显示空状态图

ini 复制代码
<view class="noSearch" v-if="noSearch">
  <uv-empty mode="search" icon="http://cdn.uviewui.com/uview/empty/search.png"></uv-empty>
</view>

四、效果总结

搜索逻辑清晰:输入 / 点击标签 → 重置参数 → 发请求

用户体验优化:历史搜索、本地存储、热门搜索

异常处理:无结果、没有更多

这样一套逻辑,可以完整覆盖大多数搜索需求。

效果图展示。

​编辑

​编辑

​编辑

​编辑

相关推荐
东风破_6 小时前
danci 项目(三):从 JSON 数据到 AI Coding,真实项目里的数据清洗、Prompt 和工程规范
前端·后端·node.js
东风破_6 小时前
danci 项目(一):从需求到架构,一个单词学习系统为什么会这样设计
前端·后端·node.js
蒲公英eric7 小时前
从客户端到服务端:DVWA DOM 型 XSS 模块完整漏洞分析教程
前端·web安全·ai·xss·dvwa·ai安全
单线程_017 小时前
从案例分析 Vue3 Tokenizer+Parser 源码三
前端·javascript·vue.js
顶点多余7 小时前
那些在算法中适合巩固的知识点---1
java·前端·算法
Setsuna_F_Seiei7 小时前
前端转型 Agent 开发 03 之 Agent Tools - 给 Agent 装上手脚
前端·agent·ai编程
jay神7 小时前
【计算机毕业设计】基于SpringBoot的程序教学辅助系统
java·前端·vue.js·spring boot·后端·毕业设计·课程设计
kyriewen10 小时前
我装了30多个Skill,给AI安排了8个岗位
前端·javascript·ai编程
风骏时光牛马10 小时前
大模型落地实践中的技术选型思路与方案对比
前端
IT_陈寒11 小时前
Vite打包时的静态资源坑,我帮你踩过了
前端·人工智能·后端