javascript - 当值未定义时,保持输入状态会中断应用程序
问题描述
我试图让一个表单工作,它既可以作为项目的创建表单,也可以作为更新表单。我跟踪一个edit
状态来决定应该在表单中呈现什么文本以及在提交它时要进行什么 API 调用。到目前为止一切顺利,一切正常。为了跟踪输入值,我使用了一个钩子useInputState
来更新相应的状态值:
使用InputState.js
export default (initialVal) => {
const [value, setValue] = useState(initialVal);
const handleChange = (e) => {
if (e.target) {
setValue(e.target.value);
} else { // to be able to set state manually
setValue(e);
}
};
const reset = () => {
setValue("");
};
return [value, handleChange, reset];
};
const [newTitle, setNewTitle, resetNewTitle] = useInputState();
表单.js
export default function Form({
newTitle,
setNewTitle,
edit, // true or false
}) {
return (
<div>
<h2>{edit ? "Edit Item" : "Add new item"}</h2>
<div>
<label>Title</label>
<input
type="text"
placeholder="What is your title?"
value={newTitle}
onChange={setNewTitle}
/>
</div>
)
}
现在当用户添加一个新项目时,显然表单一开始是空的。但是,当用户想要编辑一个项目时,我会尝试使用给定对象的信息预填充表单。这是我遇到问题的地方:对象模型有一些可选字段。当用户在创建对象时将这些留空时,编辑它会中断应用程序并出现can't read property target of null
.
当打开编辑时,我使用以下代码预填充表单字段:
useEffect(() => {
if (edit && selectedItem) {
setNewTitle(selectedItem.title);
}
}, [edit]);
我明白它为什么会遇到问题,我尝试了很多事情,比如将 setNewTitle 参数更改为setNewTitle(selectedItem["title"] !== undefined ? selectedItem.title : "");
和类似的方法,但到目前为止没有任何效果。
我能做些什么来解决这个问题?
解决方案
如果您等于;似乎您只是在比较selectedItem.title !== undefined
可能导致指定错误的情况;有多种方法可以解决此问题,但您可以执行以下操作:selectedItem.title
null
const handleChange = (e) => {
if (!!e && e.target) {
setValue(e.target.value);
} else { // to be able to set state manually
setValue(e);
}
};
更改如下:if (!!e && e.target)
推荐阅读
- python - 如果只有 int 1 是 [1, 2.3, 'blabla'] 中的列表项,为什么 Python ''in operator'' 会为 float 1.0 返回 'True'?
- jquery - 动态旋转文本和 URL
- c++ - 现代 OpenGL ID 的工作原理是什么?
- php - 在php中查找两个日期之间的假期
- svn - 如何在 SVN 中隐藏用户的路径
- autohotkey - 使用鼠标位置激活键盘键的代码
- ios - Flutter 应用程序作为从 IOS 上的浏览器接收 pdf 的选项
- python - 如何用变量更新sql表
- amazon-s3 - Cloudwatch 突然上传到 s3 的警报
- ansible - 从 git repo (Ansible for Nsxt) 安装和使用 Ansible 模块