@minix-iot/ui
Version:
基于Vue的移动端轻量级UI组件库
155 lines (148 loc) • 4.02 kB
JSX
import Icon from '../icon/icon.jsx';
import { Namespace } from '../../utils/namespace';
const namespace = Namespace.Create('search-bar');
export default {
name: namespace.name,
components: {
Icon
},
props: {
value: {
type: String,
default: ''
},
placeholder: {
type: String,
default: ''
},
theme: {
type: String,
default: 'gray'
},
round: {
type: Boolean,
default: false
},
wrapperStyle:{
type: Object | String
},
showPrefix:{
type: Boolean,
default:false
},
showSuffix:{
type:Boolean,
default:false
}
},
model: {
prop: 'value',
event: 'change'
},
computed: {
wrapperCls(){
return namespace.derive('wrapper',[this.theme])
},
cls() {
return namespace.derive([
this.theme,
{
round: this.round
}
]);
},
iconCls(){
return namespace.derive('icon')
},
contentCls(){
return namespace.derive('content')
},
inputCls(){
return namespace.derive('content-input',[this.theme])
},
addonCls() {
return namespace.derive('addon');
},
prefixCls() {
return namespace.derive('prefix');
},
suffixCls() {
return namespace.derive('suffix');
},
valueInner: {
get() {
return this.value;
},
set(value) {
this.emitChange(value);
}
}
},
methods: {
emitChange(value) {
this.$emit('change', value);
},
onClear() {
this.emitChange('');
},
onReturn(e){
this.$emit('return',e)
},
onCancel(e){
this.$emit('cancel',e)
},
onFocus(e){
this.$emit('focus',e)
}
},
render(){
const renderPrefix = ()=>{
if(this.showPrefix){
return (
<div class={this.prefixCls}>
{
this.$slots.prefix || <Icon class="mx-icon-return" name="arrow-left" size="16" onClick={this.onReturn}/>
}
</div>
)
}
}
const renderIcon = ()=>(
<div class={this.iconCls}>
{this.$slots.icon || <Icon name="search" size="16" />}
</div>
)
const renderContent = ()=>(
<div class={this.contentCls}>
<input class={this.inputCls} type="text" vModel={this.valueInner} placeholder={this.placeholder} onFocus={this.onFocus}/>
</div>
)
const renderAddon = ()=> (
<div class={this.addonCls}>
{this.value && (this.$slots['addon'] || <Icon name="close" size="16" onClick={this.onClear} />)}
</div>
)
const renderSuffix = ()=>{
if(this.showSuffix){
return (
<div class={this.suffixCls}>
{
this.$slots.action || <div class={namespace.derive('suffix-cancel')} onClick={this.onCancel}>取消</div>
}
</div>
)
}
}
return (
<div class={this.wrapperCls} style={this.wrapperStyle}>
{renderPrefix()}
<div class={this.cls}>
{renderIcon()}
{renderContent()}
{renderAddon()}
</div>
{renderSuffix()}
</div>
)
}
}