mehaotian-search-revision.vue 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278
  1. <template>
  2. <view class="serach">
  3. <view class="content" :style="{'border-radius':radius+'px'}">
  4. <!-- HM修改 增加进入输入状态的点击范围 -->
  5. <view class="content-box" @click="getFocus">
  6. <text class="icon icon-serach"></text>
  7. <input class="uni-input" focus placeholder="自动获得焦点" />
  8. <!-- HM修改 增加placeholder input confirm-type confirm-->
  9. <!-- <input ref='myInput' :placeholder="placeholder" placeholder-style='font-size:28rpx' @input="inputChange"
  10. confirm-type="search" @confirm="triggerConfirm" class="input" focus v-model="inputVal"
  11. @blur="blur" /> -->
  12. <!-- <view v-if="!active && mode === 2" class="input sub" @click="getFocus">请输入搜索内容</view> -->
  13. <!-- HM修改 @click换成@click.stop阻止冒泡 -->
  14. <text v-if="isDelShow" class="icon icon-del" @click.stop="clear"></text>
  15. </view>
  16. <!-- <view v-show="(active&&show&&button === 'inside')||(isDelShow && button === 'inside')" class="serachBtn"
  17. @click="search">
  18. 搜索
  19. </view> -->
  20. </view>
  21. <view v-if="button === 'outside'" class="button" :class="{'active':show||active}" @click="search">
  22. <view class="button-item">{{!show?searchName:'搜索'}}</view>
  23. </view>
  24. </view>
  25. </template>
  26. <script>
  27. export default {
  28. props: {
  29. mode: {
  30. value: Number,
  31. default: 1
  32. },
  33. //HM修改 定义默认搜索关键词(水印文字)
  34. placeholder: {
  35. value: String,
  36. default: '请输入搜索内容'
  37. },
  38. oldsearch:{
  39. type: String,
  40. default: ''
  41. },
  42. value: {
  43. type: String,
  44. default: false
  45. },
  46. button: {
  47. value: String,
  48. default: 'outside'
  49. },
  50. show: {
  51. value: Boolean,
  52. default: true
  53. },
  54. radius: {
  55. value: String,
  56. default: 60
  57. }
  58. },
  59. data() {
  60. return {
  61. active: false,
  62. inputVal: uni.getStorageSync('jiaoyikeyword')?uni.getStorageSync('jiaoyikeyword'):'',
  63. searchName: '取消',
  64. isDelShow: false,
  65. isFocus: false,
  66. setfocus:false
  67. };
  68. },
  69. watch:{
  70. inputVal:{
  71. handler(oldValue, newValue) {
  72. console.log(oldValue, newValue,11111)
  73. },
  74. deep:true,
  75. immediate:true,
  76. }
  77. },
  78. methods: {
  79. //HM修改 触发组件confirm事件
  80. triggerConfirm() {
  81. this.$emit('confirm', false);
  82. },
  83. //HM修改 触发组件input事件
  84. inputChange(event) {
  85. var keyword = event.detail.value;
  86. this.$emit('input', keyword);
  87. if (this.inputVal) {
  88. console.log(33333)
  89. this.isDelShow = true;
  90. }
  91. },
  92. focus() {
  93. console.log(222222)
  94. this.active = true;
  95. //HM修改 增加获取焦点判断
  96. if (this.inputVal) {
  97. this.isDelShow = true;
  98. }
  99. },
  100. blur() {
  101. this.isFocus = false;
  102. if (!this.inputVal) {
  103. this.active = false;
  104. }
  105. },
  106. clear() {
  107. //HM修改 收起键盘
  108. uni.hideKeyboard();
  109. this.isFocus = false;
  110. this.inputVal = '';
  111. this.active = false;
  112. //HM修改 清空内容时候触发组件input
  113. this.$emit('input', '');
  114. //this.$emit('search', '');//HM修改 清空内容时候不进行搜索
  115. },
  116. getFocus() {
  117. this.isFocus = true;
  118. },
  119. setFocus() {
  120. uni.hideKeyboard()
  121. this.$nextTick(() => {
  122. // this.isFocus = true;
  123. // console.log(this.$refs)
  124. // this.$refs.myInput.focus();
  125. // // 加这一步是为了对Input没有成功聚焦情况的补救(渲染先后的关系)
  126. })
  127. },
  128. search() {
  129. // console.log(11111)
  130. //HM修改 增加点击取消时候退出输入状态,内容为空时,输入默认关键字
  131. if (!this.inputVal) {
  132. if (!this.show && this.searchName == '取消') {
  133. uni.hideKeyboard();
  134. this.isFocus = false;
  135. this.active = false;
  136. return;
  137. }
  138. }
  139. console.log(this.inputVal);
  140. this.$emit('search', this.inputVal ? this.inputVal : this.placeholder);
  141. }
  142. },
  143. watch: {
  144. inputVal(newVal) {
  145. if (newVal) {
  146. this.searchName = '搜索';
  147. //this.isDelShow = true; //HM修改 直接点击页面预设关键字样式异常,注销
  148. } else {
  149. this.searchName = '取消';
  150. this.isDelShow = false;
  151. }
  152. },
  153. //HM修改 双向绑定
  154. value(val) {
  155. this.inputVal = val;
  156. },
  157. }
  158. };
  159. </script>
  160. <style lang="scss" scoped>
  161. .serach {
  162. display: flex;
  163. width: 100%;
  164. //border-bottom: 1px #f5f5f5 solid; //HM修改 去掉边框
  165. box-sizing: border-box;
  166. font-size: $uni-font-size-base;
  167. .content {
  168. display: flex;
  169. align-items: center;
  170. width: 100%;
  171. height: 60upx;
  172. //border: 1px #ccc solid; //HM修改 去掉边框
  173. background: #fff;
  174. overflow: hidden;
  175. transition: all 0.2s linear;
  176. border-radius: 30px;
  177. .content-box {
  178. background: #F5F6F9;
  179. width: 100%;
  180. display: flex;
  181. align-items: center;
  182. &.center {
  183. justify-content: center;
  184. }
  185. .icon {
  186. padding: 0 15upx;
  187. &.icon-del {
  188. font-size: 30upx;
  189. &:before {
  190. content: "\e644";
  191. }
  192. }
  193. &.icon-serach:before {
  194. content: "\e61c";
  195. }
  196. }
  197. .input {
  198. width: 100%;
  199. max-width: 100%;
  200. line-height: 60upx;
  201. height: 60upx;
  202. transition: all 0.2s linear;
  203. &.center {
  204. width: 200upx;
  205. }
  206. &.sub {
  207. // position: absolute;
  208. width: auto;
  209. color: grey;
  210. }
  211. }
  212. }
  213. .serachBtn {
  214. height: 100%;
  215. flex-shrink: 0;
  216. padding: 0 30upx;
  217. //HM修改 按钮背景色
  218. background: linear-gradient(to right, #ff9801, #ff570a);
  219. //background: $uni-color-success;
  220. line-height: 60upx;
  221. color: #fff;
  222. //border-left: 1px #ccc solid; //HM修改 去掉边框
  223. transition: all 0.3s;
  224. }
  225. }
  226. .button {
  227. display: flex;
  228. align-items: center;
  229. justify-content: center;
  230. position: relative;
  231. flex-shrink: 0;
  232. width: 0;
  233. transition: all 0.2s linear;
  234. white-space: nowrap;
  235. overflow: hidden;
  236. &.active {
  237. padding-left: 15upx;
  238. width: 100upx;
  239. }
  240. }
  241. }
  242. //HM修改 把字体改成本地加载
  243. @font-face {
  244. font-family: "iconfont";
  245. src: url('data:application/x-font-woff;charset=utf-8;base64,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');
  246. }
  247. .icon {
  248. font-family: iconfont;
  249. font-size: 32upx;
  250. font-style: normal;
  251. color: #999;
  252. }
  253. </style>