UNPKG

wangbd-myui

Version:

MY前端基础框架核心组件库

100 lines (94 loc) 2.62 kB
/** * 下拉组件,继承Base * @module $ui/components/my-select */ import {Select, Option, OptionGroup} from 'element-ui' import Base from '../Base' /** * 插槽 * @member slots * @property {string} [option] 作用域插槽,参数: item 数据项,index 索引 */ export default { name: 'MySelect', mixins: [Base], components: { Select, Option, OptionGroup }, /** * 通用参数之外的扩展参数 * @member props * @property {Array} [group] 分组,数据项字段包括 id, label, disabled, options 中的 parentId 字段与分组id相等即标识选项在该分组下 */ props: { value: [String, Number, Boolean, Array], // 分组 [{label, disabled, id}] group: { type: Array } }, methods: { getDefaultValue() { if (this.props && this.props.multiple) { return [] } return '' }, getOptionsByGroupId(groupId) { if (!this.currentOptions) return [] const {parentId} = this.keyMap return this.currentOptions.filter(item => item[parentId] === groupId) }, renderOptions(options, isDisabled) { if (!options) return [] const scopedSlots = (opt, index) => { return this.$scopedSlots.option ? this.$scopedSlots.option({ item: opt, index: index }) : opt[label] } const {label, value, disabled} = this.keyMap return options.map((item, index) => { const opt = { label: item[label], value: item[value], disabled: isDisabled || item[disabled] } return ( <Option {...{props: opt}}> {scopedSlots(opt, index)} </Option> ) }) }, renderItem() { if (!this.group) return this.renderOptions(this.currentOptions) return this.group.map(g => { const opts = this.getOptionsByGroupId(g.id) return ( <OptionGroup label={g.label} disabled={g.disabled}> {this.renderOptions(opts, g.disabled)} </OptionGroup> ) }) } }, render() { const vnode = ( <Select ref="comp" class="my-select" {...{props: this.innerProps, on: this.$listeners, attrs: this.innerProps}} vModel={this.fieldValue}> {this.renderItem()} </Select> ) return this.renderComponent(vnode) }, mounted() { this.extendMethods(this.$refs.comp, ['focus', 'blur']) } }