|
|
- <template>
- <!-- 自定义搜索框组件 -->
- <view class="search-container" >
- <view class="search-input" :style="{ backgroundColor: bgColor }">
- <!-- 搜索图标 -->
- <view v-if="searchIconAlign === 'left' && showIcon" class="search-icon left" @click="clickIcon">
- <text class="iconfont">🔍</text>
- </view>
-
- <view v-if="searchIconAlign === 'center' && showIcon" class="search-icon center" @click="clickIcon">
- <text class="iconfont">🔍</text>
- </view>
-
- <input
- :value="value"
- :placeholder="placeholder"
- type="text"
- :disabled="disabled"
- :maxlength="maxLength"
- @input="input"
- @confirm="search"
- @keyup.enter="search"
- class="input-field"
- :style="{
- textAlign: textAlign,
- borderRadius: borderRadius,
- height: height,
- width: width }"
- />
-
- <!-- 清除按钮 -->
- <view v-if="value && !disabled" class="clear-icon" @click="clear">
- <text class="iconfont">✕</text>
- </view>
-
- <!-- 搜索图标在右侧 -->
- <view v-if="searchIconAlign === 'right' && showIcon" class="search-icon right" @click="clickIcon">
- <text class="iconfont">🔍</text>
- </view>
- </view>
-
- <!-- 取消按钮 -->
- <view v-if="showCancel" class="cancel-btn" @click="cancel">
- <text>取消</text>
- </view>
- </view>
- </template>
-
- <script>
-
- export default{
- name:'Search',
- props:{
- placeholder:{
- type:String,
- default:'搜索'
- },
- // 是否展示搜索图标
- showIcon:{
- type:Boolean,
- default:true
- },
- // 是否展示右侧的取消按钮
- showCancel:{
- type:Boolean,
- default:true
- },
- // 搜索图标对齐位置
- searchIconAlign:{
- type:String,
- default:'left'
- },
- // 搜索框内容对齐方式
- textAlign:{
- type:String,
- default:'left'
- },
- // v-model传入的内容怎么用
- value:{
- type:String,
- default:''
- },
- // 搜索框内容改变时触发的事件
- height:{
- type:String,
- default:'60rpx'
- },
- width:{
- type:String,
- default:'100%'
- },
- bgColor:{
- type:String,
- default:'#f3f7f8'
- },
- disabled:{
- type:Boolean,
- default:false
- },
- maxLength:{
- type:Number,
- default:100
- },
- borderRadius:{
- type:String,
- default:'30rpx'
- },
-
- },
- methods:{
- clickIcon(){
- console.log('clickIcon');
- this.search()
-
- },
- clear(){
- // console.log('clear');
- this.$emit('clear', '')
- this.$emit('input', '')
- },
- search(){
- console.log('search', this.value);
-
- this.$emit('search', this.value)
- },
- cancel(){
- // console.log('cancel');
- this.$emit('cancel')
- this.$emit('input', '')
- },
- input(e){
- const value = e.detail.value
- console.log('input', value)
- this.$emit('input', value)
- // this.onChange(value)
- }
- },
- watch:{
- value(newVal){
- console.log(newVal)
- this.$emit('change', newVal)
- }
- }
- }
- </script>
-
- <style lang="scss" scoped>
- .search-container {
- display: flex;
- align-items: center;
- padding: 20rpx;
- // background-color: #fff;
-
- .search-input {
- flex: 1;
- display: flex;
- align-items: center;
- // height: 60rpx;
- border-radius: 30rpx;
- padding: 0 20rpx;
- position: relative;
-
- .search-icon {
- // flex: 0.1;
- display: flex;
- align-items: center;
- justify-content: center;
- width: 40rpx;
- height: 40rpx;
-
- &.left {
- margin-right: 10rpx;
- }
-
- &.right {
- margin-left: 10rpx;
- }
-
- .iconfont {
- font-size: 28rpx;
- color: #999;
- }
- }
-
- .input-field {
- flex: 1;
- padding-left: 4rpx;
- border: none;
- outline: none;
- background: transparent;
- font-size: 28rpx;
- color: #333;
- // background-color: #f1f6ff;
- &::placeholder {
- color: #999;
- }
- }
-
- .clear-icon {
- display: flex;
- // align-items: center;
- line-height: 40rpx;
- justify-content: center;
- width: 40rpx;
- height: 40rpx;
- margin-left: 10rpx;
- border-radius: 50%;
- background: #f0f0f0;
- .iconfont {
- font-size: 20rpx;
- color: #b2b2b2;
- }
- }
- }
-
- .cancel-btn {
- margin-left: 20rpx;
- padding: 0 20rpx;
-
- text {
- font-size: 28rpx;
- color: #007aff;
- }
- }
- }
- </style>
|