2017-01-16 02:43:10 +00:00
|
|
|
|
<template>
|
2017-07-26 13:24:23 +00:00
|
|
|
|
<div
|
|
|
|
|
class="el-radio-group"
|
|
|
|
|
role="radiogroup"
|
|
|
|
|
@keydown="handleKeydown"
|
|
|
|
|
>
|
2017-01-16 02:43:10 +00:00
|
|
|
|
<slot></slot>
|
|
|
|
|
</div>
|
|
|
|
|
</template>
|
2016-07-27 06:15:02 +00:00
|
|
|
|
<script>
|
2016-10-27 09:31:22 +00:00
|
|
|
|
import Emitter from 'element-ui/src/mixins/emitter';
|
2016-07-27 06:15:02 +00:00
|
|
|
|
|
2017-07-26 13:24:23 +00:00
|
|
|
|
const keyCode = Object.freeze({
|
|
|
|
|
LEFT: 37,
|
|
|
|
|
UP: 38,
|
|
|
|
|
RIGHT: 39,
|
|
|
|
|
DOWN: 40
|
|
|
|
|
});
|
2016-07-27 06:15:02 +00:00
|
|
|
|
export default {
|
|
|
|
|
name: 'ElRadioGroup',
|
|
|
|
|
|
2016-11-25 05:13:41 +00:00
|
|
|
|
componentName: 'ElRadioGroup',
|
2016-08-15 02:36:21 +00:00
|
|
|
|
|
2017-10-16 06:07:24 +00:00
|
|
|
|
inject: {
|
|
|
|
|
elFormItem: {
|
|
|
|
|
default: ''
|
|
|
|
|
}
|
|
|
|
|
},
|
2017-10-12 09:50:06 +00:00
|
|
|
|
|
2016-10-27 09:31:22 +00:00
|
|
|
|
mixins: [Emitter],
|
2016-07-27 06:15:02 +00:00
|
|
|
|
|
|
|
|
|
props: {
|
2017-01-18 07:12:26 +00:00
|
|
|
|
value: {},
|
2016-11-26 09:54:27 +00:00
|
|
|
|
size: String,
|
2017-01-16 02:43:10 +00:00
|
|
|
|
fill: String,
|
|
|
|
|
textColor: String,
|
|
|
|
|
disabled: Boolean
|
2016-07-27 06:15:02 +00:00
|
|
|
|
},
|
2017-10-12 09:50:06 +00:00
|
|
|
|
|
|
|
|
|
computed: {
|
|
|
|
|
_elFormItemSize() {
|
|
|
|
|
return (this.elFormItem || {}).elFormItemSize;
|
|
|
|
|
},
|
|
|
|
|
radioGroupSize() {
|
|
|
|
|
return this.size || this._elFormItemSize || (this.$ELEMENT || {}).size;
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
|
2017-08-08 04:39:19 +00:00
|
|
|
|
created() {
|
|
|
|
|
this.$on('handleChange', value => {
|
|
|
|
|
this.$emit('change', value);
|
|
|
|
|
});
|
|
|
|
|
},
|
2017-07-26 13:24:23 +00:00
|
|
|
|
mounted() {
|
|
|
|
|
// 当radioGroup没有默认选项时,第一个可以选中Tab导航
|
2017-11-09 07:12:37 +00:00
|
|
|
|
const radios = this.$el.querySelectorAll('[type=radio]');
|
|
|
|
|
const firstLabel = this.$el.querySelectorAll('[role=radio]')[0];
|
|
|
|
|
if (![].some.call(radios, radio => radio.checked) && firstLabel) {
|
|
|
|
|
firstLabel.tabIndex = 0;
|
2017-07-26 13:24:23 +00:00
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
methods: {
|
|
|
|
|
handleKeydown(e) { // 左右上下按键 可以在radio组内切换不同选项
|
|
|
|
|
const target = e.target;
|
|
|
|
|
const className = target.nodeName === 'INPUT' ? '[type=radio]' : '[role=radio]';
|
|
|
|
|
const radios = this.$el.querySelectorAll(className);
|
|
|
|
|
const length = radios.length;
|
|
|
|
|
const index = [].indexOf.call(radios, target);
|
|
|
|
|
const roleRadios = this.$el.querySelectorAll('[role=radio]');
|
|
|
|
|
switch (e.keyCode) {
|
|
|
|
|
case keyCode.LEFT:
|
|
|
|
|
case keyCode.UP:
|
|
|
|
|
e.stopPropagation();
|
|
|
|
|
e.preventDefault();
|
|
|
|
|
if (index === 0) {
|
|
|
|
|
roleRadios[length - 1].click();
|
2018-05-24 09:31:10 +00:00
|
|
|
|
roleRadios[length - 1].focus();
|
2017-07-26 13:24:23 +00:00
|
|
|
|
} else {
|
|
|
|
|
roleRadios[index - 1].click();
|
2018-05-24 09:31:10 +00:00
|
|
|
|
roleRadios[index - 1].focus();
|
2017-07-26 13:24:23 +00:00
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case keyCode.RIGHT:
|
|
|
|
|
case keyCode.DOWN:
|
|
|
|
|
if (index === (length - 1)) {
|
|
|
|
|
e.stopPropagation();
|
|
|
|
|
e.preventDefault();
|
|
|
|
|
roleRadios[0].click();
|
2018-05-24 09:31:10 +00:00
|
|
|
|
roleRadios[0].focus();
|
2017-07-26 13:24:23 +00:00
|
|
|
|
} else {
|
|
|
|
|
roleRadios[index + 1].click();
|
2018-05-24 09:31:10 +00:00
|
|
|
|
roleRadios[index + 1].focus();
|
2017-07-26 13:24:23 +00:00
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
},
|
2016-07-27 06:15:02 +00:00
|
|
|
|
watch: {
|
|
|
|
|
value(value) {
|
2016-11-26 07:18:38 +00:00
|
|
|
|
this.dispatch('ElFormItem', 'el.form.change', [this.value]);
|
2016-07-27 06:15:02 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
</script>
|
|
|
|
|
|