handle change 函数有问题,遗漏一个字符
Having trouble with handle change function ,leaves one character out
所以 handle change 方法有效,但总是忘记我的字符串的最后一个字符(当我键入“test”时它保存“tes”),即使我正在测试以查看是否有错误的值函数,仅在还剩一个字符时才拾取错误。任何建议都会有所帮助。
const [ tools, setTools ] = useState({
name: props.values.name || '',
description: props.values.description || '',
notes: props.values.notes || '',
downloadLink: props.values.downloadLink
});
const handleChange = (e) => {
const { name, value } = e.target;
setTools((prevState) => ({
...prevState,
[name]: value
}));
props.setEditValues(tools);
if (!tools.name || !tools.description || !tools.downloadLink) {
props.setError(true);
}
else {
props.setError(false);
}
};
<TextField
error={props.error}
fullWidth
label='Name'
name='name'
onChange={handleChange}
value={tools.name}
variant='outlined'
/>
使用 onKeyUp 而不是 onChange:
<TextField
error={props.error}
fullWidth
label='Name'
name='name'
onKeyUp={handleChange}
value={tools.name}
variant='outlined'
/>
问题是在您调用 setState
.
后 tools
在 handleChange
函数的范围内不是最新的
调用setState确实更新组件状态中的tools
值,但是handleChange
函数需要重新创建 所以它会有更新后的值。
解决该问题的一种方法是使用 useEffect
挂钩:
const [tools, setTools] = useState({
name: props.values.name || '',
description: props.values.description || '',
notes: props.values.notes || '',
downloadLink: props.values.downloadLink
});
const handleChange = (e) => {
const { name, value } = e.target;
setTools((prevState) => ({
...prevState,
[name]: value
}));
};
useEffect(() => {
props.setEditValues(tools);
if (!tools.name || !tools.description || !tools.downloadLink) {
props.setError(true);
}
else {
props.setError(false);
}
}, [tools, props.setEditValues, props.setError]);
<TextField
error={props.error}
fullWidth
label='Name'
name='name'
onChange={handleChange}
value={tools.name}
variant='outlined'
/>
另一种方法是在 handleChange
函数范围内创建更新后的 tools
值,并将其用于设置组件状态和函数内部。
该函数看起来像这样,您不需要 useEffect
:
const handleChange = (e) => {
const { name, value } = e.target;
const nextTools = { ...tools, [name]: value };
setTools(nextTools);
props.setEditValues(nextTools);
if (!nextTools.name || !nextTools.description || !nextTools.downloadLink) {
props.setError(true);
}
else {
props.setError(false);
}
};
所以 handle change 方法有效,但总是忘记我的字符串的最后一个字符(当我键入“test”时它保存“tes”),即使我正在测试以查看是否有错误的值函数,仅在还剩一个字符时才拾取错误。任何建议都会有所帮助。
const [ tools, setTools ] = useState({
name: props.values.name || '',
description: props.values.description || '',
notes: props.values.notes || '',
downloadLink: props.values.downloadLink
});
const handleChange = (e) => {
const { name, value } = e.target;
setTools((prevState) => ({
...prevState,
[name]: value
}));
props.setEditValues(tools);
if (!tools.name || !tools.description || !tools.downloadLink) {
props.setError(true);
}
else {
props.setError(false);
}
};
<TextField
error={props.error}
fullWidth
label='Name'
name='name'
onChange={handleChange}
value={tools.name}
variant='outlined'
/>
使用 onKeyUp 而不是 onChange:
<TextField
error={props.error}
fullWidth
label='Name'
name='name'
onKeyUp={handleChange}
value={tools.name}
variant='outlined'
/>
问题是在您调用 setState
.
tools
在 handleChange
函数的范围内不是最新的
调用setState确实更新组件状态中的tools
值,但是handleChange
函数需要重新创建 所以它会有更新后的值。
解决该问题的一种方法是使用 useEffect
挂钩:
const [tools, setTools] = useState({
name: props.values.name || '',
description: props.values.description || '',
notes: props.values.notes || '',
downloadLink: props.values.downloadLink
});
const handleChange = (e) => {
const { name, value } = e.target;
setTools((prevState) => ({
...prevState,
[name]: value
}));
};
useEffect(() => {
props.setEditValues(tools);
if (!tools.name || !tools.description || !tools.downloadLink) {
props.setError(true);
}
else {
props.setError(false);
}
}, [tools, props.setEditValues, props.setError]);
<TextField
error={props.error}
fullWidth
label='Name'
name='name'
onChange={handleChange}
value={tools.name}
variant='outlined'
/>
另一种方法是在 handleChange
函数范围内创建更新后的 tools
值,并将其用于设置组件状态和函数内部。
该函数看起来像这样,您不需要 useEffect
:
const handleChange = (e) => {
const { name, value } = e.target;
const nextTools = { ...tools, [name]: value };
setTools(nextTools);
props.setEditValues(nextTools);
if (!nextTools.name || !nextTools.description || !nextTools.downloadLink) {
props.setError(true);
}
else {
props.setError(false);
}
};