gpt4 book ai didi

javascript - 为什么我的 useState 钩子(Hook)没有保存我的变量的值?

转载 作者:行者123 更新时间:2023-11-30 13:55:40 25 4
gpt4 key购买 nike

我有一个带有模态的简单表单,旨在使用输入到文本框中的值更新我的 redux 存储。

我正在尝试使用 useState Hook 来设置更改时文本框的值。当打印到控制台时,我可以看到我的变量 - “note” 的值是正确的值。但是,当尝试提交“note”并将其传递到我的 updateCheckpoint 函数时,该值未定义。

此外,在打开对话框并第二次提交时,注释具有正确的值。

function CompetencyCheckpoint(props)
{
const dispatch = useDispatch();
let [note, setNote] = useState();

function updateCheckpoint(note){
if(note != null){
console.log("Here is our note : " + note);
}else{
console.log("oh no, we didn't get the note");
}
}
console.log(note);
return (
<div className="checkpoint-container">
<i className="material-icons" onClick={()=>
dispatch(openDialog({
children: (
<React.Fragment>
<DialogTitle id="form-dialog-title">Add Note</DialogTitle>
<DialogContent>
<DialogContentText>
Enter a note.
</DialogContentText>
<TextField
id="filled-textarea"
label="New Note"
placeholder="Enter note here"
multiline
value={note}
onChange={(e) => setNote(e.target.value)}
margin="normal"
variant="filled"
fullWidth
/>
</DialogContent>
<DialogActions>
<Button onClick={()=> dispatch(closeDialog())} color="primary">
Cancel
</Button>
<Button onClick={() => updateCheckpoint(note)} color="primary">
Add
</Button>
</DialogActions>
</React.Fragment>
)
}))}>
note_add
</i>
</div>);
}

export default (CompetencyCheckpoint);

最佳答案

问题是您的对话框内容的 JSX 是在打开对话框时捕获的,并且不会在由于更改 note 状态而发生重新呈现时更新。这就是为什么 @AhmadNoor 的解决方案会导致更多问题——它将您的 TextField 从不受控制更改为受控,但它从未收到更新的 note 值。

您的 openDialog 函数应该只控制 Dialog 上的 open 属性。 CompetencyCheckpoint 应该更改为直接包含整个 Dialog 的 JSX,而不是作为 openDialog 调度的参数,以便它包含在由于更改而重新呈现的注意状态。

这是它的一种工作方式(我在示例中假设这些是 Material-UI 组件):

import React from "react";
import {
Dialog,
DialogTitle,
DialogContent,
DialogContentText,
DialogActions,
Button,
TextField
} from "@material-ui/core";

function CompetencyCheckpoint(props) {
const [open, setOpen] = React.useState(false);
const [note, setNote] = React.useState("");

function updateCheckpoint(note) {
if (note != null) {
console.log("Here is our note : " + note);
} else {
console.log("oh no, we didn't get the note");
}
}
console.log(note);
return (
<div className="checkpoint-container">
<i className="material-icons" onClick={() => setOpen(true)}>
note_add
</i>
<Dialog open={open} onClose={() => setOpen(false)}>
<DialogTitle id="form-dialog-title">Add Note</DialogTitle>
<DialogContent>
<DialogContentText>Enter a note.</DialogContentText>
<TextField
id="filled-textarea"
label="New Note"
placeholder="Enter note here"
multiline
value={note}
onChange={e => setNote(e.target.value)}
margin="normal"
variant="filled"
fullWidth
/>
</DialogContent>
<DialogActions>
<Button onClick={() => setOpen(false)} color="primary">
Cancel
</Button>
<Button onClick={() => updateCheckpoint(note)} color="primary">
Add
</Button>
</DialogActions>
</Dialog>
</div>
);
}

export default CompetencyCheckpoint;

Edit Dialog

关于javascript - 为什么我的 useState 钩子(Hook)没有保存我的变量的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57362349/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com