UNPKG

@minix-iot/ui

Version:

基于Vue的移动端轻量级UI组件库

187 lines (185 loc) 4.98 kB
import Popup from '../popup/popup.jsx'; import Icon from '../icon/icon.jsx'; import { Namespace } from '../../utils/namespace'; const namespace = Namespace.Create('action-sheet'); export default { name: namespace.name, components: { Popup, Icon }, props: { show: { type: Boolean, default: false }, overlay: { type: Boolean, default: true }, zIndex: { type: Number, default: 1030 }, lockScroll: { type: Boolean, default: false }, duration: { type: Number, default: 0.36 }, overlayStyle: { type: Object, default: () => { } }, round: { type: Boolean, default: true }, closeOnClickOveraly: { type: Boolean, default: true }, safeAreaInsetBottom: { type: Boolean, default: true }, actions: { type: Array, default: () => [] }, title: { type: String, default: '' }, description: { type: String, default: '' }, cancelText: { type: String, default: '' }, closeOnClickAction: { type: Boolean, default: true }, background:{ type: String } }, model: { prop: 'show', event: 'close' }, computed: { cls() { return namespace.derive(); }, headerCls() { return namespace.derive('header'); }, titleCls() { return namespace.derive('header-title'); }, descCls() { return namespace.derive('header-desc'); }, bodyCls() { return namespace.derive('body'); }, footerCls() { return namespace.derive('footer'); }, btnCls() { return namespace.derive('footer-btn'); }, }, methods: { getActionItemCls(item) { return namespace.derive('body-action-item', { disabled: item.disabled }); }, getActionItemStyle(item) { const res = {}; if (item.color) { res.color = item.color; } return res; }, close() { this.$emit('close', false); }, onSelectItem(item, e) { if (this.closeOnClickAction) { this.close(); } this.$emit('select', item, e); }, onClickCancel() { this.close() }, onClose() { this.close(); } }, render() { const renderHeader = () => { if(this.title){ return ( <div class={this.headerCls}> {this.$slots.header || <div class={this.titleCls}>{this.title}</div>} </div> ) } } const renderBody = () => { const acts = this.actions.map((x,i)=>( <div key={i} class={this.getActionItemCls(x)} style={this.getActionItemStyle(x)} vOn:click_stop={e=>this.onSelectItem(x,e)}> {x.name} </div> )) return ( <div class={this.bodyCls}> {this.$scopedSlots.body?.({actions:this.actions}) || acts} </div> ) } const renderFooter = () => { if(this.cancelText){ return ( <div class={this.footerCls} vOn:click_stop={this.onClickCancel}> { this.$scopedSlots.footer?.({cancelText:this.cancelText}) || <div class={this.btnCls}>{this.cancelText}</div> } </div> ) } } return ( <Popup show={this.show} overlay={this.overlay} z-index={this.zIndex} lock-scroll={this.lockScroll} duration={this.duration} overlay-style={this.overlayStyle} round={this.round} vOn:close-on-click-overlay={this.closeOnClickOveraly} safe-area-inset-bottom={this.safeAreaInsetBottom} vOn:close={this.onClose} position="bottom" background={this.background} > <div class={this.cls}> {renderHeader()} {renderBody()} {renderFooter()} </div> </Popup> ) } };