货无忧
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

190 lines
4.4 KiB

2 years ago
<!--
* @Author: weisheng
* @Date: 2020-10-31 11:27:05
* @LastEditTime: 2023-05-23 15:47:42
* @LastEditors: weisheng
* @Description: 搜索框
* @FilePath: \fant-mini-plus\src\uni_modules\fant-mini-plus\components\hd-search-bar\hd-search-bar.vue
* @symbol_custom_string_obkoro1: 记得注释
-->
<template>
<view class="search-bar">
<view class="search-input-box" :class="{ 'suffix-input-box': $slots.suffix, 'prefix-input-box': $slots.prefix }" @click="doClick">
<view class="prefix" v-if="$slots.prefix">
<!-- 输入框头部内容 -->
<slot name="prefix"></slot>
</view>
<view class="search-icon">
<hd-icon size="32rpx" name="ic_search_line"></hd-icon>
</view>
<input
class="search-input"
:class="{ 'suffix-input': $slots.suffix, 'prefix-input': $slots.prefix }"
:value="modelValue"
:disabled="disabled"
:placeholder="placeholder"
@input="doInput"
placeholder-class="search-input-placeholder"
placeholder-style="font-size: 28rpx;"
@confirm="doConfirm"
confirm-type="search"
type="search"
/>
<view class="clear-icon" v-if="modelValue !== '' && clearable" @click="doClear">
<hd-icon size="40rpx" name="ic_close_fill"></hd-icon>
</view>
<view class="suffix" v-if="$slots.suffix">
<!-- 输入框尾部内容 -->
<slot name="suffix"></slot>
</view>
</view>
<text @click="doCancel" v-if="showCancel" class="search-cancel">取消</text>
</view>
</template>
<script lang="ts" setup>
/**
* SearchBar 搜索
*
*/
interface Props {
// 输入框的值
modelValue: string
// 占位文字
placeholder?: string
// 是否禁用输入框
disabled?: boolean
// 是否显示返回
showCancel?: boolean
// 是否可清空
clearable?: boolean
}
const props = withDefaults(defineProps<Props>(), {
// 输入框的值
modelValue: '',
// 占位文字
placeholder: '',
// 是否禁用输入框
disabled: false,
// 是否显示返回
showCancel: true,
// 是否可清空
clearable: true
})
const emit = defineEmits(['update:modelValue', 'confirm', 'clear', 'cancel', 'click'])
// 输入框输入
function doInput(e) {
/**
* 输入框内容发生变化时触发
* @arg value输入框的内容建议通过v-model双向绑定输入值而不是监听此事件的形式
*/
emit('update:modelValue', e.detail.value)
}
// 输入框搜索确认事件
function doConfirm() {
/**
* 回车确认时触发
*/
emit('confirm')
}
// 清空输入框事件
function doClear() {
/**
* 清空输入值时触发
*/
emit('clear')
}
// 取消事件
function doCancel() {
if (!props.showCancel) return
/**
* 点击取消按钮时触发仅在showCancel为true时生效
*/
emit('cancel')
}
// 输入框点击事件
function doClick() {
if (props.disabled) return
/**
* 输入框被点击时触发仅在disabled为false时触发
*/
emit('click')
}
</script>
<style lang="scss" scoped>
$font-size-default: 28rpx;
@import '../../libs/css/index.scss';
.search-bar {
flex: 0 0 auto;
margin-bottom: 24rpx;
height: 120rpx;
width: 750rpx;
box-sizing: border-box;
overflow: hidden;
padding: 0 24rpx;
background-color: rgba(255, 255, 255, 1);
display: flex;
align-items: center;
.search-input-box {
display: flex;
justify-content: flex-start;
align-items: center;
flex: 1 1 auto;
position: relative;
padding: 0 12rpx;
width: 612rpx;
height: 72rpx;
width: 168px;
box-sizing: border-box;
background: $color-module-bg;
border-radius: 8rpx;
.search-input {
width: 100%;
height: 72rpx;
background: $color-module-bg;
margin: 0;
padding: 0;
font-size: 28rpx;
font-family: PingFangSC-Regular, PingFang SC;
color: #202124;
.search-input-placeholder {
font-size: $font-size-default;
font-family: PingFangSC-Regular, PingFang SC;
font-weight: 400;
color: $color-text-fourth;
}
}
.clear-icon {
flex: 0 0 auto;
width: 40rpx;
}
.search-icon {
flex: 0 0 auto;
width: 32rpx;
margin-right: 4rpx;
}
}
.suffix-input-box {
.suffix {
flex: 0 0 auto;
}
}
.prefix-input-box {
.prefix {
flex: 0 0 auto;
}
}
.search-cancel {
flex: 0 0 auto;
font-size: 28rpx;
color: $color-primary;
margin-left: 24rpx;
}
}
</style>