最近在做一个小程序的页面,搜索框困扰了我很久,今天终于把搜索框给做了出来,记录一下过程
我主要使用的就是wx的if,当我输入框用户点击的时候,我前面的显示界面添加上false属性,然后我搜索页面显示出true的属性,至于模糊搜索,我是直接使用的js的匹配,话不多说,直接看成果和代码
代码
<view style="display: flex; align-items: center;background-color: rgb(71, 189, 254); margin-top: 200rpx;"> <input placeholder="请输入关键词" focus="{{inputFocus}}" bindfocus="onFocus" bindblur="onBlur" style="border: 1px solid #ccc; padding: 10rpx; border-radius: 10rpx; flex: 1;background-color: rgb(255, 255, 255);" /> <button wx:if="{{showSearch}}" bindtap="quxiao" style="margin-left: 10rpx; padding: 5rpx 10rpx; color: #fff; border-radius: 5rpx; width: 140rpx;background-color: rgb(71, 189, 254);" > 取消 </button> </view> <view class="another-container"> <view wx:if="{{searchResult.length > 0}}"> <!-- 显示搜索结果列表 --> <view class="search-list"> <view wx:if="{{showSearch && searchResult.length > 0}}"> <!-- 显示搜索结果列表 --> <view class="search-list"> <view class="article-item" wx:for="{{searchResult}}" wx:key="index" bindtap="onArticleTap" data-articleid="{{item.articleid}}"> <image class="article-image" src="{{item.image}}"></image> <view class="article-content"> <text class="article-title">{{item.title}}</text> <view class="article-time">{{item.releasetime}}</view> </view> </view> </view> </view> </view> </view> <view wx:else> <!-- 当搜索结果为空时显示暂无搜索结果 --> <view class="no-result">暂无搜索结果</view> </view> </view>
js
Page({ /** * 页面的初始数据 */ data: { showSearch: false, inputFocus: false, dataArray:[ { "articleid": "3490400c-9988-4b57-8f8a-92124cb9bef3", "title": "喝酒", "releasetime": "2024-2-17", "image": "https://pic.imgdb.cn/item/65d04d2a9f345e8d0321731d.jpg", "text": "嘿嘿", "teacherid": null }, { "articleid": "40b3e53f-d2c6-4f11-b1f7-965f6ce54800", "title": "检查作业呜呜呜", "releasetime": "2024-2-17", "image": "https://pic.imgdb.cn/item/65d0312b9f345e8d03cb438a.jpg", "text": "好难", "teacherid": null }, { "articleid": "db100597-07b5-4470-9ed5-8e69b258dd48", "title": "笨蛋去上学了不开心", "releasetime": "2024-2-17", "image": "https://pic.imgdb.cn/item/65ceff799f345e8d03690b4b.jpg", "text": null, "teacherid": null }, { "articleid": "1b275828-aea7-46f9-9912-0668772d0cd5", "title": "送的手链好好看❤", "releasetime": "2024-2-16", "image": "https://pic.imgdb.cn/item/65ceff939f345e8d03695d7d.jpg", "text": null, "teacherid": null }, { "articleid": "9f9edd79-92d0-4758-bdd0-c5a333c653fe", "title": "在家玩switch!", "releasetime": "2024-2-16", "image": "https://pic.imgdb.cn/item/65ceffa99f345e8d0369a7b0.jpg", "text": "", "teacherid": null }, { "articleid": "1aac74b2-67a6-40e7-8967-b665f64df05c", "title": "在家也会有彩虹!", "releasetime": "2024-2-14", "image": "https://pic.imgdb.cn/item/65ceffb69f345e8d0369d156.jpg", "text": "", "teacherid": null }, { "articleid": "eda6872f-8154-47d4-98b4-38057e35d41c", "title": "2是去看烟花", "releasetime": "2024-2-13", "image": "https://pic.imgdb.cn/item/65ceff799f345e8d03690a92.jpg", "text": "", "teacherid": null } ] }, onFocus: function() { this.setData({ inputFocus: true, showSearch: true, isshow:false }); }, onBlur: function(e) { this.setData({ isshow:false, showSearch: true, searchResult:null, Searchtxt:e.detail.value }) var txt=this.data.Searchtxt; var dataArray=this.data.dataArray console.log("开始搜索"+txt); const searchResult = this.fuzzySearch(dataArray, txt); console.log(searchResult); this.setData({ searchResult:searchResult }) }, quxiao: function() { this.setData({ showSearch: false, }) }, fuzzySearch(arr, searchText) { const filteredArray = arr.filter(item => { const titleMatch = item.title.toLowerCase().includes(searchText.toLowerCase()); const timeMatch = item.releasetime.toLowerCase().includes(searchText.toLowerCase()); const textMatch = item.text && item.text.toLowerCase().includes(searchText.toLowerCase()); return titleMatch || timeMatch || textMatch; }); return filteredArray; }, /** * 生命周期函数--监听页面加载 */ onLoad: function (options) { }, /** * 生命周期函数--监听页面初次渲染完成 */ onReady: function () { }, /** * 生命周期函数--监听页面显示 */ onShow: function () { }, /** * 生命周期函数--监听页面隐藏 */ onHide: function () { }, /** * 生命周期函数--监听页面卸载 */ onUnload: function () { }, /** * 页面相关事件处理函数--监听用户下拉动作 */ onPullDownRefresh: function () { }, /** * 页面上拉触底事件的处理函数 */ onReachBottom: function () { }, /** * 用户点击右上角分享 */ onShareAppMessage: function () { } })
.search-list{ margin-top: 20rpx; } .article-list { width: 80%; } .article-item { margin-bottom: 20rpx; padding: 20rpx; background-color: #fff; border-radius: 10rpx; box-shadow: 0 2rpx 6rpx rgba(0, 0, 0, 0.1); display: flex; } .article-item:last-child { margin-bottom: 0; } .article-image { width: 120rpx; height: 120rpx; margin-right: 20rpx; border-radius: 10rpx; } .article-content { flex: 1; } .article-title { font-size: 32rpx; font-weight: bold; margin-top: 10rpx; } .article-time { color: #999; font-size: 24rpx; margin-top: 10rpx; } .article-text { font-size: 28rpx; margin-top: 10rpx; } .no-result { text-align: center; font-size: 32rpx; color: #999; margin-top: 20rpx; }