<template> <div class="el-switch" :class="{ 'is-disabled': switchDisabled, 'is-checked': checked }" role="switch" :aria-checked="checked" :aria-disabled="switchDisabled" @click.prevent="switchValue" > <input class="el-switch__input" type="checkbox" @change="handleChange" ref="input" :id="id" :name="name" :true-value="activeValue" :false-value="inactiveValue" :disabled="switchDisabled" @keydown.enter="switchValue" > <span :class="['el-switch__label', 'el-switch__label--left', !checked ? 'is-active' : '']" v-if="inactiveIconClass || inactiveText"> <i :class="[inactiveIconClass]" v-if="inactiveIconClass"></i> <span v-if="!inactiveIconClass && inactiveText" :aria-hidden="checked">{{ inactiveText }}</span> </span> <span class="el-switch__core" ref="core" :style="{ 'width': coreWidth + 'px' }"> </span> <span :class="['el-switch__label', 'el-switch__label--right', checked ? 'is-active' : '']" v-if="activeIconClass || activeText"> <i :class="[activeIconClass]" v-if="activeIconClass"></i> <span v-if="!activeIconClass && activeText" :aria-hidden="!checked">{{ activeText }}</span> </span> </div> </template> <script> import emitter from 'element-ui/src/mixins/emitter'; import Focus from 'element-ui/src/mixins/focus'; import Migrating from 'element-ui/src/mixins/migrating'; export default { name: 'ElSwitch', mixins: [Focus('input'), Migrating, emitter], inject: { elForm: { default: '' } }, props: { value: { type: [Boolean, String, Number], default: false }, disabled: { type: Boolean, default: false }, width: { type: Number, default: 40 }, activeIconClass: { type: String, default: '' }, inactiveIconClass: { type: String, default: '' }, activeText: String, inactiveText: String, activeColor: { type: String, default: '' }, inactiveColor: { type: String, default: '' }, activeValue: { type: [Boolean, String, Number], default: true }, inactiveValue: { type: [Boolean, String, Number], default: false }, name: { type: String, default: '' }, validateEvent: { type: Boolean, default: true }, id: String }, data() { return { coreWidth: this.width }; }, created() { if (!~[this.activeValue, this.inactiveValue].indexOf(this.value)) { this.$emit('input', this.inactiveValue); } }, computed: { checked() { return this.value === this.activeValue; }, switchDisabled() { return this.disabled || (this.elForm || {}).disabled; } }, watch: { checked() { this.$refs.input.checked = this.checked; if (this.activeColor || this.inactiveColor) { this.setBackgroundColor(); } if (this.validateEvent) { this.dispatch('ElFormItem', 'el.form.change', [this.value]); } } }, methods: { handleChange(event) { const val = this.checked ? this.inactiveValue : this.activeValue; this.$emit('input', val); this.$emit('change', val); this.$nextTick(() => { // set input's checked property // in case parent refuses to change component's value if (this.$refs.input) { this.$refs.input.checked = this.checked; } }); }, setBackgroundColor() { let newColor = this.checked ? this.activeColor : this.inactiveColor; this.$refs.core.style.borderColor = newColor; this.$refs.core.style.backgroundColor = newColor; }, switchValue() { !this.switchDisabled && this.handleChange(); }, getMigratingConfig() { return { props: { 'on-color': 'on-color is renamed to active-color.', 'off-color': 'off-color is renamed to inactive-color.', 'on-text': 'on-text is renamed to active-text.', 'off-text': 'off-text is renamed to inactive-text.', 'on-value': 'on-value is renamed to active-value.', 'off-value': 'off-value is renamed to inactive-value.', 'on-icon-class': 'on-icon-class is renamed to active-icon-class.', 'off-icon-class': 'off-icon-class is renamed to inactive-icon-class.' } }; } }, mounted() { /* istanbul ignore if */ this.coreWidth = this.width || 40; if (this.activeColor || this.inactiveColor) { this.setBackgroundColor(); } this.$refs.input.checked = this.checked; } }; </script>