52
}
53
this.setState({value: event.target.value});
54
}
55
+ componentDidMount() {
56
+ if (this.props.cascade) {
57
+ // Trigger a cascading render immediately upon hydration which rerenders the input.
58
+ this.setState({cascade: true});
59
+ }
60
+ }
61
render() {
62
return (
63
<input
79
}
80
this.setState({value: event.target.value});
81
}
82
+ componentDidMount() {
83
+ if (this.props.cascade) {
84
+ // Trigger a cascading render immediately upon hydration which rerenders the textarea.
85
+ this.setState({cascade: true});
86
+ }
87
+ }
88
render() {
89
return (
90
<textarea
105
}
106
this.setState({value: event.target.checked});
107
}
108
+ componentDidMount() {
109
+ if (this.props.cascade) {
110
+ // Trigger a cascading render immediately upon hydration which rerenders the checkbox.
111
+ this.setState({cascade: true});
112
+ }
113
+ }
114
render() {
115
return (
116
<input
132
}
133
this.setState({value: event.target.value});
134
}
135
+ componentDidMount() {
136
+ if (this.props.cascade) {
137
+ // Trigger a cascading render immediately upon hydration which rerenders the select.
138
+ this.setState({cascade: true});
139
+ }
140
+ }
141
render() {
142
return (
143
<select
385
gate(flags => flags.enableHydrationChangeEvent) ? 1 : 0,
386
);
387
});
388
+
389
+ // @gate enableHydrationChangeEvent
390
+ it('should not blow away user-entered text cascading hydration to a controlled input', async () => {
391
+ let changeCount = 0;
392
+ await testUserInteractionBeforeClientRender(
393
+ <ControlledInput onChange={() => changeCount++} cascade={true} />,
394
+ );
395
+ expect(changeCount).toBe(1);
396
+ });
397
+
398
+ // @gate enableHydrationChangeEvent
399
+ it('should not blow away user-interaction cascading hydration to a controlled range input', async () => {
400
+ let changeCount = 0;
401
+ await testUserInteractionBeforeClientRender(
402
+ <ControlledInput
403
+ type="range"
404
+ initialValue="0.25"
405
+ onChange={() => changeCount++}
406
+ cascade={true}
407
+ />,
408
+ '0.25',
409
+ '1',
410
+ );
411
+ expect(changeCount).toBe(1);
412
+ });
413
+
414
+ // @gate enableHydrationChangeEvent
415
+ it('should not blow away user-entered text cascading hydration to a controlled checkbox', async () => {
416
+ let changeCount = 0;
417
+ await testUserInteractionBeforeClientRender(
418
+ <ControlledCheckbox onChange={() => changeCount++} cascade={true} />,
419
+ true,
420
+ false,
421
+ 'checked',
422
+ );
423
+ expect(changeCount).toBe(1);
424
+ });
425
+
426
+ // @gate enableHydrationChangeEvent
427
+ it('should not blow away user-entered text cascading hydration to a controlled textarea', async () => {
428
+ let changeCount = 0;
429
+ await testUserInteractionBeforeClientRender(
430
+ <ControlledTextArea onChange={() => changeCount++} cascade={true} />,
431
+ );
432
+ expect(changeCount).toBe(1);
433
+ });
434
+
435
+ // @gate enableHydrationChangeEvent
436
+ it('should not blow away user-selected value cascading hydration to an controlled select', async () => {
437
+ let changeCount = 0;
438
+ await testUserInteractionBeforeClientRender(
439
+ <ControlledSelect onChange={() => changeCount++} cascade={true} />,
440
+ );
441
+ expect(changeCount).toBe(1);
442
+ });
443
});
444
});