javascript - 传递带有事件和参数的函数,在 React 中没有无限循环
问题描述
我将 Material UI 库与 React 一起使用,并且我想显示一个 TextField。
const Input = memo(
({ type, name, required, placeholder }) => {
console.log(type)
if (type === 'number') {
// Init input value
if (typeof values[name] !== 'undefined') {
setValues({ ...values, [name]: 0 })
}
let handleNumber = e => {
console.log(e.target.value)
setValues({ ...values, [name]: e.target.value })
}
return (
<TextField
required={required}
type="number"
id={name}
label="Numéro du collier"
name={name}
margin="normal"
variant="outlined"
className="addAnimal-input"
value={values[name]}
// onFocus={setIsSidebarOpen(true)}
onChange={handleNumber}
// onBlur={validate(name)}
// error={errors[name]}
placeholder={placeholder}
/>
)
}
}
现在我希望 onChange 方法可以工作,但它会导致无限循环,我不知道如何修复它。我试图这样调用该方法:
e => handleNumber(e)
这没有帮助。我尝试过的其他事情我无法传递事件或参数。这里的问题是,在我调用setValues()
它之后,它会无限地重新渲染父组件,但我不明白为什么:/
解决方案
const [values, setValues] = useState({})
您的代码段中缺少通知。
setValues
这里的问题是在渲染函数中调用状态设置器。这不是一个好习惯,您刚刚发现了原因,它会导致无限循环;)
这是流程:
假设您首先按“a”键(仅出于我的示例,这适用于任何更改输入值的键)。
handleNumber
被调用时,它会改变values
,通过设置{ [name]: "a" }
.设置新状态会触发重新渲染。
渲染函数中的表达式
typeof values[name] !== 'undefined'
是true
sincetypeof "a" === "string"
,所以会发生另一个重新渲染,这次是{ [name]: 0 }
.表情
typeof values[name] !== 'undefined'
仍然是true
,因为typeof 0 === "number"
。然后我们得到另一个重新渲染,依此类推。
推荐阅读
- python - 无法从列表中捕获值并将“K”转换为“000”
- python - sphinx-apidoc 为在 __init__.py 中重新导出的类生成文档
- c# - “AddPermission”时的C#应用程序域异常,说绝对路径是必需的?
- sql - 在一列中选择可选数量的值
- docker - docker-composer up -d 得到错误 postgres: Bind for 0.0.0.0:5432 failed: port is already assigned
- c# - 查找同级控件的属性
- ios - 使用 Apple Pencil 功能创建笔记编辑器?
- visual-studio-2019 - 如何在 Visual Studio 2019 中使用 .NET 4.6.2 版运行单元测试?
- python - 算法的复杂性(威尔逊测试)
- python - 如何绘制附加到 3 个不同过滤器的权重?