Skip to content

Commit e6765cb

Browse files
author
savoygu
committed
Add checkbox and checkbox-group components
1 parent 886a2ca commit e6765cb

File tree

16 files changed

+635
-8
lines changed

16 files changed

+635
-8
lines changed

components.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,7 @@
99
"input": "./packages/input/index.js",
1010
"chip": "./packages/chip/index.js",
1111
"radio": "./packages/radio/index.js",
12-
"radio-group": "./packages/radio-group/index.js"
12+
"radio-group": "./packages/radio-group/index.js",
13+
"checkbox": "./packages/checkbox/index.js",
14+
"checkbox-group": "./packages/checkbox-group/index.js"
1315
}

document/docs/checkbox.md

Lines changed: 317 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,317 @@
1+
<script>
2+
export default {
3+
data () {
4+
return {
5+
checkbox: true,
6+
dynamicValue: '真的',
7+
disabled: true,
8+
filled: false,
9+
vertical: false,
10+
checkboxGroup: ['北京', '上海', '广州', '深圳', '杭州'],
11+
checkedGroup: ['北京', '上海'],
12+
cgTimer: null,
13+
cgDisabled: false,
14+
cgFilled: false,
15+
cgVertical: false,
16+
checkAll: true,
17+
checkboxSkill: ['Vue', 'React', 'Angular4', 'jQuery'],
18+
checkedSkill: ['Vue', 'jQuery'],
19+
indeterminate: true,
20+
checkboxCompanies: ['百度', '腾讯', '阿里'],
21+
checkedCompanies: ['阿里']
22+
}
23+
},
24+
methods: {
25+
loopSwitch () {
26+
let plus = this.checkedGroup.length < this.checkboxGroup.length
27+
let minus = !plus
28+
this.cgTimer = setInterval(_ => {
29+
if (plus) {
30+
this.checkedGroup.push(this.checkboxGroup.filter(c => {
31+
return this.checkedGroup.indexOf(c) === -1
32+
})[0])
33+
}
34+
if (minus) {
35+
this.checkedGroup.shift(this.checkedGroup[0])
36+
}
37+
if (this.checkedGroup.length === this.checkboxGroup.length) {
38+
plus = false
39+
minus = true
40+
}
41+
if (this.checkedGroup.length === 0) {
42+
plus = true
43+
minus = false
44+
}
45+
}, 500)
46+
},
47+
shutdownSwitch () {
48+
clearInterval(this.cgTimer)
49+
this.cgTimer = null
50+
},
51+
handleCheckAllChange (ev) {
52+
this.checkedSkill = ev.target.checked ? this.checkboxSkill : []
53+
this.indeterminate = false
54+
},
55+
handleCheckSkillChange (value) {
56+
let checkedCount = value.length
57+
this.checkAll = checkedCount === this.checkboxSkill.length
58+
this.indeterminate = checkedCount > 0 && checkedCount < this.checkboxSkill.length
59+
}
60+
},
61+
mounted () {
62+
this.loopSwitch()
63+
}
64+
}
65+
</script>
66+
## Checkbox 多选框
67+
68+
当用户只能从一组项目中只进行一个选择时,使用“多选框”。
69+
70+
### 基础用法
71+
72+
:::demo 通过设置 `v-model` 绑定变量,单一的 `checkbox` 中, 默认绑定变量的值类型回事 `Boolean`,选中为 `true`。在组件DOM 结构中,`label` 标签 的`for` 属性对于绑定自定义多选框与输入是必要的,最好为组件提供 `id` 属性并保证其唯一,默认 `id``for` 属性值为 `mv-radio` 组件的内容。
73+
```html
74+
当前值:{{checkbox}}({{checkbox? '选中': '未选中'}})、{{dynamicValue}}
75+
<p><mv-button @click="checkbox=!checkbox;dynamicValue=dynamicValue==='真的'?'假的': '真的'">切换</mv-button></p>
76+
<mv-checkbox v-model="checkbox">{{checkbox? '选中': '未选中'}}</mv-checkbox>
77+
<mv-checkbox v-model="dynamicValue" true-value="真的" false-value="假的">{{dynamicValue? '真的': '假的'}}</mv-checkbox>
78+
79+
<script>
80+
export default {
81+
data () {
82+
return {
83+
checkbox: true,
84+
dynamicValue: '真的'
85+
}
86+
}
87+
}
88+
</script>
89+
```
90+
:::
91+
92+
### 禁用状态
93+
94+
:::demo 通过为 `mv-checkbox`组件 设置 `disabled` 属性,把多选框标记为禁用,它接受一个 `boolean``true` 为禁用。
95+
```html
96+
当前值: {{disabled}}({{disabled?'禁用':'启用'}})
97+
<p><mv-button @click="disabled=!disabled">切换</mv-button></p>
98+
<mv-checkbox :disabled="disabled">禁用</mv-checkbox>
99+
<mv-checkbox v-model="disabled" :disabled="disabled">选中且禁用</mv-checkbox>
100+
101+
<script>
102+
export default {
103+
data () {
104+
return {
105+
disabled: true
106+
}
107+
}
108+
}
109+
</script>
110+
```
111+
:::
112+
113+
### 选中单选框样式带填充
114+
115+
:::demo 通过为 `mv-checkbox`组件 设置 `filled` 属性,改变选中的单选按钮样式,它接受一个 `boolean``true` 为改变。
116+
```html
117+
当前值: {{filled}}
118+
<p><mv-button @click="filled=!filled">切换</mv-button></p>
119+
<mv-checkbox v-model="filled" filled>{{filled ? '选中且填充' : '填充'}}</mv-checkbox>
120+
<mv-checkbox v-model="filled" filled disabled>{{filled ? '选中且禁用且填充' : '禁用且填充'}}</mv-checkbox>
121+
122+
<script>
123+
export default {
124+
data () {
125+
return {
126+
filled: false
127+
}
128+
}
129+
}
130+
</script>
131+
```
132+
:::
133+
134+
### 排列方向
135+
136+
:::demo 通过为 `mv-checkbox`组件 设置 `vertical` 属性,改变的多选框排列方向,默认是水平排列,,它接受一个 `boolean``true` 为垂直排列。
137+
```html
138+
当前选中值:{{vertical}}
139+
<p><mv-button @click="vertical=!vertical">切换</mv-button></p>
140+
<mv-checkbox v-model="vertical" :vertical="vertical" id="horizontal">{{!vertical?'水平排列':'垂直排列'}}</mv-checkbox>
141+
<mv-checkbox v-model="vertical" :vertical="vertical" id="vertical">{{!vertical?'水平排列':'垂直排列'}}</mv-checkbox>
142+
143+
<script>
144+
export default {
145+
data () {
146+
return {
147+
vertical: false
148+
}
149+
}
150+
}
151+
</script>
152+
```
153+
:::
154+
155+
### 多选框组
156+
157+
用于多个多选框绑定到同一个数组的情景,通过是否勾选来表示这一组选项中选中的项。
158+
159+
:::demo `mv-checkbox-group` 组件能把多个 `mv-checkbox` 管理为一组,只需要在 `Group` 中使用 `v-model` 绑定 `Array` 类型的变量即可。 `mv-checkbox``value`属性是该 `checkbox` 对应的值,若该标签中无内容,则该属性也充当 checkbox 按钮后的介绍。`value`与数组中的元素值相对应,如果存在指定的值则为选中状态,否则为不选中。
160+
```html
161+
当前值: {{checkedGroup}}
162+
<p>当前状态:{{cgDisabled ? '禁用' : '启用'}}、{{cgFilled ? '填充' : '非填充'}}、{{cgVertical ? '垂直' : '水平'}}</p>
163+
<p>
164+
<mv-button v-show="!cgTimer" @click="loopSwitch">开启循环</mv-button>
165+
<mv-button v-show="cgTimer" @click="shutdownSwitch">暂停循环</mv-button>
166+
<mv-button @click="cgDisabled = !cgDisabled">{{!cgDisabled ? '禁用' : '启用'}}</mv-button>
167+
<mv-button @click="cgFilled = !cgFilled">{{!cgFilled ? '填充' : '非填充'}}</mv-button>
168+
<mv-button @click="cgVertical = !cgVertical">{{!cgVertical ? '水平' : '垂直'}}</mv-button>
169+
</p>
170+
<mv-checkbox-group v-model="checkedGroup" :disabled="cgDisabled" :filled="cgFilled" :vertical="cgVertical">
171+
<mv-checkbox value="北京"></mv-checkbox>
172+
<mv-checkbox value="上海"></mv-checkbox>
173+
<mv-checkbox value="广州"></mv-checkbox>
174+
<mv-checkbox value="深圳"></mv-checkbox>
175+
<mv-checkbox value="杭州"></mv-checkbox>
176+
</mv-checkbox-group>
177+
178+
<script>
179+
export default {
180+
data () {
181+
return {
182+
checkboxGroup: ['北京', '上海', '广州', '深圳', '杭州'],
183+
checkedGroup: ['北京', '上海'],
184+
cgTimer: null,
185+
cgDisabled: false,
186+
cgFilled: false,
187+
cgVertical: false
188+
}
189+
},
190+
methods: {
191+
loopSwitch () {
192+
let plus = this.checkedGroup.length < this.checkboxGroup.length
193+
let minus = !plus
194+
this.cgTimer = setInterval(_ => {
195+
if (plus) {
196+
this.checkedGroup.push(this.checkboxGroup.filter(c => {
197+
return this.checkedGroup.indexOf(c) === -1
198+
})[0])
199+
}
200+
if (minus) {
201+
this.checkedGroup.shift(this.checkedGroup[0])
202+
}
203+
if (this.checkedGroup.length === this.checkboxGroup.length) {
204+
plus = false
205+
minus = true
206+
}
207+
if (this.checkedGroup.length === 0) {
208+
plus = true
209+
minus = false
210+
}
211+
}, 500)
212+
},
213+
shutdownSwitch () {
214+
clearInterval(this.cgTimer)
215+
this.cgTimer = null
216+
}
217+
},
218+
mounted () {
219+
this.loopSwitch()
220+
}
221+
}
222+
</script>
223+
```
224+
:::
225+
226+
### indeterminate 状态
227+
228+
`indeterminate` 属性用以表示 `checkbox` 的不确定状态,一般用于实现全选的效果
229+
230+
::: demo
231+
```html
232+
<p>当前值:{{checkedSkill}}</p>
233+
<mv-checkbox :indeterminate="indeterminate" v-model="checkAll" @change="handleCheckAllChange">全选</mv-checkbox>
234+
<mv-checkbox-group v-model="checkedSkill" @change="handleCheckSkillChange">
235+
<mv-checkbox v-for="(skill, index) in checkboxSkill" :value="skill" :key="skill"></mv-checkbox>
236+
</mv-checkbox-group>
237+
238+
<script>
239+
export default {
240+
data () {
241+
return {
242+
checkAll: true,
243+
checkboxSkill: ['Vue', 'React', 'Angular4', 'jQuery'],
244+
checkedSkill: ['Vue', 'jQuery'],
245+
indeterminate: true
246+
}
247+
},
248+
methods: {
249+
handleCheckAllChange (ev) {
250+
this.checkedSkill = ev.target.checked ? this.checkboxSkill : []
251+
this.indeterminate = false
252+
},
253+
handleCheckSkillChange (value) {
254+
let checkedCount = value.length
255+
this.checkAll = checkedCount === this.checkboxSkill.length
256+
this.indeterminate = checkedCount > 0 && checkedCount < this.checkboxSkill.length
257+
}
258+
}
259+
}
260+
</script>
261+
```
262+
:::
263+
264+
### 选中数量限制
265+
266+
使用 `min``max` 属性能够限制可以被勾选的项目的数量
267+
268+
::: demo
269+
```html
270+
<p>当前值:{{checkedCompanies}}</p>
271+
<mv-checkbox-group v-model="checkedCompanies" :max="1">
272+
<mv-checkbox v-for="(company, index) in checkboxCompanies" :value="company" :key="company"></mv-checkbox>
273+
</mv-checkbox-group>
274+
275+
<script>
276+
export default {
277+
data () {
278+
return {
279+
checkboxCompanies: ['百度', '腾讯', '阿里'],
280+
checkedCompanies: ['阿里']
281+
}
282+
}
283+
}
284+
</script>
285+
```
286+
:::
287+
288+
### Checkbox Attributes
289+
| 参数 | 说明 | 类型 | 可选值 | 默认值 |
290+
|---------- |-------- |---------- |------------- |-------- |
291+
| value | 选中状态的值(只有在checkbox-group或者绑定对象类型为array时有效) | string |||
292+
| true-value | 动态绑定选中时的值 | string, number || - |
293+
| false-value | 动态绑定未选中时的值 | string, number || - |
294+
| id | 原声 id 属性 | string, number | - | - |
295+
| disabled | 禁用多选框 | boolean || false |
296+
| vertical | 是否垂直排列 | boolean || false |
297+
| filled | 是否选中时填充多选框 | boolean | - | false |
298+
| indeterminate | 设置 indeterminate 状态,只负责样式控制 | boolean | - | false |
299+
300+
### Checkbox-group Attributes
301+
| 参数 | 说明 | 类型 | 可选值 | 默认值 |
302+
|---------- |-------- |---------- |------------- |-------- |
303+
| disabled | 禁用多选框 | boolean || false |
304+
| vertical | 是否垂直排列 | boolean || false |
305+
| filled | 是否选中时填充多选框 | boolean | - | false |
306+
| min | 可被勾选的 checkbox 的最小数量 | number | - | - |
307+
| max | 可被勾选的 checkbox 的最大数量 | number | - | - |
308+
309+
### Checkbox Events
310+
| 事件名称 | 说明 | 回调参数 |
311+
|---------- |-------- |---------- |
312+
| change | 当绑定值变化时触发的事件 | (event: Event) 事件对象 |
313+
314+
### Checkbox-group Events
315+
| 事件名称 | 说明 | 回调参数 |
316+
|---------- |-------- |---------- |
317+
| change | 当绑定值变化时触发的事件 | (value: Array) 选中的多选框 |

document/nav.config.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,10 @@
3636
{
3737
"path": "/radio",
3838
"title": "Radio 单选框"
39+
},
40+
{
41+
"path": "/checkbox",
42+
"title": "Checkbox 多选框"
3943
}
4044
]
4145
}

document/route.config.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ const registerRoute = (navConfig) => {
2626

2727
route.push({
2828
path: '/',
29-
redirect: '/radio',
29+
redirect: '/checkbox',
3030
component: load('component'),
3131
children: []
3232
})

package.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,6 @@
107107
"markdown-it-anchor": "^4.0.0",
108108
"markdown-it-container": "^2.0.0",
109109
"mocha": "^3.2.0",
110-
"node-sass": "^4.0.0",
111110
"optimize-css-assets-webpack-plugin": "^2.0.0",
112111
"phantomjs-prebuilt": "^2.1.14",
113112
"rimraf": "^2.6.1",

packages/checkbox-group/index.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import CheckboxGroup from '../checkbox/src/checkbox-group'
2+
3+
CheckboxGroup.install = function (Vue) {
4+
Vue.component(CheckboxGroup.name, CheckboxGroup)
5+
}
6+
7+
export default CheckboxGroup

packages/checkbox/index.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import Checkbox from './src/checkbox'
2+
3+
Checkbox.install = function (Vue) {
4+
Vue.component(Checkbox.name, Checkbox)
5+
}
6+
7+
export default Checkbox

0 commit comments

Comments
 (0)