searchBox.vue 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  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. clear:{
  51. type:Boolean,
  52. default:false
  53. }
  54. },
  55. watch: {
  56. clear(n){
  57. if(n){
  58. this.searchVal=''
  59. }
  60. }
  61. },
  62. data () {
  63. return {
  64. searchVal:'',
  65. isFocus:this.focus
  66. }
  67. },
  68. methods: {
  69. handleClearSearch(){
  70. this.searchVal=''
  71. this.$emit('change',this.searchVal)
  72. this.$emit('search')
  73. },
  74. handleInput(){
  75. this.$emit('change',this.searchVal)
  76. },
  77. handelFocus(){
  78. this.isFocus=true
  79. },
  80. handelBlur(){
  81. this.isFocus=false
  82. },
  83. handleSearch(){
  84. this.$emit('search')
  85. }
  86. }
  87. }
  88. </script>
  89. <style lang="scss" scoped>
  90. .search-box{
  91. border: 1px solid #E5E5E5;
  92. align-items: center;
  93. background-color: #F6F6F6;
  94. border-radius: 43rpx;
  95. padding: 0 30rpx;
  96. height: 70rpx;
  97. .search-icon{
  98. width: 48rpx;
  99. height: 48rpx;
  100. flex-shrink: 0;
  101. margin-right: 5rpx;
  102. }
  103. input{
  104. flex: 1;
  105. }
  106. .search-clear{
  107. width: 40rpx;
  108. height: 40rpx;
  109. flex-shrink: 0;
  110. margin-left: 5rpx;
  111. margin-right: 20rpx;
  112. }
  113. .right-btn{
  114. font-size: 28rpx;
  115. color: #E3B377;
  116. flex-shrink: 0;
  117. border-left: 1px solid #999999;
  118. padding-left: 20rpx;
  119. }
  120. }
  121. .search-focus{
  122. border-color: #E3B377;
  123. background-color: #fff;
  124. }
  125. </style>