searchBox.vue 2.6 KB

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