Реагируйте: форма поиска с несколькими входами отправляет отдельный поиск каждый раз, когда используется дополнительный ввод - PullRequest
0 голосов
/ 08 апреля 2019

Моя форма поиска создается динмически с использованием вызова ajax для входных данных. Затем каждый вход можно использовать отдельно или в сочетании с другими входами, чтобы сузить результаты поиска. У меня проблема в том, что метод submit запускает новый поиск каждый раз, когда в форму добавляется дополнительный ввод. Например: пользователь просто ищет с одним входом. Метод Submit выполняется один раз. Пользователь ищет с двумя входами. Поиск выполняется один раз для одного входа, а затем второй раз для двух входов. И так далее ...

Вот мой родительский файл ..

  class SearchPage extends React.Component {
    constructor(props, context) {
      super(props, context);


      this.state = {
        labels: [],
        contracts: [],
        formValues:[],
        pdfs:[],
        titles:[],
        alertShow: false,
        show: false,

      };
      this.onClick = this.handleContract.bind(this);
      this.handleShow = this.handleShow.bind(this);
      this.handleClose = this.handleClose.bind(this);
      this.handleShowAlert = this.handleShowAlert.bind(this);
      this.handleCloseAlert = this.handleCloseAlert.bind(this)
    }

    initialState = { 
      formValues: {},
    }

    state = this.initialState

    componentDidMount(){
      this.loadLabels();
    }

    componentWillUnmount(){
    }
    toggleHidden () {
      this.setState({
        isHidden: !this.state.isHidden
      })
    }

    handleFormReset = () => {
      this.setState(() => this.initialState)
      this.setState({contracts:[]})
    }

    handleClose() {
      this.setState({ show: false });
    }

    handleShow() {
      this.setState({ show: true });
    }
    handleCloseAlert() {
      this.setState({ alertShow: false });
    }

    handleShowAlert() {
      this.setState({ alertShow: true });
    }
    loadLabels = () => {
      API.getLabels()
        .then(res => {
          const labels = res.data;
            this.setState({ labels })
        })
        .catch(err => console.log(err));
    };

    handleInputChange = (key, value) => {
       const newFormValues = Object.assign({}, this.state.formValues, {[key]: value});
       this.setState({ formValues: newFormValues })
    };

    handleContract = (id) => {
      API.openRow(id)
      .then(res => {
        const pdfs = res.data;
        this.setState({pdfs});
        this.props.history.push({
          state: { labels:this.state.labels,
            pdfs:this.state.pdfs,
            titles:this.state.titles }
        })
      })
      .catch(err => console.log(err));
      API.titles(id)
      .then(res => {
        const titles = res.data;
        this.setState({titles});
      })
      this.setState({ show: true });
    }

    handleFormSubmit = event => {  
    event.preventDefault();
    const formData = this.state.formValues
    let query = '';
    let keys = Object.keys(formData);
    keys.map(k => { 
      if (query !== "")
      query += `&`;
      query += `filter=`
      query += `${k}|${formData[k]}`

      return this.loadContracts(query);
     })
    };
    noResults() {
      this.setState({alertShow:true})
    }
    loadContracts = (query) => {
    API.search(query)
    .then(res => {
      const contracts = res.data;
      if (contracts.length > 0 ){
         this.setState({ contracts });
      }
      else {
       this.noResults();
        this.setState({contracts:[]});
      };
    })
    .catch(err => console.log(err));
    };

render() {

return ( 
<div className="container" style={{ marginTop: "80px" }}>
  <div className="jumbotron">
    <div className="container">
      <h1>Contract Document Search</h1>
    </div>
<br/>
  <Container>


  <SearchForm 
    labels={this.state.labels}
    handleFormSubmit={this.handleFormSubmit}
    handleInputChange={this.handleInputChange}
    handleReset={this.handleReset}
    handleFormReset={this.handleFormReset}
    />

    <div className='modal'>
          <Modal show={this.state.alertShow} 
          onHide={this.handleCloseAlert}
          {...this.props}
          size="sm"
          aria-labelledby="contained-modal-title-vcenter"
          centered>
          <Modal.Header closeButton>
            <Modal.Body>No results found</Modal.Body>
          </Modal.Header>
        </Modal>
      </div>
</Container>
</div>

<div className="container">
 <div className="jumbotron-fluid">
 </div>
  <SearchResults 
    labels={this.state.labels}
    contracts={this.state.contracts} 
    pdfs={this.state.pdfs}
    handleContract={this.onClick}
    handleTitles={this.onClick}
    />
    <br/>
    <br/>

</div>
    );
  }
}
export default SearchPage;

И мой компонент поиска формы ..

  export default class SearchForm extends Component {

    constructor(...args) {
      super(...args);

      this.state = { 
      };
    }

    render() {
      return ( 
<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 >
              <Input  
                key={label.Id}
                onChange={(event) => {
                  this.props.handleInputChange(label.DataField, event.target.value)}}
                value={this.props.newFormValues}
                maxLength="999"
                style={{height:34}}
                name="value"
                type="search" 
                className={"form-control mb-2 mr-sm-2"} 
                id={label.DataField}
              />
            </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.handleFormReset}
      >
        Reset
      </Button>


  </div>

  </form>
    );
  }
}

1 Ответ

0 голосов
/ 09 апреля 2019

Проблема заключалась в том, что у меня был оператор return внутри отображения ввода.

handleFormSubmit = event => {  
    event.preventDefault();
    const formData = this.state.formValues
    let query = '';
    let keys = Object.keys(formData);
    keys.map(k => { 
      if (query !== "")
      query += `&`;
      query += `filter=`
      query += `${k}|${formData[k]}`

      **return this.loadContracts(query);**
     })
    };

Решено путем перемещения оператора возврата за пределы отображения.

handleFormSubmit = event => {  
    event.preventDefault();
    const formData = this.state.formValues
    let query = '';
    let keys = Object.keys(formData);
    keys.map(k => { 
      if (query !== "")
      query += `&`;
      query += `filter=`
      query += `${k}|${formData[k]}`

     })
      **return this.loadContracts(query);**
    };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...