【微信小程序】4|搜索框-历史搜索 | 我的咖啡店-综合实训

搜索框-历史搜索记录

实现功能:

  1. 历史搜索记录
  2. 展示-历史搜索记录展示10条
  3. 点击跳转-点击历史搜索记录可同步到搜索框并自动搜索
  4. 全部删除-可一次性全部删除历史搜索记录

引言

在微信小程序中,一个带有历史记录的搜索框可以极大地提升用户体验。用户可以快速访问他们之前的搜索,而不必重新输入。本文将详细介绍如何在"我的咖啡店"小程序中实现这一功能。

实现搜索框与历史记录功能

1. 页面初始数据设置

search.js中,我们首先定义了页面的初始数据,包括搜索历史列表historyList和当前搜索关键词keyword

javascript 复制代码
// pages/search/search.js
Page({
  data: {
    historyList: [],
    keyword: ""
  },
  // ...其他函数
});

2. 加载搜索历史

在页面加载时,我们从本地存储中获取搜索历史数组,并更新页面数据。

javascript 复制代码
// pages/search/search.js
onLoad(options) {
  let searchKeyArr = wx.getStorageSync('searchKeyArr') || [];
  this.setData({ historyList: searchKeyArr });
  wx.hideLoading();
},

3. 搜索关键词处理

当用户在搜索框中输入关键词并触发搜索时,我们将关键词添加到搜索历史列表中,并同步到本地存储。

javascript 复制代码
// pages/search/search.js
onSearch() {
  let currentKeyword = this.data.keyword.trim();
  let hisArr = this.data.historyList || [];
  if (currentKeyword && !hisArr.includes(currentKeyword)) {
    hisArr.unshift(currentKeyword);
  }
  hisArr = [...new Set(hisArr)].slice(0, 10);
  this.setData({
    historyList: hisArr,
    keyword: ''
  });
  wx.setStorageSync('searchKeyArr', hisArr);
},

4. 清空搜索历史

用户可以一次性清空所有搜索历史记录。

javascript 复制代码
// pages/search/search.js
clearHistory() {
  this.setData({
    historyList: []
  });
  wx.removeStorageSync('searchKeyArr');
},

5. 点击历史记录触发搜索

当用户点击历史记录中的某个关键词时,该关键词将同步到搜索框并自动触发搜索。

javascript 复制代码
// pages/search/search.js
onKeywordTap(e) {
  this.setData({
    keyword: e.currentTarget.dataset.keyword
  });
  this.onSearch();
},

6. WXML 结构

search.wxml中,我们使用<van-search>组件创建搜索框,并使用<view>组件创建历史记录列表。

XML 复制代码
<!--pages/search/search.wxml-->
<view class="search">
  <van-search value="{{ keyword }}" ...>
    <view slot="action" bind:tap="onSearch">搜索</view>
  </van-search>
  <view class="history" wx:if="{{historyList.length}}">
    <view class="title">
      <view class="text">搜索历史</view>
      <view class="remove" bindtap="clearHistory">
        <van-icon name="delete-o" size="21" />
      </view>
    </view>
    <view class="content">
      <view class="item" wx:for="{{historyList}}" wx:key="index" data-keyword="{{item}}" bindtap="onKeywordTap">{{item}}</view>
    </view>
  </view>
</view>

7. WXSS 样式

search.wxss中,我们定义了搜索框和历史记录列表的样式。

css 复制代码
/* pages/search/search.wxss */
/* 样式定义... */

结语

通过上述步骤,我们实现了一个带有历史记录的搜索框,用户可以查看历史记录,点击记录进行搜索,或者删除单个或全部历史记录。这个功能不仅提升了用户体验,也使得搜索过程更加便捷。希望这篇文章能帮助你在开发自己的微信小程序时,更好地实现搜索框和历史记录管理功能。

完整代码

search.js

javascript 复制代码
// pages/search/search.js
Page({
  // 页面的初始数据
  data: {
    // 搜索历史列表,初始化为空数组
    historyList: [],
    // 搜索关键词,初始化为空字符串
    keyword: ""
  },

  // 生命周期函数--监听页面加载
  onLoad(options) {
    // 尝试从本地存储中获取搜索历史数组,如果不存在则默认为空数组
    let searchKeyArr = wx.getStorageSync('searchKeyArr') || null;
    // 更新搜索历史数据
    this.setData({ historyList: searchKeyArr });
    // 关闭加载提示
    wx.hideLoading();
  },

  // 输入框内容改变时触发
  onChange(e) {
    // console.log(e);
    // 更新页面数据中的 keyword 为输入框的当前值
    this.setData({
      keyword: e.detail
    })
  },

  // 确认搜索
  onSearch() {
    // 获取输入的关键词并去除两端空格
    let currentKeyword = this.data.keyword.trim();
    // 在控制台输出当前的搜索关键词
    console.log(currentKeyword);
    // 获取当前的搜索历史列表,如果未定义则初始化为空数组
    let hisArr = this.data.historyList || [];
    // 将当前关键词添加到历史列表的开头
    if (currentKeyword && currentKeyword !== '' && !hisArr.includes(currentKeyword)) {
      hisArr.unshift(currentKeyword);
    }
    // 使用 Set 去除重复的关键词,然后展开到数组中
    hisArr = [...new Set(hisArr)];
    // 截取数组的前10项,限制历史列表的长度
    hisArr = hisArr.slice(0, 10);
    // 更新页面数据中的搜索历史列表
    this.setData({
      historyList: hisArr,
      keyword: '' // 清空关键词输入
    });
    // 同步搜索历史列表到本地存储
    wx.setStorageSync('searchKeyArr', hisArr);
  },

  // 清空历史
  clearHistory() {
    // 清空历史列表
    this.setData({
      historyList: []
    });
    // 同步清空历史列表到本地存储
    wx.removeStorageSync('searchKeyArr');
  },

  // 点击历史关键词时触发的函数
  onKeywordTap(e) {
    // 赋值为 被点击的历史关键词
    this.setData({
      keyword: e.currentTarget.dataset.keyword
    });
    // 可以在这里直接触发搜索,或者让用户手动触发
    this.onSearch();
  },


});

search.json

javascript 复制代码
{
  "usingComponents": {
    "van-icon": "@vant/weapp/icon/index"
  }
}

search.wxml

XML 复制代码
<!--pages/search/search.wxml-->
<view class="search">
  <!-- 搜索框开始 -->
  <van-search value="{{ keyword }}" shape="round" background="#fff" placeholder="{{defaultSearchHint}}" use-action-slot show-action bind:change="onChange" bind:search="onSearch" bind:cancel="onCancel" bind:clear="onClear">
    <view slot="action" bind:tap="onSearch" style="padding:0 30rpx">搜索</view>
  </van-search>
  <!-- 搜索框结束 -->

  <!-- 搜索历史视图 -->
  <view class="history" wx:if="{{historyList.length}}">
    <!-- 标题 -->
    <view class="title">
      <view class="text">搜索历史</view>
      <view class="remove" bindtap="clearHistory">
        <!-- 使用 van-icon 组件显示删除图标 -->
        <van-icon name="delete-o" size="21" />
        <!-- 清空历史的文本 -->
        <!-- <text class="font">清空历史</text> -->
      </view>
    </view>
    <!-- 内容区域 -->
    <view class="content">
      <!-- 循环显示搜索历史中的每一条记录 -->
      <view class="item" wx:for="{{historyList}}" wx:key="index" data-keyword="{{item}}" bindtap="onKeywordTap">{{item}}</view>
    </view>
  </view>

</view>

search.wxss

css 复制代码
/* pages/search/search.wxss */

/* 搜索历史容器样式 */
.history {
  padding: 10rpx;
}

/* 搜索历史标题样式 */
.history .title {
  display: flex;
  flex-wrap: wrap;
  justify-content: space-between;
  align-items: center;
  font-size: 30rpx;
  /* 灰色文字 */
  color: #666;
}

/* 搜索历史标题中的文本样式 */
.history .title .text {
  font-size: 25rpx;
}

/* 搜索历史标题中的清空按钮样式 */
.history .title .remove {
  /* 较浅的灰色文字 */
  color: #999;
  display: flex;
  align-items: center;
}

/* 搜索历史标题中的清空历史文本样式 */
.history .title .remove .font {
  /* 左侧内边距 */
  padding-left: 5rpx;
}

/* 搜索历史内容区域样式 */
.history .content {
  /* 上下内边距 */
  padding: 20rpx 0;
  /* 使用弹性盒布局 */
  display: flex;
  /* 允许换行 */
  flex-wrap: wrap;
}

/* 搜索历史内容项样式 */
.history .content .item {
  /* 背景颜色 */
  background: rgb(238, 236, 236);
  /* 文字颜色 */
  color: #333;
  /* 字体大小 */
  font-size: 30rpx;
  /* 内边距 */
  padding: 8rpx 25rpx;
  /* 外边距 */
  margin: 0 20rpx 20rpx 0;
  /* 圆角 */
  border-radius: 50rpx;
}

展示

无历史搜索时,不展示:

相关推荐
lmxnsI4 分钟前
表单验证不生效
前端·javascript·vue
郑大乾6668 分钟前
面试题-000000
前端·javascript·vue.js
我爱学习_zwj24 分钟前
Ajax原理-XMLHttpRequest
前端·javascript·ajax
大卫talk39 分钟前
Docker网络与数据卷持久化
前端·docker·自动化运维
夕阳_醉了1 小时前
细讲前端工程化
前端·javascript·工程化
yqcoder1 小时前
html 中前缀的 data-开头的元素属性是什么
开发语言·前端·javascript
mr_cmx1 小时前
vite 多环境变量配置
前端·vue.js
小茗同学阿2 小时前
如何实现分片上传功能:基于 Vue 和 iView 上传组件的详细教程
前端·vue.js·view design
轻口味2 小时前
【每日学点鸿蒙知识】组件对象做参数、2D在子线程中使用、Tabs组件联动、Web组件获取焦点、Text加载藏文
前端·华为·harmonyos
零点七九2 小时前
mac环境下VSCode的环境配置
前端·vue.js·vscode·macos