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,7 +11,7 @@ | ||
11 | export default { | 11 | export default { |
12 | name: 'radioGroup', | 12 | name: 'radioGroup', |
13 | props: { | 13 | props: { |
14 | - model: { | 14 | + value: { |
15 | type: [String, Number], | 15 | type: [String, Number], |
16 | default: '' | 16 | default: '' |
17 | }, | 17 | }, |
@@ -30,6 +30,11 @@ | @@ -30,6 +30,11 @@ | ||
30 | default: false | 30 | default: false |
31 | } | 31 | } |
32 | }, | 32 | }, |
33 | + data () { | ||
34 | + return { | ||
35 | + currentValue: this.value | ||
36 | + } | ||
37 | + }, | ||
33 | computed: { | 38 | computed: { |
34 | classes () { | 39 | classes () { |
35 | return [ | 40 | return [ |
@@ -42,27 +47,29 @@ | @@ -42,27 +47,29 @@ | ||
42 | ]; | 47 | ]; |
43 | } | 48 | } |
44 | }, | 49 | }, |
45 | - compiled () { | ||
46 | - this.updateModel(); | 50 | + mounted () { |
51 | + this.updateValue(); | ||
47 | }, | 52 | }, |
48 | methods: { | 53 | methods: { |
49 | - updateModel () { | ||
50 | - const model = this.model; | 54 | + updateValue () { |
55 | + const value = this.value; | ||
51 | this.$children.forEach((child) => { | 56 | this.$children.forEach((child) => { |
52 | - child.selected = model == child.value; | 57 | + child.currentValue = value == child.label; |
53 | child.group = true; | 58 | child.group = true; |
54 | }); | 59 | }); |
55 | }, | 60 | }, |
56 | change (data) { | 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 | this.$emit('on-change', data.value); | 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 | watch: { | 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,31 +6,32 @@ | ||
6 | type="radio" | 6 | type="radio" |
7 | :class="inputClasses" | 7 | :class="inputClasses" |
8 | :disabled="disabled" | 8 | :disabled="disabled" |
9 | - :checked="selected" | 9 | + :checked="currentValue" |
10 | @change="change"> | 10 | @change="change"> |
11 | - </span><slot>{{ value }}</slot> | 11 | + </span><slot>{{ label }}</slot> |
12 | </label> | 12 | </label> |
13 | </template> | 13 | </template> |
14 | <script> | 14 | <script> |
15 | const prefixCls = 'ivu-radio'; | 15 | const prefixCls = 'ivu-radio'; |
16 | 16 | ||
17 | export default { | 17 | export default { |
18 | + name: 'Radio', | ||
18 | props: { | 19 | props: { |
19 | - checked: { | 20 | + value: { |
20 | type: Boolean, | 21 | type: Boolean, |
21 | default: false | 22 | default: false |
22 | }, | 23 | }, |
24 | + label: { | ||
25 | + type: [String, Number] | ||
26 | + }, | ||
23 | disabled: { | 27 | disabled: { |
24 | type: Boolean, | 28 | type: Boolean, |
25 | default: false | 29 | default: false |
26 | - }, | ||
27 | - value: { | ||
28 | - type: [String, Number] | ||
29 | } | 30 | } |
30 | }, | 31 | }, |
31 | data () { | 32 | data () { |
32 | return { | 33 | return { |
33 | - selected: false, | 34 | + currentValue: this.value, |
34 | group: false | 35 | group: false |
35 | }; | 36 | }; |
36 | }, | 37 | }, |
@@ -40,7 +41,7 @@ | @@ -40,7 +41,7 @@ | ||
40 | `${prefixCls}-wrapper`, | 41 | `${prefixCls}-wrapper`, |
41 | { | 42 | { |
42 | [`${prefixCls}-group-item`]: this.group, | 43 | [`${prefixCls}-group-item`]: this.group, |
43 | - [`${prefixCls}-wrapper-checked`]: this.selected, | 44 | + [`${prefixCls}-wrapper-checked`]: this.currentValue, |
44 | [`${prefixCls}-wrapper-disabled`]: this.disabled | 45 | [`${prefixCls}-wrapper-disabled`]: this.disabled |
45 | } | 46 | } |
46 | ]; | 47 | ]; |
@@ -49,7 +50,7 @@ | @@ -49,7 +50,7 @@ | ||
49 | return [ | 50 | return [ |
50 | `${prefixCls}`, | 51 | `${prefixCls}`, |
51 | { | 52 | { |
52 | - [`${prefixCls}-checked`]: this.selected, | 53 | + [`${prefixCls}-checked`]: this.currentValue, |
53 | [`${prefixCls}-disabled`]: this.disabled | 54 | [`${prefixCls}-disabled`]: this.disabled |
54 | } | 55 | } |
55 | ]; | 56 | ]; |
@@ -61,10 +62,10 @@ | @@ -61,10 +62,10 @@ | ||
61 | return `${prefixCls}-input`; | 62 | return `${prefixCls}-input`; |
62 | } | 63 | } |
63 | }, | 64 | }, |
64 | - ready () { | 65 | + mounted () { |
65 | if (this.$parent && this.$parent.$options.name === 'radioGroup') this.group = true; | 66 | if (this.$parent && this.$parent.$options.name === 'radioGroup') this.group = true; |
66 | if (!this.group) { | 67 | if (!this.group) { |
67 | - this.updateModel(); | 68 | + this.updateValue(); |
68 | } | 69 | } |
69 | }, | 70 | }, |
70 | methods: { | 71 | methods: { |
@@ -73,25 +74,27 @@ | @@ -73,25 +74,27 @@ | ||
73 | return false; | 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 | this.$parent.change({ | 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 | watch: { | 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,7 +27,7 @@ import Input from './components/input'; | ||
27 | // import Page from './components/page'; | 27 | // import Page from './components/page'; |
28 | // import Poptip from './components/poptip'; | 28 | // import Poptip from './components/poptip'; |
29 | // import Progress from './components/progress'; | 29 | // import Progress from './components/progress'; |
30 | -// import Radio from './components/radio'; | 30 | +import Radio from './components/radio'; |
31 | // import Rate from './components/rate'; | 31 | // import Rate from './components/rate'; |
32 | // import Slider from './components/slider'; | 32 | // import Slider from './components/slider'; |
33 | // import Spin from './components/spin'; | 33 | // import Spin from './components/spin'; |
@@ -89,8 +89,8 @@ const iview = { | @@ -89,8 +89,8 @@ const iview = { | ||
89 | // Panel: Collapse.Panel, | 89 | // Panel: Collapse.Panel, |
90 | // Poptip, | 90 | // Poptip, |
91 | // Progress, | 91 | // Progress, |
92 | - // Radio, | ||
93 | - // RadioGroup: Radio.Group, | 92 | + Radio, |
93 | + RadioGroup: Radio.Group, | ||
94 | // Rate, | 94 | // Rate, |
95 | Row, | 95 | Row, |
96 | // iSelect: Select, | 96 | // iSelect: Select, |
test/app.vue
@@ -28,6 +28,7 @@ li + li { | @@ -28,6 +28,7 @@ li + li { | ||
28 | <li><router-link to="/grid">Grid</router-link></li> | 28 | <li><router-link to="/grid">Grid</router-link></li> |
29 | <li><router-link to="/button">Button</router-link></li> | 29 | <li><router-link to="/button">Button</router-link></li> |
30 | <li><router-link to="/input">Input</router-link></li> | 30 | <li><router-link to="/input">Input</router-link></li> |
31 | + <li><router-link to="/radio">Radio</router-link></li> | ||
31 | </ul> | 32 | </ul> |
32 | </nav> | 33 | </nav> |
33 | <router-view></router-view> | 34 | <router-view></router-view> |
test/main.js
@@ -32,6 +32,10 @@ const router = new VueRouter({ | @@ -32,6 +32,10 @@ const router = new VueRouter({ | ||
32 | { | 32 | { |
33 | path: '/input', | 33 | path: '/input', |
34 | component: require('./routers/input.vue') | 34 | component: require('./routers/input.vue') |
35 | + }, | ||
36 | + { | ||
37 | + path: '/radio', | ||
38 | + component: require('./routers/radio.vue') | ||
35 | } | 39 | } |
36 | ] | 40 | ] |
37 | }); | 41 | }); |
test/routers/radio.vue
1 | <template> | 1 | <template> |
2 | <div> | 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 | <Icon type="social-apple"></Icon> | 6 | <Icon type="social-apple"></Icon> |
6 | <span>Apple</span> | 7 | <span>Apple</span> |
7 | </Radio> | 8 | </Radio> |
8 | - <Radio value="android" disabled> | 9 | + <Radio label="android"> |
9 | <Icon type="social-android"></Icon> | 10 | <Icon type="social-android"></Icon> |
10 | <span>Android</span> | 11 | <span>Android</span> |
11 | </Radio> | 12 | </Radio> |
12 | - <Radio value="windows"> | 13 | + <Radio label="windows"> |
13 | <Icon type="social-windows"></Icon> | 14 | <Icon type="social-windows"></Icon> |
14 | <span>Windows</span> | 15 | <span>Windows</span> |
15 | </Radio> | 16 | </Radio> |
16 | </Radio-group> | 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 | </Radio-group> | 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 | </div> | 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 | </template> | 27 | </template> |
147 | <script> | 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 | export default { | 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 | data () { | 30 | data () { |
176 | return { | 31 | return { |
177 | - single: false, | ||
178 | - radio: false, | ||
179 | - radioGroup: '段模', | ||
180 | - activeKey: [1,2], | ||
181 | phone: 'apple', | 32 | phone: 'apple', |
182 | animal: '爪哇犀牛', | 33 | animal: '爪哇犀牛', |
183 | - social: ['facebook', 'github'], | ||
184 | - disabledSingle: true, | ||
185 | - disabledGroup: ['苹果'] | 34 | + single: false |
186 | } | 35 | } |
187 | }, | 36 | }, |
188 | - computed: { | ||
189 | - | ||
190 | - }, | ||
191 | methods: { | 37 | methods: { |
192 | - changeGroup (data) { | ||
193 | - console.log(data); | ||
194 | - }, | ||
195 | - closed (data) { | 38 | + c (data) { |
196 | console.log(data) | 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 | </script> | 43 | </script> |