searchBox.vue 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. <template>
  2. <view :class="['flex search-box',isFocus||searchVal?'search-focus':'']">
  3. <image
  4. class="search-icon"
  5. :src="isFocus||searchVal?'../static/search-icon-s.png':'../static/search-icon.png'"
  6. mode="aspectFill"
  7. />
  8. <input
  9. type="text"
  10. :maxlength="-1"
  11. v-model="searchVal"
  12. :placeholder="placeholder"
  13. :focus="isFocus"
  14. @focus="handelFocus"
  15. @blur="handelBlur"
  16. @confirm="handleSearch"
  17. @input="handleInput"
  18. confirm-type="search"
  19. />
  20. <image
  21. class="search-clear"
  22. src="../static/search-del.png"
  23. mode="aspectFill"
  24. v-if="searchVal"
  25. @click="handleClearSearch"
  26. />
  27. <view class="right-btn" v-if="hasRightBtn&&searchVal" @click="handleSearch">搜索</view>
  28. </view>
  29. </template>
  30. <script>
  31. export default {
  32. props: {
  33. hasRightBtn:{
  34. type:Boolean,
  35. default:true
  36. },
  37. placeholder:{
  38. type:String,
  39. default:'请输入搜索关键词'
  40. },
  41. focus:{
  42. type:Boolean,
  43. default:false
  44. }
  45. },
  46. data () {
  47. return {
  48. searchVal:'',
  49. isFocus:this.focus
  50. }
  51. },
  52. methods: {
  53. handleClearSearch(){
  54. this.searchVal=''
  55. this.$emit('change',this.searchVal)
  56. this.$emit('search')
  57. },
  58. handleInput(){
  59. this.$emit('change',this.searchVal)
  60. },
  61. handelFocus(){
  62. this.isFocus=true
  63. },
  64. handelBlur(){
  65. this.isFocus=false
  66. },
  67. handleSearch(){
  68. this.$emit('search')
  69. }
  70. }
  71. }
  72. </script>
  73. <style lang="scss" scoped>
  74. .search-box{
  75. border: 1px solid #E5E5E5;
  76. align-items: center;
  77. background-color: #F6F6F6;
  78. border-radius: 43rpx;
  79. padding: 0 30rpx;
  80. height: 70rpx;
  81. .search-icon{
  82. width: 48rpx;
  83. height: 48rpx;
  84. flex-shrink: 0;
  85. margin-right: 5rpx;
  86. }
  87. input{
  88. flex: 1;
  89. }
  90. .search-clear{
  91. width: 40rpx;
  92. height: 40rpx;
  93. flex-shrink: 0;
  94. margin-left: 5rpx;
  95. margin-right: 20rpx;
  96. }
  97. .right-btn{
  98. font-size: 28rpx;
  99. color: #E3B377;
  100. flex-shrink: 0;
  101. border-left: 1px solid #999999;
  102. padding-left: 20rpx;
  103. }
  104. }
  105. .search-focus{
  106. border-color: #E3B377;
  107. background-color: #fff;
  108. }
  109. </style>