官术网_书友最值得收藏!

Modifying handleChange to work with multiple fields

The Git tag for this section is handle-change.

After adding all three fields, you will have ended up with three very similar onChange event handlers:

const handleChangeFirstName = ({ target }) =>
setCustomer(customer => ({
...customer,
firstName: target.value
}));

const handleChangeLastName = ({ target }) =>
setCustomer(customer => ({
...customer,
lastName: target.value
}));

const handleChangePhoneNumber = ({ target }) =>
setCustomer(customer => ({
...customer,
phoneNumber: target.value
}));

You can simplify these down into one function, but you'll need to modify your tests first. The calls to ReactTestUtils.Simulate.change needs some extra data to be passed: the target's name. At runtime, this property is passed to all event handlers by React.

Add that in now, as shown:

const itSubmitsNewValue = (fieldName) =>
it('saves new value when submitted', async () => {
...
await ReactTestUtils.Simulate.change(field(fieldName), {
target: { value: 'newValue', name: fieldName }
});
...
});
Test data should always be as simple as possible, by only including what's relevant for the test to pass. We omitted the name property initially because we didn't need it to make our tests pass. Now, we have an opportunity to simplify our production code, so we can include it.

Since the name of our fields is the same as the name of our customer properties, we can now destructure the event to pull out the target name, merging our event handlers into one, as shown. This uses the computed property name feature of ES6:

const handleChange = ({ target }) =>
setCustomer(customer => ({
...customer,
[target.name]: target.value
}));
主站蜘蛛池模板: 宜黄县| 萨嘎县| 漳浦县| 长治市| 宽甸| 弥勒县| 凤凰县| 左云县| 加查县| 嵊州市| 永年县| 古蔺县| 蓝山县| 五家渠市| 濮阳市| 新兴县| 三江| 凤城市| 崇阳县| 渭南市| 玉龙| 左权县| 肇东市| 凤庆县| 慈利县| 江西省| 镶黄旗| 久治县| 黄陵县| 石台县| 乌鲁木齐县| 曲水县| 遵化市| 炎陵县| 云龙县| 泗洪县| 北安市| 正镶白旗| 伽师县| 林甸县| 吉木萨尔县|