reactjs - React useCallback 和 useEffect 同时搞乱了状态
问题描述
我为我的应用程序创建了一个SignaturePad,稍后会将值传递给 Formik。
问题1:
我在使用react的useEffect
and功能时遇到了一些问题。useCallback
以前在我添加 useEffect 之前,handleClear
函数工作得很好。然而,在我添加 useEffect 之后,sigPad
refs 总是在 handleClear 中返回 null。
我不确定我的心理模型是否正确,谁能解释为什么会这样?
问题2:
然而,我意识到,在我删除[sigPad]
at之后,handleClear
我能够再次收到裁判。我的代码的哪一部分重新呈现以及 useCallback 如何没有意识到 sigPad 正在从 null 更改为正确的 ref?
有问题的代码:
export function Signature() {
let sigPad = useRef(null);
const [sig, setSig] = useState("");
const classes = formStyles();
useEffect(() => {
console.log(sigPad);
setSig(sigPad.toData());
console.log(sigPad);
}, [sig]);
const handleClear = useCallback(() => {
console.log(sigPad);
if (sigPad) sigPad.clear();
}, [sigPad]);
return (
<div className="row">
<Grid spacing={3} container>
<Grid item xs={12}>
<h3 className="text-bold">Signature</h3>
</Grid>
<Grid item xs={12}>
<div className="sigCanvas">
<SignatureCanvas
penColor="black"
canvasProps={{ className: "sigPad" }}
ref={ref => {
sigPad = ref;
}}
/>
</div>
</Grid>
<Grid item xs={3}>
<Button
variant="contained"
component="label"
className={classes.instructions}
onClick={handleClear}
>
Clear
</Button>
</Grid>
<Grid item xs={3}>
<Button
component="label"
variant="contained"
className={classes.instructions}
>
Save
</Button>
</Grid>
</Grid>
</div>
);
}
当前修复:
const handleClear = useCallback(() => {
console.log(sigPad);
if (sigPad) sigPad.clear();
});
注意:在我添加 useEffect 之前,我不必[sigPad]
在我的回调中删除
解决方案
钩子按照它们被调用的顺序执行,这意味着你useEffect
的优先于你的useCallback
函数。此外,这[]
称为依赖数组,用于创建底层结构的新实例。使用useRef
时不需要这样做
ref={ref => { sigPad = ref; }}
你可以做
ref={sigPad}
并尝试移动您的useCallback
上方useEffect
。
推荐阅读
- javascript - 无法通过 javascript 编辑内部 HTML
- apache-beam - 执行 Apache BEAM sql 查询时出错 - 在 GroupByKey 之前使用 Window.into 或 Window.triggering 转换
- c++ - 如何将openCV中裁剪图像的数据数组转换为Qt中的RGB直方图
- javascript - 用变量名声明动态局部变量
- javascript - 将 Node.js 输出传递到 Web 界面
- python-3.x - 每次在字符串中找到特定单词时,Python如何打印字符串?
- ios - 在有限的文本字段长度上剪切粘贴的文本
- java - 请求哪些有效,哪些无效
- entity-framework-core-2.1 - 如何在 EF Core 中多次使用 GroupBy
- python - 为什么我的文本解析不正确?