> 文章列表 > uniapp-搜索配置

uniapp-搜索配置

uniapp-搜索配置

自定义搜索组件

1.定义组件的 UI 结构:

<template><!-- 通过属性绑定的形式,为 .my-search-container 盒子和 .my-search-box 盒子动态绑定 style 属性 --><view class="my-search-container" :style="{'background-color': bgcolor}"><!-- 使用 view 组件模拟 input 输入框的样式 --><!-- 在 my-search 自定义组件内部,给类名为 .my-search-box 的 view 绑定 click 事件处理函数 --><view class="my-search-box" :style="{'border-radius': radius + 'px'}" @click="searchBoxHandler"><uni-icons type="search" size="17"></uni-icons><text class="placeholder">搜索</text></view></view>
</template>

2.自定义属性与事件:

<script>export default {name:"my-search",data() {return {				};},methods: {// 点击了模拟的 input 输入框searchBoxHandler() {// 触发外界通过 @click 绑定的 click 事件处理函数this.$emit('click')}},props: {// UI结构中的背景颜色bgcolor: {type: String,default: '#C00000'},//  UI结构中的圆角尺寸radius: {type: Number,// 单位是 pxdefault: 18}}}
</script>

3.美化组件的样式:

<style lang="scss">
.my-search-container {// 移除背景颜色,改由 props 属性控制// background-color: #c00000;height: 50px;padding: 0 10px;display: flex;align-items: center;
}.my-search-box {height: 36px;background-color: #ffffff;// 移除圆角尺寸,改由 props 属性控制// border-radius: 15px;width: 100%;display: flex;align-items: center;justify-content: center;.placeholder {font-size: 15px;margin-left: 5px;}
}
</style>

4.其他页面的调用:

<template><!-- 使用自定义的搜索组件 --><my-search @click="gotoSearch"></my-search>
</template><script>export default{//定义 gotoSearch 事件处理函数methods: {// 跳转到分包中的搜索页面gotoSearch() {uni.navigateTo({url: '/subpkg/search/search'})}}}
</script><!-- 吸顶效果的实现 -->
<style lang="scss">.search-box {// 设置定位效果为“吸顶”position: sticky;// 吸顶的“位置”top: 0;// 提高层级,防止被轮播图覆盖z-index: 999;}
</style>

效果:

uniapp-搜索配置

搜索页面

1.定义页面的UI结构:

<template><view><view class="search-box"><!-- 使用 uni-ui 提供的搜索组件 --><uni-search-bar @input="input" :radius="100" cancelButton="none"  placeholder="请输入搜索内容"></uni-search-bar></view><!-- 搜索建议列表 搜索长度不为0时显示--><view class="sugg-list" v-if="searchResults.length !== 0"><view class="sugg-item" v-for="(item, i) in searchResults" :key="i" @click="gotoDetail(item.goods_id)"><view class="goods-name">{{item.goods_name}}</view><uni-icons type="arrowright" size="16"></uni-icons></view></view><!-- 搜索历史 搜索长度为0时显示--><view class="history-box" v-else><!-- 标题区域 --><view class="history-title"><text>搜索历史</text><uni-icons type="trash" size="17" @click="cleanHistory"></uni-icons></view><!-- 列表区域 --><view class="history-list"><uni-tag :text="item" v-for="(item, i) in historys" :key="i" @click="gotoGoodsList(item)"></uni-tag></view></view></view>
</template>

2.自定义脚本:

<script>export default {data() {return {// 延时器的 timerIdtimer: null,// 搜索关键词kw: '',// 搜索结果列表searchResults: [],// 搜索关键词的历史记录(假数据)historyList: ['a', 'app', 'apple']};},methods: {//input 事件处理函数input(e) {// 清除 timer 对应的延时器clearTimeout(this.timer)// 重新启动一个延时器,并把 timerId 赋值给 this.timerthis.timer = setTimeout(() => {// 如果 500 毫秒内,没有触发新的输入事件,则为搜索关键词赋值this.kw = ethis.getSearchList()console.log(this.kw)}, 500)},async getSearchList() {// 判断关键词是否为空if (this.kw === '') {this.searchResults = []return}// 发起请求,获取搜索建议列表const { data: res } = await uni.$http.get('/api/public/v1/goods/qsearch', { query: this.kw })if (res.meta.status !== 200) return uni.$showMsg()this.searchResults = res.message// 1. 查询到搜索建议之后,调用 saveSearchHistory() 方法保存搜索关键词this.saveSearchHistory()},gotoDetail(goods_id) {uni.navigateTo({// 指定详情页面的 URL 地址,并传递 goods_id 参数url: '/subpkg/goods_detail/goods_detail?goods_id=' + goods_id})},// 2. 保存搜索关键词的方法// 保存搜索关键词为历史记录saveSearchHistory() {// this.historyList.push(this.kw)// 1. 将 Array 数组转化为 Set 对象(利用set去重)const set = new Set(this.historyList)// 2. 调用 Set 对象的 delete 方法,移除对应的元素set.delete(this.kw)// 3. 调用 Set 对象的 add 方法,向 Set 中添加元素set.add(this.kw)// 4. 将 Set 对象转化为 Array 数组this.historyList = Array.from(set)// 调用 uni.setStorageSync(key, value) 将搜索历史记录持久化存储到本地uni.setStorageSync('kw', JSON.stringify(this.historyList))},// 清空搜索历史记录cleanHistory() {// 清空 data 中保存的搜索历史this.historyList = []// 清空本地存储中记录的搜索历史uni.setStorageSync('kw', '[]')},// 点击跳转到商品列表页面gotoGoodsList(kw) {uni.navigateTo({// 指定详情页面的 URL 地址,并传递 goods_id 参数url: '/subpkg/goods_list/goods_list?query=' + kw})}},computed: {historys() {// 注意:由于数组是引用类型,所以不要直接基于原数组调用 reverse 方法,以免修改原数组中元素的顺序// 而是应该新建一个内存无关的数组,再进行 reverse 反转return [...this.historyList].reverse()}},//加载本地存储的搜索历史记录onLoad() {this.historyList = JSON.parse(uni.getStorageSync('kw') || '[]')}}
</script>

3.美化样式:

<style lang="scss">
.search-box {// 设置定位效果为“吸顶”position: sticky;// 吸顶的“位置”top: 0;// 提高层级,防止被轮播图覆盖z-index: 999;
}.sugg-list {padding: 0 5px;.sugg-item {font-size: 12px;padding: 13px 0;border-bottom: 1px solid #efefef;display: flex;align-items: center;justify-content: space-between;.goods-name {// 文字不允许换行(单行文本)white-space: nowrap;// 溢出部分隐藏overflow: hidden;// 文本溢出后,使用 ... 代替text-overflow: ellipsis;margin-right: 3px;}}
}.history-box {padding: 0 5px;.history-title {display: flex;justify-content: space-between;align-items: center;height: 40px;font-size: 13px;border-bottom: 1px solid #efefef;}.history-list {display: flex;flex-wrap: wrap;.uni-tag {margin-top: 5px;margin-right: 5px;}}
}
</style>