javascript - 我收到类似 index.js:1 的错误警告:超出最大更新深度
问题描述
我有一个自定义钩子,它返回一个注册方法来设置对组件中输入字段的引用。
import React, { useState, useRef, useEffect } from 'react';
import { Form } from './Form';
const useFormsio = ( STATE ) => {
const [ refs, setRefs ] = useState({});
const register = (fieldArgs) => {
const inputRef = useRef();
const key = Object.keys(fieldArgs);
//console.log(fieldArgs);
useEffect(() => {
setRefs(prevState => {
return{
...prevState,
[key]: inputRef
}
})
}, [ fieldArgs ])
return inputRef;
}
return [ Form, register ];
}
export { useFormsio };
组件如下,它包含输入字段,使用注册方法我传递字段名称来设置引用。
const App = () => {
const INITIAL_STATE = {
userName: '',
userEmail: ''
};
const [ Form, register ] = useFormsio(INITIAL_STATE);
return(
<Form>
<input
type = 'text'
placeholder = 'Enter your name'
name = 'userName'
data-validations = { register({ name:'userName' })} />
<input
type = 'email'
placeholder = 'Enter your email'
name = 'userEmail'
data-validations = { register({ name:'userEmail' })} />
<button
type = 'submit'>
Submit
</button>
</Form>
)
}
为什么我会收到这样的错误?
解决方案
在我看来,您好像在无限循环的重新渲染中运行。你应该把你register()
的生命周期方法放在里面。这些线上的东西-
useEffect(()=>{
register(fieldArgs);
},[fieldArgs])
const register = (fieldArgs) => {
const inputRef = useRef();
const key = Object.keys(fieldArgs);
//console.log(fieldArgs);
setRefs(prevState => {
return{
...prevState,
[key]: inputRef
}
})
return inputRef;
}
推荐阅读
- javascript - 每次访问页面时 React 重新渲染
- python - 如何实现超时功能?
- json - 来自本地 JSON 文件的 SwiftUI 搜索字段
- react-native - React native Invariant Violation:requireNativeComponent:在UIManager中找不到“RNCViewPager”
- vue.js - 看不到子组件参考
- c# - 使用 System.Text.Json 将 JSON 反序列化为包含动态属性的类
- postgresql - SQLException 未传播到主线程 - Clojure
- mysql - 如何从多个 MySQL 表中提取数据
- reactjs - highchart 向下钻取饼图的重置按钮
- yii2 - yii2-formwizard select2选择后更改模型