reactjs - 包装 React Hook 返回值会导致渲染循环
问题描述
我正在使用https://react-hook-form.com/api/在一个 React 功能组件中的某些表单控件上保存值并执行验证。我需要在用户在表单控件中输入的值更改后立即上传它们,因此我设计了一个简单的组件来覆盖setValue
and ,registerFields
如下所示:
export function wrapFormWithListeners(formsObject, options = {}) {
/** @type {Object.<string, Observable>} */
let changes = {};
/** @type {Object.<string, Subject>} */
let changeEmitters = {};
let registrationsSubject = new ReplaySubject();
return {
...formsObject,
register: createRegisterProxy(
formsObject.register,
changes,
changeEmitters,
registrationsSubject,
options
),
setValue: createSetValueProxy(formsObject.setValue, changeEmitters),
changes,
registrations: registrationsSubject
};
}
我在我的功能组件上无条件地调用该包装函数,如下所示:
function MyComponent({ prop }) {
const form = useForm();
const modifiedForm = wrapFormWithListeners(form);
const {
register,
errors,
getValues,
setValue,
triggerValidation,
clearError,
reset
} = modifiedForm;
}
我的问题是,每当我解构modifiedForm
对象时,React 就会开始一遍又一遍地循环渲染。我知道这不是我的组件的问题,因为它不使用任何 React API 调用,并且在wrapFormWithListeners
不访问返回对象中的任何成员的情况下调用该函数会使渲染工作正常;换句话说,这使得组件工作,虽然我失去了上传功能:
function MyComponent({ prop }) {
const form = useForm();
const modifiedForm = wrapFormWithListeners(form);
const {
register,
errors,
getValues,
setValue,
triggerValidation,
clearError,
reset
} = form;
}
关于 React 如何将我的功能理解为用户钩子之类的东西,我有什么遗漏吗?
我在用"react": "^16.12.0"
解决方案
推荐阅读
- react-apollo - Apollo 客户端:如何使用查询字符串查询休息端点?
- javascript - 如何在循环中添加“或”操作?
- node.js - 出现错误:无法读取节点 js 中未定义的属性“findOne”
- swift - Xcode 无法返回导航堆栈中的 TableViewController
- css - 以scss中元素的所有直接子元素为目标?
- javascript - 类型 '(s: string) => string' 不可分配给类型 '
(t: T) => T' - django - 无尽的 Django websocket
- string - Jython 或 python 2.7 比传统字符串连接更好的字符串连接方法
- java - Windows 和 Linux 中不同的日期时间格式
- reactjs - ReactJS:通过 3 个组件传递数据