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

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
}));
主站蜘蛛池模板: 陆丰市| 巴彦淖尔市| 河北区| 福建省| 大丰市| 武清区| 吴堡县| 湘潭市| 青田县| 博客| 兴义市| 长岭县| 固始县| 贞丰县| 深水埗区| 宜宾市| 苗栗县| 丹阳市| 高淳县| 靖西县| 泾阳县| 奉化市| 水城县| 漾濞| 宣化县| 广宁县| 渭南市| 洛川县| 什邡市| 清水县| 洱源县| 井陉县| 多伦县| 六枝特区| 项城市| 怀集县| 正定县| 桦川县| 涿鹿县| 宜州市| 马边|