React提交表单后无法清空输入框
Unable to clear the input field after submitting the form in React
function Search() {
let [state, setState] = useState({
query: "",
results: []
})
let handleSubmit = e => {
e.preventDefault();
if(state.query.length>0) {
fetch(searchURL)
.then(response => response.json())
.then(data => setState(prevValue => {
return {
...prevValue,
results: data.Search
}
}))
setState({query:""})
}
}
return (
<div>
<h1>Search</h1>
<form onSubmit={handleSubmit}>
<input type="text" placeholder="Search..." onChange={handleChange} value={state.query}/>
<button type="submit">Search</button>
</form>
</div>
)
}
提交表单后,如果我正在设置状态,如 setState{query:""} ,API 调用失败。如何实现这一目标。谢谢
我没有经常使用钩子,但我相信如果您将 ...prevValue
替换为 query: ''
。那应该有用吗?
setState(prevValue => {
prevValue.query = "";
prevValue.results= data.Search;
return {...prevValue};
});
}
注意:当您更新任何状态时,您可以修改 prevState 变量,只需记住 return 它作为性能和正确实践的新深度克隆值。
注意:更新状态是一个异步操作。
query
必须在收到如下响应后清除:
{
...prevValue,
results: data.Search,
query: ""
}
您可以做两件事。
在你的第二个,你可以将那里的代码更改为
.then(data => setState(prevValue => {
return {
...prevValue,
results: data.Search
query: ''
}
}))
如果您不想根据 previousState 值计算任何内容,则可以省略 ...prevValue
或者您可以通过调用 e.target.reset()
在成功时重置表单,但是因为您将输入用作受控组件。选择第一个选项
因为fetch
API是异步的(你的then
链不会在fetch
执行后立即执行,它会等到fetch
得到解决)你应该在最后一个 then
承诺链中添加 setState({query:""})
。
所以你的代码应该是这样的:
.then(data => setState(prevValue => {
return {
...prevValue,
query: "",
results: data.Search
}
}))
function Search() {
let [state, setState] = useState({
query: "",
results: []
})
let handleSubmit = e => {
e.preventDefault();
if(state.query.length>0) {
fetch(searchURL)
.then(response => response.json())
.then(data => setState(prevValue => {
return {
...prevValue,
results: data.Search
}
}))
setState({query:""})
}
}
return (
<div>
<h1>Search</h1>
<form onSubmit={handleSubmit}>
<input type="text" placeholder="Search..." onChange={handleChange} value={state.query}/>
<button type="submit">Search</button>
</form>
</div>
)
}
提交表单后,如果我正在设置状态,如 setState{query:""} ,API 调用失败。如何实现这一目标。谢谢
我没有经常使用钩子,但我相信如果您将 ...prevValue
替换为 query: ''
。那应该有用吗?
setState(prevValue => {
prevValue.query = "";
prevValue.results= data.Search;
return {...prevValue};
});
}
注意:当您更新任何状态时,您可以修改 prevState 变量,只需记住 return 它作为性能和正确实践的新深度克隆值。
注意:更新状态是一个异步操作。
query
必须在收到如下响应后清除:
{
...prevValue,
results: data.Search,
query: ""
}
您可以做两件事。 在你的第二个,你可以将那里的代码更改为
.then(data => setState(prevValue => {
return {
...prevValue,
results: data.Search
query: ''
}
}))
如果您不想根据 previousState 值计算任何内容,则可以省略 ...prevValue
或者您可以通过调用 e.target.reset()
在成功时重置表单,但是因为您将输入用作受控组件。选择第一个选项
因为fetch
API是异步的(你的then
链不会在fetch
执行后立即执行,它会等到fetch
得到解决)你应该在最后一个 then
承诺链中添加 setState({query:""})
。
所以你的代码应该是这样的:
.then(data => setState(prevValue => {
return {
...prevValue,
query: "",
results: data.Search
}
}))