У меня есть форма поиска с несколькими входами.
Форма имеет кнопку сброса, чтобы начать новый поиск. В настоящее время у меня это работает, так что значение очищается от состояния. Проблема в том, что значение ключа не удаляется, поэтому ввод включается в новый поиск только с пустым ключом. Это приводит к тому, что поиск включает пустые ключи как часть строки запроса.
Например. Это строка запроса с добавленным пустым ключом:
http://api/ixmasterdocument?filter=IDXT002|&filter=IDXT001|1111
Как видите, filter=IDXT002|
пуст и включается в строку запроса с правильной парой ключ-значение filter=IDXT001|1111
Вот мой метод сброса, который очищает значение ключа из состояния.
clear = () => {
let emptyValues = JSON.parse(JSON.stringify(this.state.formValues))
Object.keys(emptyValues).forEach(key => emptyValues[key] = "")
this.setState({
formValues: emptyValues,
contracts:[],
})
}
Вот мой метод inputchange..
handleInputChange = (e) => {
console.info("==handleInputChange= = ")
let newValues = JSON.parse(JSON.stringify(this.state.formValues))
newValues[e.target.name] = e.target.value
this.setState({
formValues: newValues
})
console.info("newFormValues is: " + JSON.stringify(newValues))
}
Вот метод отправки.
handleFormSubmit = event => {
event.preventDefault();
const formData = this.state.formValues
let query = '';
let keys = Object.keys(formData);
keys.forEach(k => {
if (query !== "")
query += `&`;
query += `filter=`
query += `${k}|${formData[k]}`
})
return this.loadContracts(query);
};
Вот компонент ввода с кнопкой сброса.
<form className = "form-inline col-md-12" onReset = {this.props.handleFormReset}>
{this.props.labels.map(label => (
<div className = "card border-0 mx-auto" style = {styles} key = {label.Id}>
<ul className = "list-inline ">
<span>
<li>
<Labels htmlFor = {label.DisplayName} >{label.DisplayName}:</Labels>
</li>
<li >
<div>
<Input
key = {label.Id}
onChange = {this.props.handleInputChange}
value = {this.props.formValues[label.DataField] ||""}
type = "search"
maxLength = "999"
style = {{height:34}}
name = {label.DataField ||""}
className = {"form-control mb-2 mr-sm-2"}
id = {label.DataField}
/>
State: {this.props.formValues[label.DataField]}
</div>
</li>
</span>
</ul>
</div>
))}
<div className = " col-sm-12">
<Button
style = {{ float: "left", marginBottom: 10 }}
className = "btn btn-success"
type = "submit"
onClick = {this.props.handleFormSubmit}
>
Search
</Button>
<Help />
<Button
style = {{ float: "left", marginBottom: 10 }}
className = "btn btn-secondary"
// type = "reset"
onClick = {this.props.clear}
>
Reset
</Button>
</div>
</form>
Только ключи и значения, которые использовались в предыдущем поиске. И просто сбросить их, чтобы они могли или не могли использоваться в новом поиске
@MayankShukla добавил метод handleFormSubmit
я думаю, вы должны поставить галочку в handleSubmit и пропустить все значения ключа, где value=''
, например так: if (formData[k]) { if (query !== "") /*.....rest code*/}
, часть сброса кажется в порядке, вы устанавливаете emptyValues[key] = ""
, чтобы очистить значение.
@MayankShukla нравится это? keys.forEach(k => { if (formData[k]) if (query !== "") query +=
&;
да, но используйте {}
с if (formData[k])
и поместите все в блок.
Хорошо, это помогает. Пустые входные данные исключаются из строки запроса. Из консоли я вижу, что ключ все еще находится в состоянии, но просто игнорируется. Не могли бы вы сделать свой комментарий ответом? Спасибо
Поскольку вы хотите игнорировать/пропускать пары ключ-значение в вызове API, где value=''
, поставьте галочку в функции handleSubmit
и включите только непустые значения.
Так:
handleFormSubmit = event => {
event.preventDefault();
const formData = this.state.formValues
let query = '';
let keys = Object.keys(formData);
keys.forEach(k => {
// here
if (formData[k]) {
if (query !== "")
query += `&`;
query += `filter=`
query += `${k}|${formData[k]}`
}
})
return this.loadContracts(query);
};
Или другим возможным способом может быть установка formValues
как {}
в методе clear
. Вы только очищаете значения, а не ключи от этого объекта, если вы сбросите переменную, тогда будет доступно только новое значение ключа.
Так:
clear = () => {
this.setState({
formValues: {},
contracts:[],
})
}
проверьте другой возможный способ, который также должен работать.
Это работает и для очистки значения. Мне все еще нужно включить ваш оператор if, чтобы предотвратить его включение в строку запроса.
вы хотите удалить все ключи и значения или с каким-то условием? также можете показать метод
handleFormSubmit
?