Как удалить ключ из моего ввода при сбросе ввода?

У меня есть форма поиска с несколькими входами.

Форма имеет кнопку сброса, чтобы начать новый поиск. В настоящее время у меня это работает, так что значение очищается от состояния. Проблема в том, что значение ключа не удаляется, поэтому ввод включается в новый поиск только с пустым ключом. Это приводит к тому, что поиск включает пустые ключи как часть строки запроса.

Например. Это строка запроса с добавленным пустым ключом:

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>

вы хотите удалить все ключи и значения или с каким-то условием? также можете показать метод handleFormSubmit?

Mayank Shukla 09.04.2019 17:09

Только ключи и значения, которые использовались в предыдущем поиске. И просто сбросить их, чтобы они могли или не могли использоваться в новом поиске

Denis J 09.04.2019 17:11

@MayankShukla добавил метод handleFormSubmit

Denis J 09.04.2019 17:18

я думаю, вы должны поставить галочку в handleSubmit и пропустить все значения ключа, где value='', например так: if (formData[k]) { if (query !== "") /*.....rest code*/}, часть сброса кажется в порядке, вы устанавливаете emptyValues[key] = "", чтобы очистить значение.

Mayank Shukla 09.04.2019 17:19

@MayankShukla нравится это? keys.forEach(k => { if (formData[k]) if (query !== "") query += &;

Denis J 09.04.2019 17:28

да, но используйте {} с if (formData[k]) и поместите все в блок.

Mayank Shukla 09.04.2019 17:29

Хорошо, это помогает. Пустые входные данные исключаются из строки запроса. Из консоли я вижу, что ключ все еще находится в состоянии, но просто игнорируется. Не могли бы вы сделать свой комментарий ответом? Спасибо

Denis J 09.04.2019 17:36
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
7
40
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Поскольку вы хотите игнорировать/пропускать пары ключ-значение в вызове 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:[],
  }) 
}

проверьте другой возможный способ, который также должен работать.

Mayank Shukla 09.04.2019 17:48

Это работает и для очистки значения. Мне все еще нужно включить ваш оператор if, чтобы предотвратить его включение в строку запроса.

Denis J 09.04.2019 18:01

Другие вопросы по теме