Skip to content

Commit c257e7d

Browse files
amberlwanamberlwang
and
amberlwang
authored
Bugfix/checkbox controlled (#158)
* fix:单个checkbox受控 * update:处理radio checked受控 * update:组件初始化 * update:disabled状态的选项排除 * update:stash * feat: checkboxc受控属性 * feat: 文档更新 * feat: 重置radio更新 * feat: 删除更新 Co-authored-by: amberlwang <[email protected]>
1 parent 52fc521 commit c257e7d

File tree

9 files changed

+255
-119
lines changed

9 files changed

+255
-119
lines changed

example/pages/checkbox/checkbox.ts

Lines changed: 32 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,15 @@ Page({
55
demoCheckboxMax: ['checkbox1', 'checkbox2'],
66
demoCheckbox3: ['checkbox2', 'checkbox4'],
77
controledData: [],
8+
checked: true,
9+
checked1: true,
810
options: [
911
{ label: '全选', checkAll: true },
1012
'多选1',
1113
'多选2',
1214
{ label: '多选3', value: '多选3' },
1315
],
14-
checkAllValues: ['多选1', '多选2', '多选3'],
16+
checkAllValues: ['多选1', '多选2', ''],
1517
activeImage:
1618
'https://oteam-tdesign-1258344706.cos.ap-guangzhou.myqcloud.com/miniprogram/checkbox-checked.png',
1719
inActiveImage:
@@ -20,21 +22,24 @@ Page({
2022
checkAll1: ['checkbox1'],
2123
},
2224
handleGroupChange(event) {
23-
console.log('group', event.detail);
25+
console.log('group', event.detail.value);
26+
this.setData({
27+
demoCheckbox1: event.detail.value,
28+
});
2429
},
2530
onChange(event) {
26-
console.log('checkbox', event.detail);
31+
console.log('checkbox', event.detail.value);
2732
},
2833
onCheckAllChange(event) {
29-
console.log('checkbox', event.detail);
34+
console.log('checkbox', event.detail.value);
3035
this.setData({
3136
checkAllValues: event.detail,
3237
});
3338
},
3439
toggle5(e) {
35-
console.log('checkbox', e.detail);
40+
console.log('checkbox', e.detail.value);
3641
this.setData({
37-
check5: e.detail,
42+
check5: e.detail.value,
3843
});
3944
},
4045
handleControled() {
@@ -45,4 +50,25 @@ Page({
4550
controledData: data,
4651
});
4752
},
53+
testControll(val) {
54+
console.log(val.detail);
55+
},
56+
// 受控
57+
controlledHandler(e) {
58+
console.log(e.detail.value);
59+
this.setData({
60+
checked1: e.detail.checked,
61+
});
62+
},
63+
buttonControl() {
64+
console.log(!this.data.checked1);
65+
this.setData({
66+
checked1: !this.data.checked1,
67+
});
68+
},
69+
changeChecked(e) {
70+
this.setData({
71+
checked: e.detail.checked,
72+
});
73+
},
4874
});

example/pages/checkbox/checkbox.wxml

Lines changed: 36 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,23 @@
11
<view class="checkbox-demo">
22
<view class="demo-title">Checkbox多选框</view>
33
<view class="demo-desc">用于预设的一组选项中执行多项选择,并呈现选择结果。</view>
4+
<!-- <t-demo title="测试受控 checked">
5+
<t-checkbox defaultChecked="{{checked}}" label="多选" bind:change="testControll" />
6+
<t-checkbox checked="{{checked1}}" label="多选" bind:change="controlledHandler" />
7+
8+
<button bind:tap="buttonControl">dede</button>
9+
</t-demo> -->
10+
<!-- <t-demo title="全选disabled测试" desc="自定义图标多选框">
11+
<t-checkbox-group defaultValue="{{demoCheckbox2}}" bindchange="onChange">
12+
<t-checkbox checkAll value="" label="全选"> </t-checkbox>
13+
<t-checkbox value="checkbox2" label="多选" disabled> </t-checkbox>
14+
<t-checkbox value="checkbox3" label="多选"> </t-checkbox>
15+
<t-checkbox value="checkbox1" label="多选"> </t-checkbox>
16+
</t-checkbox-group>
17+
</t-demo> -->
18+
419
<t-demo title="01 类型" desc="基础多选框">
5-
<t-checkbox-group value="{{demoCheckbox1}}" bind:change="onChange">
20+
<t-checkbox-group value="{{demoCheckbox1}}" bind:change="handleGroupChange">
621
<t-checkbox value="checkbox1" label="多选" />
722
<t-checkbox value="checkbox2" label="多选" />
823
<t-checkbox value="checkbox3" label="多选" />
@@ -18,7 +33,7 @@
1833
</t-demo>
1934

2035
<t-demo title="" desc="右侧多选框">
21-
<t-checkbox-group value="{{demoCheckbox2}}" bind:change="onChange">
36+
<t-checkbox-group defaultValue="{{demoCheckbox2}}" bind:change="onChange">
2237
<t-checkbox value="checkbox1" label="多选" align="right" />
2338
<t-checkbox value="checkbox2" label="多选" align="right"></t-checkbox>
2439
<t-checkbox value="checkbox3" label="多选" align="right"></t-checkbox>
@@ -35,21 +50,21 @@
3550
<t-demo title="" desc="带全选多选框">
3651
<t-checkbox-group
3752
options="{{options}}"
38-
value="{{checkAllValues}}"
53+
defaultValue="{{checkAllValues}}"
3954
bind:change="onCheckAllChange"
4055
></t-checkbox-group>
4156
</t-demo>
4257

4358
<t-demo title="" desc="限制最多可选数量">
44-
<t-checkbox-group max="{{2}}" bind:change="onChange" value="{{demoCheckboxMax}}">
59+
<t-checkbox-group max="{{2}}" bind:change="onChange" defaultValue="{{demoCheckboxMax}}">
4560
<t-checkbox value="checkbox1" label="多选" />
4661
<t-checkbox value="checkbox2" label="多选" />
4762
<t-checkbox value="checkbox3" label="多选" />
4863
</t-checkbox-group>
4964
</t-demo>
5065

5166
<t-demo title="02 禁用状态" desc="多选框禁用态">
52-
<t-checkbox-group value="{{demoCheckbox3}}" disabled>
67+
<t-checkbox-group defaultValue="{{demoCheckbox3}}" disabled>
5368
<t-checkbox value="checkbox1" label="多选" />
5469
<t-checkbox value="checkbox2" label="多选" />
5570
<t-checkbox value="checkbox3" label="多选" align="right" />
@@ -58,11 +73,11 @@
5873
</t-demo>
5974

6075
<t-demo title="" desc="多选半选态">
61-
<t-checkbox label="半选" indeterminate readonly></t-checkbox>
76+
<t-checkbox label="半选" indeterminate readonly defaultChecked="{{true}}"></t-checkbox>
6277
</t-demo>
6378

6479
<t-demo title="03 特殊类型" desc="自定义图标多选框">
65-
<t-checkbox-group value="{{demoCheckbox2}}" bindchange="onChange">
80+
<t-checkbox-group defaultValue="{{demoCheckbox2}}" bindchange="onChange">
6681
<t-checkbox value="checkbox1" label="多选" icon="{{[activeImage,inActiveImage]}}">
6782
</t-checkbox>
6883
<t-checkbox value="checkbox2" label="多选" icon="{{[activeImage,inActiveImage]}}">
@@ -73,9 +88,21 @@
7388
</t-demo>
7489

7590
<t-demo title="04 规格" desc="多选框尺寸规格">
76-
<t-checkbox value="checkbox1" label="多选H48" t-class="t-checkbox-padding" checked>
91+
<t-checkbox
92+
value="checkbox1"
93+
label="多选H48"
94+
t-class="t-checkbox-padding"
95+
checked="{{checked}}"
96+
bind:change="changeChecked"
97+
>
98+
</t-checkbox>
99+
<t-checkbox
100+
value="checkbox2"
101+
t-class="t-checkbox-demo"
102+
label="多选H56"
103+
defaultChecked="{{checked}}"
104+
>
77105
</t-checkbox>
78-
<t-checkbox value="checkbox2" t-class="t-checkbox-demo" label="多选H56" checked> </t-checkbox>
79106
</t-demo>
80107
<view style="height: 74rpx"></view>
81108
</view>

src/checkbox-group/README.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,12 @@ isComponent: true
2828

2929
```html
3030
<!-- page.wxml -->
31-
<t-checkbox-group bordered value="checkbox1" bind:change="onChange">
32-
<t-checkbox title="单行标题" name="checkbox1" />
33-
<t-checkbox title="单行标题" label="辅助信息" name="checkbox2" />
31+
<t-checkbox-group bordered defaultValue="checkbox1" bind:change="onChange">
32+
<t-checkbox title="单行标题" value="checkbox1" />
33+
<t-checkbox title="单行标题" label="辅助信息" value="checkbox2" />
3434
</t-checkbox-group>
3535
```
36-
36+
<t-checkbox title="单行标题" value="checkbox1" defaultChecked="{{true}}"/>
3737
## API
3838

3939
### `<t-checkbox-group>` 组件

src/checkbox-group/checkbox-group.ts

Lines changed: 65 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,17 @@ export default class CheckBoxGroup extends SuperComponent {
2222
checkboxOptions: [],
2323
};
2424

25-
properties = Props;
25+
properties = {
26+
...Props,
27+
defaultValue: {
28+
type: null,
29+
value: undefined,
30+
},
31+
};
2632

2733
observers = {
2834
value: function () {
29-
this.updateChildren('slot');
35+
this.updateChildren();
3036
},
3137
};
3238

@@ -36,31 +42,45 @@ export default class CheckBoxGroup extends SuperComponent {
3642
},
3743
};
3844

45+
controlledProps = [
46+
{
47+
key: 'value',
48+
event: 'change',
49+
},
50+
];
51+
3952
methods = {
40-
// slot插入选项
41-
updateChildren(type = 'slot') {
42-
let items = [];
43-
if (type === 'not-slot') {
53+
getChilds() {
54+
let items = this.getRelationNodes('../checkbox/checkbox');
55+
if (!items.length) {
4456
items = this.selectAllComponents('.t-checkbox-option');
45-
} else {
46-
items = this.getRelationNodes('../checkbox/checkbox');
4757
}
58+
return items || [];
59+
},
60+
61+
// slot插入选项
62+
updateChildren() {
63+
const items = this.getChilds();
64+
4865
const { value, disabled } = this.data;
4966
if (items.length > 0) {
5067
items.forEach((item: any) => {
51-
!item.data.checkAll && item.changeActive(value.indexOf(item.data.value) > -1);
68+
!item.data.checkAll &&
69+
item.setData({
70+
checked: value?.indexOf(item.data.value) > -1,
71+
});
5272
item.setDisabled(disabled);
5373
});
5474
// 关联可全选项
5575
if (items.findIndex((item) => item.data.checkAll) > -1) {
5676
items.forEach((item) => {
5777
item.setOptionLinked(true);
5878
});
59-
this.handleHalfCheck(type, items.length);
79+
this.handleHalfCheck(items.length);
6080
}
6181
}
6282
},
63-
updateValue({ name, checked }, type = 'slot') {
83+
updateValue({ name, checked }) {
6484
const { value, max } = this.data;
6585
let newValue = value;
6686
if (max && checked && newValue.length === max) {
@@ -72,11 +92,11 @@ export default class CheckBoxGroup extends SuperComponent {
7292
const index = newValue.findIndex((v: string) => v === name);
7393
newValue.splice(index, 1);
7494
}
75-
this.setData({
76-
value: newValue,
77-
});
78-
this.updateChildren(type);
79-
this.triggerEvent('change', newValue);
95+
// this.setData({
96+
// value: newValue,
97+
// });
98+
// this.updateChildren();
99+
this._trigger('change', { value: newValue });
80100
},
81101
// 支持自定义options
82102
handleCreateMulCheckbox() {
@@ -103,57 +123,62 @@ export default class CheckBoxGroup extends SuperComponent {
103123
this.setData({
104124
checkboxOptions: optionsValue,
105125
});
106-
this.updateChildren('not-slot');
126+
this.updateChildren();
107127
} catch (error) {
108128
console.error('error', error);
109129
}
110130
},
111131
// 处理全选
112132
handleCheckAll(e) {
113-
const { checked, option, name, type } = e.detail || e;
114-
let items = [];
115-
if (type === 'not-slot') {
116-
items = this.selectAllComponents('.t-checkbox-option');
117-
} else {
118-
items = this.getRelationNodes('../checkbox/checkbox');
119-
}
133+
const { checked, option, name } = e.detail || e;
134+
const items = this.getChilds();
135+
120136
if (!option) {
121137
if (!items?.length) {
122138
return;
123139
}
124-
this.setData({
140+
// this.setData({
141+
// value: items
142+
// .map((item) => {
143+
// if (item.data.disabled) {
144+
// return this.data.value.includes(item.data.value) ? item.data.value : '';
145+
// }
146+
// item.changeActive(checked);
147+
// return checked && !item.data.checkAll ? item.data.value : '';
148+
// })
149+
// .filter((val) => val),
150+
// });
151+
this._trigger('change', {
125152
value: items
126153
.map((item) => {
127154
if (item.data.disabled) {
128-
return '';
155+
return this.data.value.includes(item.data.value) ? item.data.value : '';
129156
}
130-
item.changeActive(checked);
157+
// item.changeActive(checked);
131158
return checked && !item.data.checkAll ? item.data.value : '';
132159
})
133160
.filter((val) => val),
134161
});
135-
this.triggerEvent('change', this.data.value);
136-
this.handleHalfCheck(type, items.length);
162+
// this.handleHalfCheck(items.length);
137163
} else {
138-
this.updateValue({ name, checked }, type);
164+
this.updateValue({ name, checked });
139165
}
140166
},
141167
// 处理options半选
142-
handleHalfCheck(type: string, len: number) {
143-
let items = [];
144-
if (type === 'not-slot') {
145-
items = this.selectAllComponents('.t-checkbox-option');
146-
} else {
147-
items = this.getRelationNodes('../checkbox/checkbox');
148-
}
168+
handleHalfCheck(len: number) {
169+
const items = this.getChilds();
149170
const all = items.filter((i) => !i.data.checkAll).map((item) => item.data.value);
150-
const currentVal = Array.from(new Set(this.data.value.filter((i) => all.indexOf(i) > -1)));
171+
const excludeDisableArr = items
172+
.filter((i) => !i.data.checkAll && i.data.value && !i.data.disabled)
173+
.map((item) => item.data.value);
174+
const currentVal = Array.from(new Set(this.data.value?.filter((i) => all.indexOf(i) > -1)));
151175
const element = items.find((item) => item.data.checkAll);
152176
if (currentVal.length) {
153-
element?.changeActive(true);
177+
element?.setData({ checked: true });
154178
element?.changeCheckAllHalfStatus(currentVal.length !== len - 1);
179+
element?.setCancel(currentVal.length >= excludeDisableArr.length);
155180
} else {
156-
element?.changeActive(false);
181+
element?.setData({ checked: false });
157182
}
158183
},
159184
// 设置可全选option选项

0 commit comments

Comments
 (0)