search.vue 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. <template>
  2. <view class="bg-white" style="min-height: 100vh;">
  3. <view class="cu-bar bg-white ">
  4. <view class="search-form round">
  5. <text class="cuIcon-search" />
  6. <input tyle="font-size: 34rpx;" v-model="searchKey" :adjust-position="false" type="text"
  7. placeholder="请输入搜索内容" confirm-type="search" />
  8. <text class="cuIcon-roundclose" style="font-size: 34rpx;color: #6c6c6c;" v-if="searchClose"
  9. @click="clear" />
  10. </view>
  11. <view class="action" @click="bindsearch">
  12. <view class="cu-btn round sm" style="background-color: #f0b363;padding: 28rpx 36rpx;">
  13. 搜 索
  14. </view>
  15. </view>
  16. </view>
  17. <view v-if="searchKey.length<=0||datalist==null">
  18. <view class="search">
  19. <view class="top">
  20. <text class="left">历史搜索</text>
  21. <view class="center" v-if="!$isEmpty(oldKeywordList)">
  22. <text @click="delOldKeywordList" class="cuIcon-delete text-gray"
  23. style="font-size: 34rpx;"></text>
  24. </view>
  25. </view>
  26. <view class="list">
  27. <view class="cu-tag "
  28. @click="searchKey=item"
  29. style="background-color: #f3f3f4;color: #6c6c6c;padding: 16rpx 26rpx;border-radius: 4rpx;margin-bottom: 16rpx;"
  30. v-for="(item,index) in oldKeywordList" :key="index">
  31. {{item}}
  32. </view>
  33. </view>
  34. </view>
  35. </view>
  36. <view class="" v-else>
  37. <search-list :list="datalist"></search-list>
  38. </view>
  39. </view>
  40. </template>
  41. <script>
  42. import searchList from "./comps/search-list.vue"
  43. export default {
  44. components:{
  45. searchList
  46. },
  47. data() {
  48. return {
  49. searchKey: '',
  50. oldKeywordList: [],
  51. datalist: null
  52. }
  53. },
  54. onLoad() {
  55. this.loadOldKeyword();
  56. },
  57. computed: {
  58. searchClose: {
  59. get() {
  60. if (this.$isEmpty(this.searchKey)) {
  61. return false
  62. } else {
  63. return true
  64. }
  65. }
  66. }
  67. },
  68. methods: {
  69. clear(){
  70. this.searchKey= ''
  71. this.datalist=null
  72. },
  73. delOldKeywordList() {
  74. this.oldKeywordList = [];
  75. uni.removeStorage({
  76. key: 'OldKeys'
  77. });
  78. },
  79. bindsearch() {
  80. if (this.$isEmpty(this.searchKey)) {
  81. return
  82. }
  83. //搜索todo
  84. this.fetchList()
  85. this.saveKeyword()
  86. },
  87. //加载历史搜索,自动读取本地Storage
  88. loadOldKeyword() {
  89. uni.getStorage({
  90. key: 'OldKeys',
  91. success: res => {
  92. var OldKeys = JSON.parse(res.data);
  93. this.oldKeywordList = OldKeys;
  94. }
  95. });
  96. },
  97. //保存关键字到历史记录
  98. saveKeyword() {
  99. let keyword = this.searchKey
  100. uni.getStorage({
  101. key: 'OldKeys',
  102. success: res => {
  103. //获取历史搜索词
  104. var OldKeys = JSON.parse(res.data);
  105. var findIndex = OldKeys.indexOf(keyword);
  106. if (findIndex == -1) {
  107. //如果历史搜索词里没有该输入的搜索词,就添加进数组头
  108. OldKeys.unshift(keyword);
  109. } else {
  110. //如果有,就删除该搜索词并插进数组头
  111. OldKeys.splice(findIndex, 1);
  112. OldKeys.unshift(keyword);
  113. }
  114. //最多10个纪录,如果超过十条记录,就弹出最后一个元素
  115. OldKeys.length > 10 && OldKeys.pop();
  116. uni.setStorage({
  117. key: 'OldKeys',
  118. data: JSON.stringify(OldKeys)
  119. });
  120. this.oldKeywordList = OldKeys; //更新历史搜索
  121. },
  122. fail: e => {
  123. var OldKeys = [keyword];
  124. uni.setStorage({
  125. key: 'OldKeys',
  126. data: JSON.stringify(OldKeys)
  127. });
  128. this.oldKeywordList = OldKeys; //更新历史搜索
  129. }
  130. });
  131. },
  132. fetchList(){
  133. let params={
  134. name:this.searchKey
  135. }
  136. this.$api.shop.list(params).then(res=>{
  137. this.datalist=res.data.records
  138. })
  139. },
  140. }
  141. }
  142. </script>
  143. <style lang="scss" scoped>
  144. page {
  145. background-color: #FFFFFF;
  146. }
  147. .search {
  148. padding: 20rpx;
  149. margin: 0rpx 20rpx;
  150. .top {
  151. display: flex;
  152. justify-content: space-between;
  153. .left {
  154. font-size: 28rpx;
  155. font-weight: 800;
  156. }
  157. }
  158. .list {
  159. padding-top: 30rpx;
  160. display: flex;
  161. flex-wrap: wrap;
  162. justify-content: flex-start;
  163. }
  164. }
  165. </style>