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

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
}));
主站蜘蛛池模板: 镇赉县| 泰州市| 宁明县| 成都市| 英超| 凉城县| 通化市| 鄂温| 阿拉善左旗| 汉中市| 沙洋县| 蕉岭县| 米林县| 廉江市| 涪陵区| 台山市| 大英县| 神池县| 梅州市| 北京市| 华蓥市| 孟州市| 连江县| 仁布县| 合水县| 鹤庆县| 莲花县| 北碚区| 哈巴河县| 滁州市| 德州市| 永兴县| 赤峰市| 龙江县| 呼玛县| 饶河县| 葫芦岛市| 三门县| 黄浦区| 平陆县| 泽普县|