ant-design-vue
Version:
An enterprise-class UI design language and Vue-based implementation
153 lines (136 loc) • 3.88 kB
JavaScript
import _defineProperty from 'babel-runtime/helpers/defineProperty';
import PropTypes from '../_util/vue-types';
import BaseMixin from '../_util/BaseMixin';
import classnames from 'classnames';
function noop() {}
var scrollTo = function scrollTo(element, to, duration) {
var requestAnimationFrame = window.requestAnimationFrame || function requestAnimationFrameTimeout() {
return setTimeout(arguments[0], 10);
};
// jump to target if duration zero
if (duration <= 0) {
element.scrollTop = to;
return;
}
var difference = to - element.scrollTop;
var perTick = difference / duration * 10;
requestAnimationFrame(function () {
element.scrollTop = element.scrollTop + perTick;
if (element.scrollTop === to) return;
scrollTo(element, to, duration - 10);
});
};
var Select = {
mixins: [BaseMixin],
props: {
prefixCls: PropTypes.string,
options: PropTypes.array,
selectedIndex: PropTypes.number,
type: PropTypes.string
// onSelect: PropTypes.func,
// onMouseEnter: PropTypes.func,
},
data: function data() {
return {
active: false
};
},
mounted: function mounted() {
var _this = this;
this.$nextTick(function () {
// jump to selected option
_this.scrollToSelected(0);
});
},
watch: {
selectedIndex: function selectedIndex(val) {
var _this2 = this;
this.$nextTick(function () {
// smooth scroll to selected option
_this2.scrollToSelected(120);
});
}
},
methods: {
onSelect: function onSelect(value) {
var type = this.type;
this.__emit('select', type, value);
},
getOptions: function getOptions() {
var _this3 = this;
var h = this.$createElement;
var options = this.options,
selectedIndex = this.selectedIndex,
prefixCls = this.prefixCls;
return options.map(function (item, index) {
var _classnames;
var cls = classnames((_classnames = {}, _defineProperty(_classnames, prefixCls + '-select-option-selected', selectedIndex === index), _defineProperty(_classnames, prefixCls + '-select-option-disabled', item.disabled), _classnames));
var onClick = noop;
if (!item.disabled) {
onClick = _this3.onSelect.bind(_this3, item.value);
}
return h(
'li',
{
'class': cls,
key: index,
on: {
'click': onClick
},
attrs: {
disabled: item.disabled
}
},
[item.value]
);
});
},
scrollToSelected: function scrollToSelected(duration) {
// move to selected item
var select = this.$el;
var list = this.$refs.list;
if (!list) {
return;
}
var index = this.selectedIndex;
if (index < 0) {
index = 0;
}
var topOption = list.children[index];
var to = topOption.offsetTop;
scrollTo(select, to, duration);
},
handleMouseEnter: function handleMouseEnter(e) {
this.setState({ active: true });
this.__emit('mouseenter', e);
},
handleMouseLeave: function handleMouseLeave() {
this.setState({ active: false });
}
},
render: function render() {
var _cls;
var h = arguments[0];
if (this.options.length === 0) {
return null;
}
var prefixCls = this.prefixCls;
var cls = (_cls = {}, _defineProperty(_cls, prefixCls + '-select', 1), _defineProperty(_cls, prefixCls + '-select-active', this.active), _cls);
return h(
'div',
{
'class': cls,
on: {
'mouseenter': this.handleMouseEnter,
'mouseleave': this.handleMouseLeave
}
},
[h(
'ul',
{ ref: 'list' },
[this.getOptions()]
)]
);
}
};
export default Select;