Реагировать на запросы автозаполнения Downshift в бесконечном цикле - PullRequest
0 голосов
/ 24 октября 2018

У меня есть следующий компонент React

class Search extends Component {

constructor(props){
    super(props);
    this.state = {
        suggestions: []
    };
    this.getSuggestions = this.getSuggestions.bind(this);
}

renderSuggestion(){
    return (
        this.state.suggestions.map((suggestion, index) =>
            <MenuItem component="div" key={index} value={index} >
                {suggestion}
            </MenuItem>
         )
     );
};

getSuggestions (value) {
    const inputValue = deburr(value.trim()).toLowerCase();
    if(inputValue.length >= 3){
    axios.get('http://localhost:5001/api/v1/products',{
        params: {
            q: inputValue
        }
    }).then(response => {
        this.setState({suggestions : response.data.data });
    });
}
};

render() {
    const { classes } = this.props;
    return (
        <div className={classes.container}>
            <Downshift id="downshift-simple">
                {({
                      getInputProps,
                      getItemProps,
                      getMenuProps,
                      highlightedIndex,
                      inputValue,
                      isOpen,
                  }) => (
                    <div>
                        <TextField placeholder="Search a country (start with a)"
                                   fullWidth={true}
                                   onChange={this.getSuggestions(inputValue)}
                                   {...getInputProps()}
                        />
                        <div {...getMenuProps()}>
                            {isOpen ? (
                                <Paper className={classes.paper} square>
                                    {this.renderSuggestion}
                                </Paper>
                            ) : null}
                        </div>
                    </div>
                )}
            </Downshift>
        </div>
    );
}
}

export default withStyles(styles)(Search);

Автодополнение работает, как и ожидалось, до тех пор, пока я не выполняю запрос axios в getSuggestions ().Кажется, он выполняет запрос в бесконечном цикле, пока я не обновляю страницу.Есть идеи, почему происходит это странное поведение?

1 Ответ

0 голосов
/ 24 октября 2018

Потому что вы вызываете эту функцию вместо передачи функции в onChange.Пожалуйста, измените свою функцию на функцию стрелки.обратитесь по этой ссылке https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions

getSuggestions (e) {
    let value = e.target.value
    const inputValue = deburr(value.trim()).toLowerCase();
    if(inputValue.length >= 3){
      axios.get('http://localhost:5001/api/v1/products',{
          params: {
              q: inputValue
          }
      }).then(response => {
          this.setState({suggestions : response.data.data });
      });
    }
};

<TextField placeholder="Search a country (start with a)"
  fullWidth={true}
  onChange={(e)=> this.getSuggestions(e)}
  {...getInputProps()}
/>
...