Skip to content

Commit 175ab8d

Browse files
authored
add checkbox key events (#204)
* add checkbox key events * add key event tests and demo * add keyboard events default handler test
1 parent 0767540 commit 175ab8d

File tree

3 files changed

+113
-23
lines changed

3 files changed

+113
-23
lines changed

examples/simple.jsx

+49-18
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,19 @@ import Checkbox from '../src';
44
import '../assets/index.less';
55

66
function onChange(e) {
7-
console.log('Checkbox checked:', (e.target.checked));
7+
console.log('Checkbox checked:', e.target.checked);
8+
}
9+
10+
function onKeyDown(e) {
11+
console.log('Checkbox key down:', e.key);
12+
}
13+
14+
function onKeyPress(e) {
15+
console.log('Checkbox key press:', e.key);
16+
}
17+
18+
function onKeyUp(e) {
19+
console.log('Checkbox key up:', e.key);
820
}
921

1022
export default class SimpleDemo extends React.Component {
@@ -16,32 +28,45 @@ export default class SimpleDemo extends React.Component {
1628
this.setState(state => ({
1729
disabled: !state.disabled,
1830
}));
19-
}
31+
};
2032

2133
render() {
2234
return (
2335
<div style={{ margin: 20 }}>
2436
<div>
2537
<p>
2638
<label>
27-
<Checkbox
28-
checked
29-
onChange={onChange}
30-
disabled={this.state.disabled}
31-
/>
39+
<Checkbox checked onChange={onChange} disabled={this.state.disabled} />
3240
&nbsp; controlled checked rc-checkbox
3341
</label>
3442
&nbsp;&nbsp;
3543
</p>
44+
<p>
45+
<label>
46+
<input checked type="checkbox" onChange={onChange} disabled={this.state.disabled} />
47+
&nbsp; controlled checked native
48+
</label>
49+
&nbsp;&nbsp;
50+
</p>
51+
</div>
52+
53+
<div>
54+
<p>
55+
<label>
56+
<Checkbox defaultChecked onChange={onChange} disabled={this.state.disabled} />
57+
&nbsp; defaultChecked rc-checkbox
58+
</label>
59+
&nbsp;&nbsp;
60+
</p>
3661
<p>
3762
<label>
3863
<input
39-
checked
4064
type="checkbox"
65+
defaultChecked
4166
onChange={onChange}
4267
disabled={this.state.disabled}
4368
/>
44-
&nbsp; controlled checked native
69+
&nbsp; defaultChecked native
4570
</label>
4671
&nbsp;&nbsp;
4772
</p>
@@ -51,23 +76,25 @@ export default class SimpleDemo extends React.Component {
5176
<p>
5277
<label>
5378
<Checkbox
79+
name="my-checkbox"
5480
defaultChecked
5581
onChange={onChange}
5682
disabled={this.state.disabled}
5783
/>
58-
&nbsp; defaultChecked rc-checkbox
84+
&nbsp; defaultChecked rc-checkbox with name
5985
</label>
6086
&nbsp;&nbsp;
6187
</p>
6288
<p>
6389
<label>
6490
<input
91+
name="my-checkbox"
6592
type="checkbox"
6693
defaultChecked
6794
onChange={onChange}
6895
disabled={this.state.disabled}
6996
/>
70-
&nbsp; defaultChecked native
97+
&nbsp; defaultChecked native with name
7198
</label>
7299
&nbsp;&nbsp;
73100
</p>
@@ -77,31 +104,35 @@ export default class SimpleDemo extends React.Component {
77104
<p>
78105
<label>
79106
<Checkbox
80-
name="my-checkbox"
81-
defaultChecked
82107
onChange={onChange}
108+
onKeyDown={onKeyDown}
109+
onKeyPress={onKeyPress}
110+
onKeyUp={onKeyUp}
83111
disabled={this.state.disabled}
84112
/>
85-
&nbsp; defaultChecked rc-checkbox with name
113+
&nbsp; rc-checkbox with key events
86114
</label>
87115
&nbsp;&nbsp;
88116
</p>
89117
<p>
90118
<label>
91119
<input
92-
name="my-checkbox"
93120
type="checkbox"
94-
defaultChecked
95121
onChange={onChange}
122+
onKeyDown={onKeyDown}
123+
onKeyPress={onKeyPress}
124+
onKeyUp={onKeyUp}
96125
disabled={this.state.disabled}
97126
/>
98-
&nbsp; defaultChecked native with name
127+
&nbsp; native checkbox with key events
99128
</label>
100129
&nbsp;&nbsp;
101130
</p>
102131
</div>
103132

104-
<button type="button" onClick={this.toggle}>toggle disabled</button>
133+
<button type="button" onClick={this.toggle}>
134+
toggle disabled
135+
</button>
105136
</div>
106137
);
107138
}

src/index.jsx

+12-3
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@ class Checkbox extends Component {
1212
onFocus() {},
1313
onBlur() {},
1414
onChange() {},
15+
onKeyDown() {},
16+
onKeyPress() {},
17+
onKeyUp() {},
1518
};
1619

1720
constructor(props) {
@@ -42,7 +45,7 @@ class Checkbox extends Component {
4245
this.input.blur();
4346
}
4447

45-
handleChange = (e) => {
48+
handleChange = e => {
4649
const { disabled, onChange } = this.props;
4750
if (disabled) {
4851
return;
@@ -69,9 +72,9 @@ class Checkbox extends Component {
6972
}
7073
};
7174

72-
saveInput = (node) => {
75+
saveInput = node => {
7376
this.input = node;
74-
}
77+
};
7578

7679
render() {
7780
const {
@@ -87,6 +90,9 @@ class Checkbox extends Component {
8790
onClick,
8891
onFocus,
8992
onBlur,
93+
onKeyDown,
94+
onKeyPress,
95+
onKeyUp,
9096
autoFocus,
9197
value,
9298
required,
@@ -122,6 +128,9 @@ class Checkbox extends Component {
122128
onClick={onClick}
123129
onFocus={onFocus}
124130
onBlur={onBlur}
131+
onKeyUp={onKeyUp}
132+
onKeyDown={onKeyDown}
133+
onKeyPress={onKeyPress}
125134
onChange={this.handleChange}
126135
autoFocus={autoFocus}
127136
ref={this.saveInput}

tests/index.test.jsx

+52-2
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,13 @@ describe('rc-checkbox', () => {
3434
const onChange = jest.fn();
3535
const wrapper = mount(
3636
<div onChange={onChange}>
37-
<Checkbox onChange={e => { e.stopPropagation(); e.preventDefault(); }} />
38-
</div>
37+
<Checkbox
38+
onChange={e => {
39+
e.stopPropagation();
40+
e.preventDefault();
41+
}}
42+
/>
43+
</div>,
3944
);
4045
wrapper.find('input').simulate('change', { target: { checked: true } });
4146
expect(onChange).not.toHaveBeenCalled();
@@ -122,4 +127,49 @@ describe('rc-checkbox', () => {
122127
const renderedInput = wrapper.find('input').getDOMNode();
123128
expect(renderedInput.hasAttribute('required')).toBe(true);
124129
});
130+
131+
it('onKeyDown', () => {
132+
const container = document.createElement('div');
133+
document.body.appendChild(container);
134+
const onKeyDown = jest.fn();
135+
const wrapper = mount(<Checkbox onKeyDown={onKeyDown} />, { attachTo: container });
136+
wrapper.find('input').simulate('keydown');
137+
expect(onKeyDown).toBeCalled();
138+
});
139+
140+
it('onKeyPress', () => {
141+
const container = document.createElement('div');
142+
document.body.appendChild(container);
143+
const onKeyPress = jest.fn();
144+
const wrapper = mount(<Checkbox onKeyPress={onKeyPress} />, { attachTo: container });
145+
wrapper.find('input').simulate('keypress');
146+
expect(onKeyPress).toBeCalled();
147+
});
148+
149+
it('onKeyUp', () => {
150+
const container = document.createElement('div');
151+
document.body.appendChild(container);
152+
const onKeyUp = jest.fn();
153+
const wrapper = mount(<Checkbox onKeyUp={onKeyUp} />, { attachTo: container });
154+
wrapper.find('input').simulate('keyup');
155+
expect(onKeyUp).toBeCalled();
156+
});
157+
158+
it('has default keyboard events handler', () => {
159+
const onKeyDown = jest.fn();
160+
const onKeyPress = jest.fn();
161+
const onKeyUp = jest.fn();
162+
163+
const wrapper = mount(
164+
<div onKeyDown={onKeyDown} onKeyPress={onKeyPress} onKeyUp={onKeyUp}>
165+
<Checkbox />
166+
</div>,
167+
);
168+
wrapper.find('input').simulate('keydown');
169+
expect(onKeyDown).toBeCalled();
170+
wrapper.find('input').simulate('keypress');
171+
expect(onKeyPress).toBeCalled();
172+
wrapper.find('input').simulate('keyup');
173+
expect(onKeyUp).toBeCalled();
174+
});
125175
});

0 commit comments

Comments
 (0)