Commit 06322514c6dd6d255470952f46719412310f9dd9
1 parent
fc7ef072
support Radio
support Radio
Showing
13 changed files
with
77 additions
and
214 deletions
Show diff stats
README.md
src/components/affix/affix.vue
src/components/button/button-group.vue
src/components/button/button.vue
src/components/icon/icon.vue
src/components/input/input.vue
src/components/radio/radio-group.vue
... | ... | @@ -11,7 +11,7 @@ |
11 | 11 | export default { |
12 | 12 | name: 'radioGroup', |
13 | 13 | props: { |
14 | - model: { | |
14 | + value: { | |
15 | 15 | type: [String, Number], |
16 | 16 | default: '' |
17 | 17 | }, |
... | ... | @@ -30,6 +30,11 @@ |
30 | 30 | default: false |
31 | 31 | } |
32 | 32 | }, |
33 | + data () { | |
34 | + return { | |
35 | + currentValue: this.value | |
36 | + } | |
37 | + }, | |
33 | 38 | computed: { |
34 | 39 | classes () { |
35 | 40 | return [ |
... | ... | @@ -42,27 +47,29 @@ |
42 | 47 | ]; |
43 | 48 | } |
44 | 49 | }, |
45 | - compiled () { | |
46 | - this.updateModel(); | |
50 | + mounted () { | |
51 | + this.updateValue(); | |
47 | 52 | }, |
48 | 53 | methods: { |
49 | - updateModel () { | |
50 | - const model = this.model; | |
54 | + updateValue () { | |
55 | + const value = this.value; | |
51 | 56 | this.$children.forEach((child) => { |
52 | - child.selected = model == child.value; | |
57 | + child.currentValue = value == child.label; | |
53 | 58 | child.group = true; |
54 | 59 | }); |
55 | 60 | }, |
56 | 61 | change (data) { |
57 | - this.model = data.value; | |
58 | - this.updateModel(); | |
62 | + this.currentValue = data.value; | |
63 | + this.updateValue(); | |
64 | + this.$emit('input', data.value); | |
59 | 65 | this.$emit('on-change', data.value); |
60 | - this.$dispatch('on-form-change', data.value); | |
66 | + // todo 事件 | |
67 | +// this.$dispatch('on-form-change', data.value); | |
61 | 68 | } |
62 | 69 | }, |
63 | 70 | watch: { |
64 | - model () { | |
65 | - this.updateModel(); | |
71 | + value () { | |
72 | + this.updateValue(); | |
66 | 73 | } |
67 | 74 | } |
68 | 75 | }; | ... | ... |
src/components/radio/radio.vue
... | ... | @@ -6,31 +6,32 @@ |
6 | 6 | type="radio" |
7 | 7 | :class="inputClasses" |
8 | 8 | :disabled="disabled" |
9 | - :checked="selected" | |
9 | + :checked="currentValue" | |
10 | 10 | @change="change"> |
11 | - </span><slot>{{ value }}</slot> | |
11 | + </span><slot>{{ label }}</slot> | |
12 | 12 | </label> |
13 | 13 | </template> |
14 | 14 | <script> |
15 | 15 | const prefixCls = 'ivu-radio'; |
16 | 16 | |
17 | 17 | export default { |
18 | + name: 'Radio', | |
18 | 19 | props: { |
19 | - checked: { | |
20 | + value: { | |
20 | 21 | type: Boolean, |
21 | 22 | default: false |
22 | 23 | }, |
24 | + label: { | |
25 | + type: [String, Number] | |
26 | + }, | |
23 | 27 | disabled: { |
24 | 28 | type: Boolean, |
25 | 29 | default: false |
26 | - }, | |
27 | - value: { | |
28 | - type: [String, Number] | |
29 | 30 | } |
30 | 31 | }, |
31 | 32 | data () { |
32 | 33 | return { |
33 | - selected: false, | |
34 | + currentValue: this.value, | |
34 | 35 | group: false |
35 | 36 | }; |
36 | 37 | }, |
... | ... | @@ -40,7 +41,7 @@ |
40 | 41 | `${prefixCls}-wrapper`, |
41 | 42 | { |
42 | 43 | [`${prefixCls}-group-item`]: this.group, |
43 | - [`${prefixCls}-wrapper-checked`]: this.selected, | |
44 | + [`${prefixCls}-wrapper-checked`]: this.currentValue, | |
44 | 45 | [`${prefixCls}-wrapper-disabled`]: this.disabled |
45 | 46 | } |
46 | 47 | ]; |
... | ... | @@ -49,7 +50,7 @@ |
49 | 50 | return [ |
50 | 51 | `${prefixCls}`, |
51 | 52 | { |
52 | - [`${prefixCls}-checked`]: this.selected, | |
53 | + [`${prefixCls}-checked`]: this.currentValue, | |
53 | 54 | [`${prefixCls}-disabled`]: this.disabled |
54 | 55 | } |
55 | 56 | ]; |
... | ... | @@ -61,10 +62,10 @@ |
61 | 62 | return `${prefixCls}-input`; |
62 | 63 | } |
63 | 64 | }, |
64 | - ready () { | |
65 | + mounted () { | |
65 | 66 | if (this.$parent && this.$parent.$options.name === 'radioGroup') this.group = true; |
66 | 67 | if (!this.group) { |
67 | - this.updateModel(); | |
68 | + this.updateValue(); | |
68 | 69 | } |
69 | 70 | }, |
70 | 71 | methods: { |
... | ... | @@ -73,25 +74,27 @@ |
73 | 74 | return false; |
74 | 75 | } |
75 | 76 | |
76 | - this.selected = event.target.checked; | |
77 | - this.checked = this.selected; | |
77 | + const checked = event.target.checked; | |
78 | + this.currentValue = checked; | |
79 | + this.$emit('input', checked); | |
80 | + this.$emit('on-change', checked); | |
78 | 81 | |
79 | - if (this.group && this.checked) { | |
82 | + if (this.group && this.label) { | |
80 | 83 | this.$parent.change({ |
81 | - value: this.value, | |
82 | - checked: this.checked | |
84 | + value: this.label, | |
85 | + checked: this.value | |
83 | 86 | }); |
84 | 87 | } |
85 | - | |
86 | - if (!this.group) this.$dispatch('on-form-change', this.selected); | |
88 | + // todo 事件 | |
89 | +// if (!this.group) this.$dispatch('on-form-change', checked); | |
87 | 90 | }, |
88 | - updateModel () { | |
89 | - this.selected = this.checked; | |
91 | + updateValue () { | |
92 | + this.currentValue = this.value; | |
90 | 93 | } |
91 | 94 | }, |
92 | 95 | watch: { |
93 | - checked () { | |
94 | - this.updateModel(); | |
96 | + value () { | |
97 | + this.updateValue(); | |
95 | 98 | } |
96 | 99 | } |
97 | 100 | }; | ... | ... |
src/index.js
... | ... | @@ -27,7 +27,7 @@ import Input from './components/input'; |
27 | 27 | // import Page from './components/page'; |
28 | 28 | // import Poptip from './components/poptip'; |
29 | 29 | // import Progress from './components/progress'; |
30 | -// import Radio from './components/radio'; | |
30 | +import Radio from './components/radio'; | |
31 | 31 | // import Rate from './components/rate'; |
32 | 32 | // import Slider from './components/slider'; |
33 | 33 | // import Spin from './components/spin'; |
... | ... | @@ -89,8 +89,8 @@ const iview = { |
89 | 89 | // Panel: Collapse.Panel, |
90 | 90 | // Poptip, |
91 | 91 | // Progress, |
92 | - // Radio, | |
93 | - // RadioGroup: Radio.Group, | |
92 | + Radio, | |
93 | + RadioGroup: Radio.Group, | |
94 | 94 | // Rate, |
95 | 95 | Row, |
96 | 96 | // iSelect: Select, | ... | ... |
test/app.vue
... | ... | @@ -28,6 +28,7 @@ li + li { |
28 | 28 | <li><router-link to="/grid">Grid</router-link></li> |
29 | 29 | <li><router-link to="/button">Button</router-link></li> |
30 | 30 | <li><router-link to="/input">Input</router-link></li> |
31 | + <li><router-link to="/radio">Radio</router-link></li> | |
31 | 32 | </ul> |
32 | 33 | </nav> |
33 | 34 | <router-view></router-view> | ... | ... |
test/main.js
test/routers/radio.vue
1 | 1 | <template> |
2 | 2 | <div> |
3 | - <Radio-group :model.sync="phone" vertical> | |
4 | - <Radio value="apple"> | |
3 | + <Radio v-model="single" @on-change="c">Radio</Radio> | |
4 | + <Radio-group v-model="phone" type="button" @on-change="c"> | |
5 | + <Radio label="apple"> | |
5 | 6 | <Icon type="social-apple"></Icon> |
6 | 7 | <span>Apple</span> |
7 | 8 | </Radio> |
8 | - <Radio value="android" disabled> | |
9 | + <Radio label="android"> | |
9 | 10 | <Icon type="social-android"></Icon> |
10 | 11 | <span>Android</span> |
11 | 12 | </Radio> |
12 | - <Radio value="windows"> | |
13 | + <Radio label="windows"> | |
13 | 14 | <Icon type="social-windows"></Icon> |
14 | 15 | <span>Windows</span> |
15 | 16 | </Radio> |
16 | 17 | </Radio-group> |
17 | - <Radio-group :model.sync="animal"> | |
18 | - <Radio value="金斑蝶"></Radio> | |
19 | - <Radio value="爪哇犀牛"></Radio> | |
20 | - <Radio value="印度黑羚"></Radio> | |
18 | + <Radio-group v-model="animal"> | |
19 | + <Radio label="金斑蝶"></Radio> | |
20 | + <Radio label="爪哇犀牛"></Radio> | |
21 | + <Radio label="印度黑羚"></Radio> | |
21 | 22 | </Radio-group> |
22 | - <br><br> | |
23 | - <i-button @click="activeKey = '2'">换</i-button> | |
23 | + {{ phone }} | |
24 | + <div @click="phone = 'apple'">apple</div> | |
25 | + <div @click="single = true"> single</div>{{ single }} | |
24 | 26 | </div> |
25 | - <Radio :checked.sync="radio">Radio</Radio> | |
26 | - <i-button @click="radio = !radio">change radio</i-button> | |
27 | - <br> | |
28 | - <br> | |
29 | - <Radio-group :model.sync="phone" type="button" vertical> | |
30 | - <Radio value="apple"> | |
31 | - <Icon type="social-apple"></Icon> | |
32 | - <span>Apple</span> | |
33 | - </Radio> | |
34 | - <Radio value="android"> | |
35 | - <Icon type="social-android"></Icon> | |
36 | - <span>Android</span> | |
37 | - </Radio> | |
38 | - <Radio value="windows"> | |
39 | - <Icon type="social-windows"></Icon> | |
40 | - <span>Windows</span> | |
41 | - </Radio> | |
42 | - </Radio-group> | |
43 | - <Radio-group :model.sync="animal" type="button"> | |
44 | - <Radio value="金斑蝶"></Radio> | |
45 | - <Radio value="爪哇犀牛"></Radio> | |
46 | - <Radio value="印度黑羚"></Radio> | |
47 | - </Radio-group> | |
48 | - | |
49 | - <Radio-group :model.sync="animal" type="button"> | |
50 | - <Radio value="金斑蝶" disabled></Radio> | |
51 | - <Radio value="爪哇犀牛" disabled></Radio> | |
52 | - <Radio value="印度黑羚"></Radio> | |
53 | - </Radio-group> | |
54 | - <br><br> | |
55 | - <Radio-group :model.sync="animal" type="button" size="large"> | |
56 | - <Radio value="金斑蝶"></Radio> | |
57 | - <Radio value="爪哇犀牛"></Radio> | |
58 | - <Radio value="印度黑羚"></Radio> | |
59 | - </Radio-group> | |
60 | - <Radio-group :model.sync="animal" type="button"> | |
61 | - <Radio value="金斑蝶"></Radio> | |
62 | - <Radio value="爪哇犀牛"></Radio> | |
63 | - <Radio value="印度黑羚"></Radio> | |
64 | - </Radio-group> | |
65 | - <Radio-group :model.sync="animal" type="button" size="small"> | |
66 | - <Radio value="金斑蝶"></Radio> | |
67 | - <Radio value="爪哇犀牛"></Radio> | |
68 | - <Radio value="印度黑羚"></Radio> | |
69 | - </Radio-group> | |
70 | - <br><br><br><br> | |
71 | - <Checkbox :checked.sync="radio">Checkbox</Checkbox> | |
72 | - <br><br> | |
73 | - <Checkbox-group :model="social"> | |
74 | - <Checkbox value="twitter"> | |
75 | - <Icon type="social-twitter"></Icon> | |
76 | - <span>Twitter</span> | |
77 | - </Checkbox> | |
78 | - <Checkbox value="facebook"> | |
79 | - <Icon type="social-facebook"></Icon> | |
80 | - <span>Facebook</span> | |
81 | - </Checkbox> | |
82 | - <Checkbox value="github"> | |
83 | - <Icon type="social-github"></Icon> | |
84 | - <span>Github</span> | |
85 | - </Checkbox> | |
86 | - <Checkbox value="snapchat"> | |
87 | - <Icon type="social-snapchat"></Icon> | |
88 | - <span>Snapchat</span> | |
89 | - </Checkbox> | |
90 | - </Checkbox-group> | |
91 | - <br><br> | |
92 | - <Checkbox :checked.sync="disabledSingle" disabled>Checkbox</Checkbox> | |
93 | - <Checkbox-group :model="disabledGroup"> | |
94 | - <Checkbox value="香蕉" disabled></Checkbox> | |
95 | - <Checkbox value="苹果" disabled></Checkbox> | |
96 | - <Checkbox value="西瓜"></Checkbox> | |
97 | - </Checkbox-group> | |
98 | - <br><br> | |
99 | - <Switch @on-change="change"></Switch> | |
100 | - <br><br> | |
101 | - <Switch> | |
102 | - <span slot="open">开</span> | |
103 | - <span slot="close">关</span> | |
104 | - </Switch> | |
105 | - <br><br> | |
106 | - <Switch> | |
107 | - <Icon type="android-done" slot="open"></Icon> | |
108 | - <Icon type="android-close" slot="close"></Icon> | |
109 | - </Switch> | |
110 | - <Switch disabled></Switch> | |
111 | - <Switch size="small"></Switch> | |
112 | - <br><br> | |
113 | - <Input-number :max="10" :min="1" :step="1.2" :value="1"></Input-number> | |
114 | - <Input-number :value="2" size="small"></Input-number> | |
115 | - <Input-number :value="2"></Input-number> | |
116 | - <Input-number :value="2" size="large"></Input-number> | |
117 | - <br><br> | |
118 | - <Breadcrumb> | |
119 | - <Breadcrumb-item href="/">Home</Breadcrumb-item> | |
120 | - <Breadcrumb-item href="/components/breadcrumb">Components</Breadcrumb-item> | |
121 | - <Breadcrumb-item>Breadcrumb</Breadcrumb-item> | |
122 | - </Breadcrumb> | |
123 | - <Breadcrumb> | |
124 | - <Breadcrumb-item href="/"> | |
125 | - <Icon type="ios-home-outline"></Icon> Home | |
126 | - </Breadcrumb-item> | |
127 | - <Breadcrumb-item href="/components/breadcrumb"> | |
128 | - <Icon type="social-buffer-outline"></Icon> Components | |
129 | - </Breadcrumb-item> | |
130 | - <Breadcrumb-item> | |
131 | - <Icon type="pound"></Icon> Breadcrumb | |
132 | - </Breadcrumb-item> | |
133 | - </Breadcrumb> | |
134 | - <Breadcrumb separator=">"> | |
135 | - <Breadcrumb-item href="/">Home</Breadcrumb-item> | |
136 | - <Breadcrumb-item href="/components/breadcrumb">Components</Breadcrumb-item> | |
137 | - <Breadcrumb-item>Breadcrumb</Breadcrumb-item> | |
138 | - </Breadcrumb> | |
139 | - <Breadcrumb separator="<b class='demo-breadcrumb-separator'>=></b>"> | |
140 | - <Breadcrumb-item href="/">Home</Breadcrumb-item> | |
141 | - <Breadcrumb-item href="/components/breadcrumb">Components</Breadcrumb-item> | |
142 | - <Breadcrumb-item>Breadcrumb</Breadcrumb-item> | |
143 | - </Breadcrumb> | |
144 | - <br><br> | |
145 | - <Checkbox :checked.sync="single"></Checkbox> | |
146 | 27 | </template> |
147 | 28 | <script> |
148 | - import { Radio, Alert, Icon, Collapse, iButton, Checkbox, Switch, InputNumber, Breadcrumb, LoadingBar } from 'iview'; | |
149 | - | |
150 | - const RadioGroup = Radio.Group; | |
151 | - const Panel = Collapse.Panel; | |
152 | - const CheckboxGroup = Checkbox.Group; | |
153 | - const BreadcrumbItem = Breadcrumb.Item; | |
154 | - | |
155 | 29 | export default { |
156 | - components: { | |
157 | - Radio, | |
158 | - RadioGroup, | |
159 | - Alert, | |
160 | - Icon, | |
161 | - Collapse, | |
162 | - Panel, | |
163 | - iButton, | |
164 | - Checkbox, | |
165 | - CheckboxGroup, | |
166 | - Switch, | |
167 | - InputNumber, | |
168 | - Breadcrumb, | |
169 | - BreadcrumbItem, | |
170 | - LoadingBar | |
171 | - }, | |
172 | - props: { | |
173 | - | |
174 | - }, | |
175 | 30 | data () { |
176 | 31 | return { |
177 | - single: false, | |
178 | - radio: false, | |
179 | - radioGroup: '段模', | |
180 | - activeKey: [1,2], | |
181 | 32 | phone: 'apple', |
182 | 33 | animal: '爪哇犀牛', |
183 | - social: ['facebook', 'github'], | |
184 | - disabledSingle: true, | |
185 | - disabledGroup: ['苹果'] | |
34 | + single: false | |
186 | 35 | } |
187 | 36 | }, |
188 | - computed: { | |
189 | - | |
190 | - }, | |
191 | 37 | methods: { |
192 | - changeGroup (data) { | |
193 | - console.log(data); | |
194 | - }, | |
195 | - closed (data) { | |
38 | + c (data) { | |
196 | 39 | console.log(data) |
197 | - }, | |
198 | - change (status) { | |
199 | - console.log(status); | |
200 | 40 | } |
201 | - }, | |
202 | - ready () { | |
203 | - LoadingBar.start(); | |
204 | 41 | } |
205 | 42 | } |
206 | 43 | </script> | ... | ... |