123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222 |
- <template>
- <label
- class="el-checkbox"
- :class="[
- border && checkboxSize ? 'el-checkbox--' + checkboxSize : '',
- { 'is-disabled': isDisabled },
- { 'is-bordered': border },
- { 'is-checked': isChecked }
- ]"
- :id="id"
- >
- <span class="el-checkbox__input"
- :class="{
- 'is-disabled': isDisabled,
- 'is-checked': isChecked,
- 'is-indeterminate': indeterminate,
- 'is-focus': focus
- }"
- :tabindex="indeterminate ? 0 : false"
- :role="indeterminate ? 'checkbox' : false"
- :aria-checked="indeterminate ? 'mixed' : false"
- >
- <span class="el-checkbox__inner"></span>
- <input
- v-if="trueLabel || falseLabel"
- class="el-checkbox__original"
- type="checkbox"
- :aria-hidden="indeterminate ? 'true' : 'false'"
- :name="name"
- :disabled="isDisabled"
- :true-value="trueLabel"
- :false-value="falseLabel"
- v-model="model"
- @change="handleChange"
- @focus="focus = true"
- @blur="focus = false">
- <input
- v-else
- class="el-checkbox__original"
- type="checkbox"
- :aria-hidden="indeterminate ? 'true' : 'false'"
- :disabled="isDisabled"
- :value="label"
- :name="name"
- v-model="model"
- @change="handleChange"
- @focus="focus = true"
- @blur="focus = false">
- </span>
- <span class="el-checkbox__label" v-if="$slots.default || label">
- <slot></slot>
- <template v-if="!$slots.default">{{label}}</template>
- </span>
- </label>
- </template>
- <script>
- import Emitter from 'element-ui/src/mixins/emitter';
- export default {
- name: 'ElCheckbox',
- mixins: [Emitter],
- inject: {
- elForm: {
- default: ''
- },
- elFormItem: {
- default: ''
- }
- },
- componentName: 'ElCheckbox',
- data() {
- return {
- selfModel: false,
- focus: false,
- isLimitExceeded: false
- };
- },
- computed: {
- model: {
- get() {
- return this.isGroup
- ? this.store : this.value !== undefined
- ? this.value : this.selfModel;
- },
- set(val) {
- if (this.isGroup) {
- this.isLimitExceeded = false;
- (this._checkboxGroup.min !== undefined &&
- val.length < this._checkboxGroup.min &&
- (this.isLimitExceeded = true));
- (this._checkboxGroup.max !== undefined &&
- val.length > this._checkboxGroup.max &&
- (this.isLimitExceeded = true));
- this.isLimitExceeded === false &&
- this.dispatch('ElCheckboxGroup', 'input', [val]);
- } else {
- this.$emit('input', val);
- this.selfModel = val;
- }
- }
- },
- isChecked() {
- if ({}.toString.call(this.model) === '[object Boolean]') {
- return this.model;
- } else if (Array.isArray(this.model)) {
- return this.model.indexOf(this.label) > -1;
- } else if (this.model !== null && this.model !== undefined) {
- return this.model === this.trueLabel;
- }
- },
- isGroup() {
- let parent = this.$parent;
- while (parent) {
- if (parent.$options.componentName !== 'ElCheckboxGroup') {
- parent = parent.$parent;
- } else {
- this._checkboxGroup = parent;
- return true;
- }
- }
- return false;
- },
- store() {
- return this._checkboxGroup ? this._checkboxGroup.value : this.value;
- },
- /* used to make the isDisabled judgment under max/min props */
- isLimitDisabled() {
- const { max, min } = this._checkboxGroup;
- return !!(max || min) &&
- (this.model.length >= max && !this.isChecked) ||
- (this.model.length <= min && this.isChecked);
- },
- isDisabled() {
- return this.isGroup
- ? this._checkboxGroup.disabled || this.disabled || (this.elForm || {}).disabled || this.isLimitDisabled
- : this.disabled || (this.elForm || {}).disabled;
- },
- _elFormItemSize() {
- return (this.elFormItem || {}).elFormItemSize;
- },
- checkboxSize() {
- const temCheckboxSize = this.size || this._elFormItemSize || (this.$ELEMENT || {}).size;
- return this.isGroup
- ? this._checkboxGroup.checkboxGroupSize || temCheckboxSize
- : temCheckboxSize;
- }
- },
- props: {
- value: {},
- label: {},
- indeterminate: Boolean,
- disabled: Boolean,
- checked: Boolean,
- name: String,
- trueLabel: [String, Number],
- falseLabel: [String, Number],
- id: String, /* 当indeterminate为真时,为controls提供相关连的checkbox的id,表明元素间的控制关系*/
- controls: String, /* 当indeterminate为真时,为controls提供相关连的checkbox的id,表明元素间的控制关系*/
- border: Boolean,
- size: String
- },
- methods: {
- addToStore() {
- if (
- Array.isArray(this.model) &&
- this.model.indexOf(this.label) === -1
- ) {
- this.model.push(this.label);
- } else {
- this.model = this.trueLabel || true;
- }
- },
- handleChange(ev) {
- if (this.isLimitExceeded) return;
- let value;
- if (ev.target.checked) {
- value = this.trueLabel === undefined ? true : this.trueLabel;
- } else {
- value = this.falseLabel === undefined ? false : this.falseLabel;
- }
- this.$emit('change', value, ev);
- this.$nextTick(() => {
- if (this.isGroup) {
- this.dispatch('ElCheckboxGroup', 'change', [this._checkboxGroup.value]);
- }
- });
- }
- },
- created() {
- this.checked && this.addToStore();
- },
- mounted() { // 为indeterminate元素 添加aria-controls 属性
- if (this.indeterminate) {
- this.$el.setAttribute('aria-controls', this.controls);
- }
- },
- watch: {
- value(value) {
- this.dispatch('ElFormItem', 'el.form.change', value);
- }
- }
- };
- </script>
|