| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113 |
- <template>
- <component
- :is="_elTag"
- class="el-radio-group"
- role="radiogroup"
- @keydown="handleKeydown"
- >
- <slot></slot>
- </component>
- </template>
- <script>
- import Emitter from 'element-ui/src/mixins/emitter';
- const keyCode = Object.freeze({
- LEFT: 37,
- UP: 38,
- RIGHT: 39,
- DOWN: 40
- });
- export default {
- name: 'ElRadioGroup',
- componentName: 'ElRadioGroup',
- inject: {
- elFormItem: {
- default: ''
- }
- },
- mixins: [Emitter],
- props: {
- value: {},
- size: String,
- fill: String,
- textColor: String,
- disabled: Boolean
- },
- computed: {
- _elFormItemSize() {
- return (this.elFormItem || {}).elFormItemSize;
- },
- _elTag() {
- let tag = (this.$vnode.data || {}).tag;
- if (!tag || tag === 'component') tag = 'div';
- return tag;
- },
- radioGroupSize() {
- return this.size || this._elFormItemSize || (this.$ELEMENT || {}).size;
- }
- },
- created() {
- this.$on('handleChange', value => {
- this.$emit('change', value);
- });
- },
- mounted() {
- // 当radioGroup没有默认选项时,第一个可以选中Tab导航
- 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;
- }
- },
- 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();
- roleRadios[length - 1].focus();
- } else {
- roleRadios[index - 1].click();
- roleRadios[index - 1].focus();
- }
- break;
- case keyCode.RIGHT:
- case keyCode.DOWN:
- if (index === (length - 1)) {
- e.stopPropagation();
- e.preventDefault();
- roleRadios[0].click();
- roleRadios[0].focus();
- } else {
- roleRadios[index + 1].click();
- roleRadios[index + 1].focus();
- }
- break;
- default:
- break;
- }
- }
- },
- watch: {
- value(value) {
- this.dispatch('ElFormItem', 'el.form.change', [this.value]);
- }
- }
- };
- </script>
|