Commit 98a755be21042406ed404772b0bcf929651c530a

Authored by Xotic750
1 parent 4b48b69a

Use native w3c

examples/routers/checkbox.vue
@@ -37,7 +37,7 @@ @@ -37,7 +37,7 @@
37 tags: [], 37 tags: [],
38 testValue1: null, 38 testValue1: null,
39 testValue2: null 39 testValue2: null
40 - } 40 + };
41 }, 41 },
42 mounted () { 42 mounted () {
43 setTimeout(() => { 43 setTimeout(() => {
@@ -51,8 +51,8 @@ @@ -51,8 +51,8 @@
51 { 51 {
52 label: '西瓜' 52 label: '西瓜'
53 } 53 }
54 - ] 54 + ];
55 }, 1000); 55 }, 1000);
56 } 56 }
57 - } 57 + };
58 </script> 58 </script>
src/components/checkbox/checkbox-group.vue
@@ -6,6 +6,7 @@ @@ -6,6 +6,7 @@
6 <script> 6 <script>
7 import { findComponentsDownward, oneOf } from '../../utils/assist'; 7 import { findComponentsDownward, oneOf } from '../../utils/assist';
8 import Emitter from '../../mixins/emitter'; 8 import Emitter from '../../mixins/emitter';
  9 +
9 const prefixCls = 'ivu-checkbox-group'; 10 const prefixCls = 'ivu-checkbox-group';
10 11
11 export default { 12 export default {
@@ -45,10 +46,9 @@ @@ -45,10 +46,9 @@
45 }, 46 },
46 methods: { 47 methods: {
47 updateModel (update) { 48 updateModel (update) {
48 - const value = this.value;  
49 this.childrens = findComponentsDownward(this, 'Checkbox'); 49 this.childrens = findComponentsDownward(this, 'Checkbox');
50 -  
51 if (this.childrens) { 50 if (this.childrens) {
  51 + const { value } = this;
52 this.childrens.forEach(child => { 52 this.childrens.forEach(child => {
53 child.model = value; 53 child.model = value;
54 54
src/components/checkbox/checkbox.vue
1 <template> 1 <template>
2 - <label  
3 - :class="wrapClasses"  
4 - @keydown.space.prevent="$el.click()"  
5 - :tabindex="disabled ? -1 : 0"> 2 + <label :class="wrapClasses">
6 <span :class="checkboxClasses"> 3 <span :class="checkboxClasses">
7 - <span :class="innerClasses"></span> 4 + <span :class="innerClasses" ref="inner"></span>
8 <input 5 <input
9 v-if="group" 6 v-if="group"
10 type="checkbox" 7 type="checkbox"
11 - tabindex="-1"  
12 :class="inputClasses" 8 :class="inputClasses"
13 :disabled="disabled" 9 :disabled="disabled"
14 :value="label" 10 :value="label"
15 v-model="model" 11 v-model="model"
16 :name="name" 12 :name="name"
17 @change="change" 13 @change="change"
18 - @focus="$el.focus()"  
19 - > 14 + @focus="onFocus"
  15 + @blur="onBlur">
20 <input 16 <input
21 - v-if="!group" 17 + v-else
22 type="checkbox" 18 type="checkbox"
23 - tabindex="-1"  
24 :class="inputClasses" 19 :class="inputClasses"
25 :disabled="disabled" 20 :disabled="disabled"
26 :checked="currentValue" 21 :checked="currentValue"
27 :name="name" 22 :name="name"
28 @change="change" 23 @change="change"
29 - @focus="$el.focus()"  
30 - > 24 + @focus="onFocus"
  25 + @blur="onBlur">
31 </span> 26 </span>
32 <slot><span v-if="showSlot">{{ label }}</span></slot> 27 <slot><span v-if="showSlot">{{ label }}</span></slot>
33 </label> 28 </label>
@@ -80,7 +75,8 @@ @@ -80,7 +75,8 @@
80 currentValue: this.value, 75 currentValue: this.value,
81 group: false, 76 group: false,
82 showSlot: true, 77 showSlot: true,
83 - parent: findComponentUpward(this, 'CheckboxGroup') 78 + parent: findComponentUpward(this, 'CheckboxGroup'),
  79 + focusInner: false
84 }; 80 };
85 }, 81 },
86 computed: { 82 computed: {
@@ -106,7 +102,12 @@ @@ -106,7 +102,12 @@
106 ]; 102 ];
107 }, 103 },
108 innerClasses () { 104 innerClasses () {
109 - return `${prefixCls}-inner`; 105 + return [
  106 + `${prefixCls}-inner`,
  107 + {
  108 + [`${prefixCls}-focus`]: this.focusInner
  109 + }
  110 + ];
110 }, 111 },
111 inputClasses () { 112 inputClasses () {
112 return `${prefixCls}-input`; 113 return `${prefixCls}-input`;
@@ -114,12 +115,15 @@ @@ -114,12 +115,15 @@
114 }, 115 },
115 mounted () { 116 mounted () {
116 this.parent = findComponentUpward(this, 'CheckboxGroup'); 117 this.parent = findComponentUpward(this, 'CheckboxGroup');
117 - if (this.parent) this.group = true;  
118 - if (!this.group) { 118 + if (this.parent) {
  119 + this.group = true;
  120 + }
  121 +
  122 + if (this.group) {
  123 + this.parent.updateModel(true);
  124 + } else {
119 this.updateModel(); 125 this.updateModel();
120 this.showSlot = this.$slots.default !== undefined; 126 this.showSlot = this.$slots.default !== undefined;
121 - } else {  
122 - this.parent.updateModel(true);  
123 } 127 }
124 }, 128 },
125 methods: { 129 methods: {
@@ -131,7 +135,7 @@ @@ -131,7 +135,7 @@
131 const checked = event.target.checked; 135 const checked = event.target.checked;
132 this.currentValue = checked; 136 this.currentValue = checked;
133 137
134 - let value = checked ? this.trueValue : this.falseValue; 138 + const value = checked ? this.trueValue : this.falseValue;
135 this.$emit('input', value); 139 this.$emit('input', value);
136 140
137 if (this.group) { 141 if (this.group) {
@@ -143,14 +147,21 @@ @@ -143,14 +147,21 @@
143 }, 147 },
144 updateModel () { 148 updateModel () {
145 this.currentValue = this.value === this.trueValue; 149 this.currentValue = this.value === this.trueValue;
  150 + },
  151 + onBlur () {
  152 + this.focusInner = false;
  153 + },
  154 + onFocus () {
  155 + this.focusInner = true;
146 } 156 }
147 }, 157 },
148 watch: { 158 watch: {
149 value (val) { 159 value (val) {
150 - if (val !== this.trueValue && val !== this.falseValue) { 160 + if (val === this.trueValue || val === this.falseValue) {
  161 + this.updateModel();
  162 + } else {
151 throw 'Value should be trueValue or falseValue.'; 163 throw 'Value should be trueValue or falseValue.';
152 } 164 }
153 - this.updateModel();  
154 } 165 }
155 } 166 }
156 }; 167 };
src/styles/mixins/checkbox.less
1 .checkboxFn(@checkbox-prefix-cls: ~"@{css-prefix}checkbox") { 1 .checkboxFn(@checkbox-prefix-cls: ~"@{css-prefix}checkbox") {
2 @checkbox-inner-prefix-cls: ~"@{checkbox-prefix-cls}-inner"; 2 @checkbox-inner-prefix-cls: ~"@{checkbox-prefix-cls}-inner";
3 3
  4 + .@{checkbox-prefix-cls}-focus {
  5 + box-shadow: 0 0 0 2px fade(@primary-color, 20%);
  6 + z-index: 1;
  7 + }
  8 +
4 // 普通状态 9 // 普通状态
5 .@{checkbox-prefix-cls} { 10 .@{checkbox-prefix-cls} {
6 display: inline-block; 11 display: inline-block;
7 vertical-align: middle; 12 vertical-align: middle;
8 white-space: nowrap; 13 white-space: nowrap;
9 cursor: pointer; 14 cursor: pointer;
10 - outline: none; 15 + //outline: none;
11 line-height: 1; 16 line-height: 1;
12 position: relative; 17 position: relative;
13 18
@@ -236,13 +241,7 @@ @@ -236,13 +241,7 @@
236 font-size: @font-size-small; 241 font-size: @font-size-small;
237 display: inline-block; 242 display: inline-block;
238 margin-right: 8px; 243 margin-right: 8px;
239 - outline: 0;  
240 - &:focus,  
241 - &:active {  
242 - & .@{checkbox-prefix-cls}-inner {  
243 - box-shadow: 0 0 0 2px fade(@primary-color, 20%);  
244 - }  
245 - } 244 + //outline: none;
246 245
247 &-disabled{ 246 &-disabled{
248 cursor: @cursor-disabled; 247 cursor: @cursor-disabled;