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

Using state instead of props

It's finally time to introduce some state into our component. Add the following test, which what should happen when the text field value changes:

it('saves new first name when submitted', async () => {
expect.hasAssertions();
render(
<CustomerForm
firstName="Ashley"
onSubmit={({ firstName }) =>
expect(firstName).toEqual('Jamie')
}
/>
);
await ReactTestUtils.Simulate.change( firstNameField(), {
target: { value: 'Jamie' }
});
await ReactTestUtils.Simulate.submit(form('customer'));
});

The call to Simulate.change dispatches a React onChange event to the field. The event object sends the value of the text field to the event handler, which we'll use to set state.

In the browser, this event would be dispatched after every keystroke; however, in our test, we simulate just the final change event. That's enough because we'll write our event handler to always overwrite previous changes. In other words, only the last change matters.

Follow these steps to make this pass:

  1. Import useState into the module by modifying the existing React import:
import React, { useState } from 'react';
  1. Change the customer constant definition to be assigned via a call to useState. The default state is the original value of customer. Note the relationship between the two pieces of code. This is an example of how we can "upgrade" existing code from one level of complexity to another—in this case, from a constant definition to a state variable:
const [ customer, setCustomer ] = useState({ firstName });
  1. Create a new arrow function that will act as our event handler. This uses the form of setCustomer that takes a function. Using this form ensures that we correctly apply updates in the right order:
const handleChangeFirstName = ({ target }) =>
setCustomer(customer => ({
...customer,
firstName: target.value
}));
  1. In the returned JSX, modify the input element as shown. We replace the readOnly property with an onChange property, hooking it up to the handler we just created:
<input
type="text"
name="firstName"
id="firstName"
value={firstName}
onChange={handleChangeFirstName}
/>
主站蜘蛛池模板: 鲁甸县| 呼图壁县| 扎鲁特旗| 和顺县| 南京市| 平和县| 汝南县| 邻水| 宝丰县| 会昌县| 肇东市| 瑞安市| 健康| 大渡口区| 峨眉山市| 华宁县| 红河县| 惠州市| 安新县| 奈曼旗| 新营市| 旬邑县| 胶州市| 阿拉善右旗| 玛纳斯县| 九江县| 靖远县| 资中县| 正蓝旗| 大石桥市| 香河县| 武宣县| 滦平县| 自治县| 仲巴县| 法库县| 土默特左旗| 武宣县| 商水县| 卓资县| 延寿县|