【发布时间】:2019-06-28 19:38:42
【问题描述】:
发生了一些非常奇怪的事情。我有一个状态值,定义如下:
const [heightField, setHeightField] = useState<FormField<string>>(new FormField<string>(""));
我还定义了一个useEffect hook,它与这个状态值相关联,它的定义如下:
useEffect(() => console.log('heightfield changed, hi from the useEffect hook!'), [heightField]);
此 heightField 值在文本字段中引用如下:
<TextField
required
label="Height (cms)"
margin="normal"
variant="outlined"
type="number"
value={heightField.value}
onChange={(event) => {
setHeightField(new FormField<string>(event.target.value))
}}
error={heightField.error}
helperText={heightField.errorMessage}
/>
现在,当我在文本字段中输入文本时,heightField 值会相应更新,并且 useEffect 挂钩也会被触发。
但是,当从另一个函数更新 heightField 值时,它的值不会更新,也不会触发 useEffect 挂钩。坦率地说,我不明白为什么会发生这种行为。函数如下:
const validateHeight = (heightField: FormField<string>) => {
const heightNumber = parseInt(heightField.value);
let error = false;
let errorMessage = "";
if (!heightNumber) {
error = true;
errorMessage = "Wrong number, please verify.";
}
else if (heightNumber < 0 || heightNumber > 220) {
error = true;
errorMessage = "Please verify the height";
}
const nHeightField = new FormField<string>(heightField.value, error, errorMessage);
setHeightField(nHeightField);
}
该函数在点击表单的提交按钮时被调用,调用时不会触发useEffect hook,也不会相应地更新heightField值
我有什么遗漏吗?为什么在使用新对象调用更新函数时这个值没有被更新?
【问题讨论】:
-
我的猜测是
heightField的值在渲染之间实际上是相同的,即使在验证高度之后也是如此。const nHeightField = new FormField<string>(heightField.value, error, errorMessage);在我看来很可疑。这是您编写的自定义类吗?紧接在这行之后的nHeightField的值是多少? -
是的,FormField 是我创建的自定义类。执行 validateHeightField 函数后对象不同,我输入了不正确的值,因此错误属性为 true,并且出现错误消息。更新前的heightField: Object { value: "3434343434", error: false, errorMessage: "" } and nHeightField is: Object { value: "3434343434", error: true, errorMessage: "请验证高度" }
标签: reactjs react-hooks