ant-design-vue
Version:
An enterprise-class UI design language and Vue-based implementation
154 lines (133 loc) • 4.18 kB
JavaScript
import { createVNode as _createVNode } from "vue";
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
import PropTypes from '../_util/vue-types';
import BaseMixin from '../_util/BaseMixin';
import classnames from '../_util/classNames';
import { findDOMNode } from '../_util/props-util';
function noop() {}
var scrollTo = function scrollTo(element, to, duration) {
// jump to target if duration zero
if (duration <= 0) {
requestAnimationFrame(function () {
element.scrollTop = to;
});
return;
}
var difference = to - element.scrollTop;
var perTick = difference / duration * 10;
requestAnimationFrame(function () {
element.scrollTop += perTick;
if (element.scrollTop === to) return;
scrollTo(element, to, duration - 10);
});
};
var Select = {
name: 'Select',
mixins: [BaseMixin],
inheritAttrs: false,
props: {
prefixCls: PropTypes.string,
options: PropTypes.array,
selectedIndex: PropTypes.number,
type: PropTypes.string
},
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() {
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);
},
onEsc: function onEsc(e) {
this.__emit('esc', e);
},
getOptions: function getOptions() {
var _this3 = this;
var options = this.options,
selectedIndex = this.selectedIndex,
prefixCls = this.prefixCls;
return options.map(function (item, index) {
var _classnames;
var cls = classnames((_classnames = {}, _defineProperty(_classnames, "".concat(prefixCls, "-select-option-selected"), selectedIndex === index), _defineProperty(_classnames, "".concat(prefixCls, "-select-option-disabled"), item.disabled), _classnames));
var onClick = item.disabled ? noop : function () {
_this3.onSelect(item.value);
};
var onKeyDown = function onKeyDown(e) {
if (e.keyCode === 13) onClick();else if (e.keyCode === 27) _this3.onEsc();
};
return _createVNode("li", {
"role": "button",
"onClick": onClick,
"class": cls,
"key": index,
"disabled": item.disabled,
"tabindex": "0",
"onKeydown": onKeyDown
}, [item.value]);
});
},
handleMouseEnter: function handleMouseEnter(e) {
this.setState({
active: true
});
this.__emit('mouseenter', e);
},
handleMouseLeave: function handleMouseLeave() {
this.setState({
active: false
});
},
scrollToSelected: function scrollToSelected(duration) {
// move to selected item
var select = findDOMNode(this);
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);
}
},
render: function render() {
var _cls;
var prefixCls = this.prefixCls,
options = this.options,
active = this.active;
if (options.length === 0) {
return null;
}
var cls = (_cls = {}, _defineProperty(_cls, "".concat(prefixCls, "-select"), 1), _defineProperty(_cls, "".concat(prefixCls, "-select-active"), active), _cls);
return _createVNode("div", {
"class": cls,
"onMouseenter": this.handleMouseEnter,
"onMouseleave": this.handleMouseLeave
}, [_createVNode("ul", {
"ref": "list"
}, [this.getOptions()])]);
}
};
export default Select;