@ -0,0 +1,298 @@
< template >
< view class = "uni-searchbar" >
< view : style = "{borderRadius:radius+'px',backgroundColor: bgColor}" class = "uni-searchbar__box"
@click ="searchClick" >
< view class = "uni-searchbar__box-icon-search" >
< slot name = "searchIcon" >
< uni-icons color = "#c0c4cc" size = "18" type = "search" / >
< / slot >
< / view >
< input v-if = "show || searchVal" :focus="showSync" :disabled="readonly" :placeholder="placeholderText" :maxlength="maxlength"
class = "uni-searchbar__box-search-input" confirm -type = " search " type = "text" v-model = "searchVal"
@confirm ="confirm" @blur ="blur" @focus ="emitFocus" / >
< text v-else class = "uni-searchbar__text-placeholder" > { { placeholder } } < / text >
< view v-if = "show && (clearButton==='always'||clearButton==='auto'&&searchVal!=='') &&!readonly"
class = "uni-searchbar__box-icon-clear" @click ="clear" >
< slot name = "clearIcon" >
< uni-icons color = "#c0c4cc" size = "20" type = "clear" / >
< / slot >
< / view >
< / view >
< text @click ="cancel" class = "uni-searchbar__cancel"
v-if = "cancelButton ==='always' || show && cancelButton ==='auto'" > {{ cancelTextI18n }} < / text >
< / view >
< / template >
< script >
import {
initVueI18n
} from '@dcloudio/uni-i18n'
import messages from './i18n/index.js'
const {
t
} = initVueI18n ( messages )
/**
* SearchBar 搜索栏
* @description 搜索栏组件,通常用于搜索商品、文章等
* @tutorial https://ext.dcloud.net.cn/plugin?id=866
* @property {Number} radius 搜索栏圆角
* @property {Number} maxlength 输入最大长度
* @property {String} placeholder 搜索栏Placeholder
* @property {String} clearButton = [always|auto|none] 是否显示清除按钮
* @value always 一直显示
* @value auto 输入框不为空时显示
* @value none 一直不显示
* @property {String} cancelButton = [always|auto|none] 是否显示取消按钮
* @value always 一直显示
* @value auto 输入框不为空时显示
* @value none 一直不显示
* @property {String} cancelText 取消按钮的文字
* @property {String} bgColor 输入框背景颜色
* @property {Boolean} focus 是否自动聚焦
* @property {Boolean} readonly 组件只读,不能有任何操作,只做展示
* @event {Function} confirm uniSearchBar 的输入框 confirm 事件, 返回参数为uniSearchBar的value, e={value:Number}
* @event {Function} input uniSearchBar 的 value 改变时触发事件, 返回参数为uniSearchBar的value, e=value
* @event {Function} cancel 点击取消按钮时触发事件, 返回参数为uniSearchBar的value, e={value:Number}
* @event {Function} clear 点击清除按钮时触发事件, 返回参数为uniSearchBar的value, e={value:Number}
* @event {Function} blur input失去焦点时触发事件, 返回参数为uniSearchBar的value, e={value:Number}
*/
export default {
name : "UniSearchBar" ,
emits : [ 'input' , 'update:modelValue' , 'clear' , 'cancel' , 'confirm' , 'blur' , 'focus' ] ,
props : {
placeholder : {
type : String ,
default : ""
} ,
radius : {
type : [ Number , String ] ,
default : 5
} ,
clearButton : {
type : String ,
default : "auto"
} ,
cancelButton : {
type : String ,
default : "auto"
} ,
cancelText : {
type : String ,
default : '取消'
} ,
bgColor : {
type : String ,
default : "#F8F8F8"
} ,
maxlength : {
type : [ Number , String ] ,
default : 100
} ,
value : {
type : [ Number , String ] ,
default : ""
} ,
modelValue : {
type : [ Number , String ] ,
default : ""
} ,
focus : {
type : Boolean ,
default : false
} ,
readonly : {
type : Boolean ,
default : false
}
} ,
data ( ) {
return {
show : false ,
showSync : false ,
searchVal : ''
}
} ,
computed : {
cancelTextI18n ( ) {
return this . cancelText || t ( "uni-search-bar.cancel" )
} ,
placeholderText ( ) {
return this . placeholder || t ( "uni-search-bar.placeholder" )
}
} ,
watch : {
// #ifndef VUE3
value : {
immediate : true ,
handler ( newVal ) {
this . searchVal = newVal
if ( newVal ) {
this . show = true
}
}
} ,
// #endif
// #ifdef VUE3
modelValue : {
immediate : true ,
handler ( newVal ) {
this . searchVal = newVal
if ( newVal ) {
this . show = true
}
}
} ,
// #endif
focus : {
immediate : true ,
handler ( newVal ) {
if ( newVal ) {
if ( this . readonly ) return
this . show = true ;
this . $nextTick ( ( ) => {
this . showSync = true
} )
}
}
} ,
searchVal ( newVal , oldVal ) {
this . $emit ( "input" , newVal )
// #ifdef VUE3
this . $emit ( "update:modelValue" , newVal )
// #endif
}
} ,
methods : {
searchClick ( ) {
if ( this . readonly ) return
if ( this . show ) {
return
}
this . show = true ;
this . $nextTick ( ( ) => {
this . showSync = true
} )
} ,
clear ( ) {
this . $emit ( "clear" , {
value : this . searchVal
} )
this . searchVal = ""
} ,
cancel ( ) {
if ( this . readonly ) return
this . $emit ( "cancel" , {
value : this . searchVal
} ) ;
this . searchVal = ""
this . show = false
this . showSync = false
// #ifndef APP-PLUS
uni . hideKeyboard ( )
// #endif
// #ifdef APP-PLUS
plus . key . hideSoftKeybord ( )
// #endif
} ,
confirm ( ) {
// #ifndef APP-PLUS
uni . hideKeyboard ( ) ;
// #endif
// #ifdef APP-PLUS
plus . key . hideSoftKeybord ( )
// #endif
this . $emit ( "confirm" , {
value : this . searchVal
} )
} ,
blur ( ) {
// #ifndef APP-PLUS
uni . hideKeyboard ( ) ;
// #endif
// #ifdef APP-PLUS
plus . key . hideSoftKeybord ( )
// #endif
this . $emit ( "blur" , {
value : this . searchVal
} )
} ,
emitFocus ( e ) {
this . $emit ( "focus" , e . detail )
}
}
} ;
< / script >
< style lang = "scss" >
$uni - searchbar - height : 36 px ;
. uni - searchbar {
/* #ifndef APP-NVUE */
display : flex ;
/* #endif */
flex - direction : row ;
position : relative ;
padding : 10 px ;
// background-color: #fff;
}
. uni - searchbar _ _box {
/* #ifndef APP-NVUE */
display : flex ;
box - sizing : border - box ;
/* #endif */
overflow : hidden ;
position : relative ;
flex : 1 ;
justify - content : center ;
flex - direction : row ;
align - items : center ;
height : $uni - searchbar - height ;
padding : 5 px 8 px 5 px 0 px ;
}
. uni - searchbar _ _box - icon - search {
/* #ifndef APP-NVUE */
display : flex ;
/* #endif */
flex - direction : row ;
// width: 32px;
padding : 0 8 px ;
justify - content : center ;
align - items : center ;
color : # B3B3B3 ;
}
. uni - searchbar _ _box - search - input {
flex : 1 ;
font - size : 14 px ;
color : # 333 ;
}
. uni - searchbar _ _box - icon - clear {
align - items : center ;
line - height : 24 px ;
padding - left : 8 px ;
/* #ifdef H5 */
cursor : pointer ;
/* #endif */
}
. uni - searchbar _ _text - placeholder {
font - size : 14 px ;
color : # B3B3B3 ;
margin - left : 5 px ;
}
. uni - searchbar _ _cancel {
padding - left : 10 px ;
line - height : $uni - searchbar - height ;
font - size : 14 px ;
color : # 333333 ;
/* #ifdef H5 */
cursor : pointer ;
/* #endif */
}
< / style >