// 子组件 const UserSelect = ({ packageList }) => { useEffect(() => { // 接口 getData(packageList); }, [packageList]); return <div>aa</div>; }; // 父组件 <Form> <Form.Item extra="个数"> {getFieldDecorator('package_name_selectors', { initialValue: 7, })(<InputNumber />)} </Form.Item> <Form.Item extra="日期"> {getFieldDecorator('date', { initialValue: 1, })(<Input />)} </Form.Item> <UserSelect packageList={getFieldValue('package_name_selectors')} />; </Form>; 父组件中的表单值如date改变的时候 会不断的调用子组件中的接口 是为什么
时间: 2024-04-23 08:28:00 浏览: 12
在你提供的代码中,父组件中的表单项值(例如 `date`)发生变化时,会导致子组件 `UserSelect` 中的接口不断被调用的原因是由于 `useEffect` 钩子的依赖项设置不当。
在 `UserSelect` 组件中,`useEffect` 的依赖项是 `packageList`,即只要 `packageList` 发生变化,就会触发 `useEffect` 中的代码。而在父组件中,`packageList` 的值是通过 `getFieldValue('package_name_selectors')` 获取的,这意味着只要表单项 `package_name_selectors` 的值发生变化,就会导致 `packageList` 发生变化,从而触发了 `UserSelect` 组件中的接口调用。
解决这个问题的方法是,将 `useEffect` 的依赖项改为只监视父组件中的表单项 `package_name_selectors` 的值是否发生变化,而不是监视整个 `packageList`。可以使用一个状态变量来保存父组件表单项的值,并在表单项值改变时更新该状态变量。然后将该状态变量作为 `UserSelect` 组件中 `useEffect` 的依赖项,这样就能避免不必要的接口调用。
以下是修改后的代码示例:
```jsx
// 父组件
const [packageNameSelectorsValue, setPackageNameSelectorsValue] = useState(getFieldValue('package_name_selectors'));
useEffect(() => {
setPackageNameSelectorsValue(getFieldValue('package_name_selectors'));
}, [getFieldValue('package_name_selectors')]);
// ...
<UserSelect packageList={packageNameSelectorsValue} />;
```
通过上述修改,只有当父组件中的 `package_name_selectors` 的值发生变化时,才会更新 `packageNameSelectorsValue` 的值,并将其作为 `UserSelect` 组件的 `packageList` 属性传递进去。这样可以避免不必要的接口调用。