react中的输入框以在reactjs中显示建议

时间:2018-08-02 11:00:14

标签: javascript input delay smoothing search-suggestion

如何制作一个输入框,它会在不是每个字符输入快速的情况下,以较小的延迟给出建议。我不想在每个字符输入上都打入建议api。

class Input extends React.Component {
constructor (props){
super(props);
this.state = {
  inputVal:'',
  suggestion : []
}
}

handleChange = ({target:{value}})=>{
  fetch('https://api.github.com/search/users?q='+value, (res)=>{
  this.setState({suggestions:res.items});
  });  
}


  render(){
    <input onChange={this.handleChange} value {this.state.inputVal} />
    <ul id="suggestions">
    this.state.suggestions.map(sugg=>{
      return (
      <li>{sugg.login}</li>
      )
    })
    </ul>
  }
}

ReactDOM.render(<Input />, document.getElementById('container'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<div id='container'></div>

1 个答案:

答案 0 :(得分:4)

您可以使用setTimeout使用延迟的API调用,该setTimeout在每次更改输入值后清除。这是一个小的工作示例:

def new
  @category = Category.find_by(id: params[:category_id])
  @product = Product.new
end
const INPUT_TIMEOUT = 250; //ms - It's our input delay
class TodoApp extends React.Component {
    constructor(props) {
      super(props);
      this.state = {
        value: '',
        predictions: [],
      };

      this.onChange = this.onChange.bind(this);
    }

    getPredictions(value) {
      // let's say that it's an API call
      return [
        'Boston',
        'Los Angeles',
        'San Diego',
        'San Franciso',
        'Sacramento',
        'New York',
        'New Jersie',
        'Chicago',
      ].filter(item => item.toLowerCase().indexOf(value.toLowerCase()) !== -1);
    }

    onChange(e) {
      // clear timeout when input changes value
      clearTimeout(this.timeout);
      const value = e.target.value;
      this.setState({
        value
      });

      if (value.length > 0) {
        // make delayed api call
        this.timeout = setTimeout(() => {
          const predictions = this.getPredictions(value);
          this.setState({
            predictions
          });
        }, INPUT_TIMEOUT);
      } else {
        this.setState({
          predictions: []
        });
      }
    }

    render() {
        return ( 
          <div >
          <input type = "text" value={this.state.value} onChange = {this.onChange}/>
            <div> 
            {
              this.state.predictions.map((item, index) => (
                <div key={index + item}>{item}</div>
              ))
            } 
            </div> 
          </div>
        )
    }
}

ReactDOM.render( <TodoApp />, document.querySelector("#app"))