Ich möchte Anfragen nicht auslösen, solange der Benutzer schreibt. Mein Code sollte Anforderungen drosseln, so dass der Benutzer bei einer schnellen Eingabe eine Anfrage mit dem letzten Eingabewert anstatt mit vielen auslösen wird.Verwenden von Lodash Debounce in React, um das Anfordern von Daten zu verhindern, solange der Benutzer schreibt
Denn jetzt, wenn ich die Eingabe von "test" es feuert 4 verschiedene Anfragen:
- "t"
- "te"
- "tes"
- "test"
So fand ich lodash _.debounce und _.throttle ([https://lodash.com/docs/4.17.4#debounce]) aber verstehe nicht wirklich, wie ich es zu meinem Code implementieren kann. Kann mir jemand helfen?
Mein Code:
import React, { Component } from 'react';
import { connect } from 'react-redux';
import { bindActionCreators } from 'redux';
import './style.css';
import { search } from '../../actions/';
class SearchBar extends Component {
constructor(props) {
super(props);
this.state = { searchTerm: '' };
}
startSearch(query) {
const storedTerms = this.props.searchedTerm;
let foundDuplicate = false;
if (storedTerms.length === 0 && query) {
return this.props.search(query);
}
if (storedTerms.length !== 0 && query) {
const testDuplicate = storedTerms.map(term => term === query);
foundDuplicate = testDuplicate.some(element => element);
}
if (storedTerms.length !== 0 && !query) {
return false;
}
if (foundDuplicate) {
return false;
}
return this.props.search(query);
}
handleInputChange(term) {
this.setState({ searchTerm: term });
this.startSearch(term);
}
render() {
return (
<div className="Search-bar">
<input
value={this.state.searchTerm}
onChange={event => this.handleInputChange(event.target.value)}
/>
</div>
);
}
function mapStateToProps(state) {
return {
searchedTerm: state.searchedTerm,
savedData: state.savedData,
};
}
function mapDispatchToProps(dispatch) {
return bindActionCreators({ search }, dispatch);
}
export default connect(mapStateToProps, mapDispatchToProps)(SearchBar);
EDIT:
Thx zu Sagiv bg, ich hinzufüge, eine Erklärung:
ok, so sollte der Benutzer mehr als 2 Buchstaben eingeben & & auch meine App sollte mindestens 2 Sekunden warten, bevor Ajax Anfrage
startenEDIT2: Danke an Sagiv B.g, für großartige Lösung!
Ich habe meinen Code wie so geändert:
import React, { Component } from 'react';
import { connect } from 'react-redux';
import { bindActionCreators } from 'redux';
import _ from 'lodash';
import './style.css';
import { search } from '../../actions/';
class SearchBar extends Component {
constructor(props) {
super(props);
this.state = { inputValue: '' };
this.startSearch = _.debounce(this.startSearch, 2000);
}
startSearch(query) {
const storedTerms = this.props.searchedTerm;
let foundDuplicate = false;
if (storedTerms.length === 0 && query) {
return this.props.search(query);
}
if (storedTerms.length !== 0 && query) {
const testDuplicate = storedTerms.map(term => term === query);
foundDuplicate = testDuplicate.some(element => element);
}
if (storedTerms.length !== 0 && !query) {
return false;
}
if (foundDuplicate) {
return false;
}
return this.props.search(query);
}
onChange = ({ target: { value } }) => {
this.setState({ inputValue: value });
if (value.length > 2) {
this.startSearch(value);
}
};
render() {
return (
<div className="Search-bar">
<input
placeholder="Type something to search GitHub"
value={this.state.inputValue}
onChange={this.onChange}
/>
</div>
);
}
}
function mapStateToProps(state) {
return {
searchedTerm: state.searchedTerm,
savedData: state.savedData,
};
}
function mapDispatchToProps(dispatch) {
return bindActionCreators({ search }, dispatch);
}
export default connect(mapStateToProps, mapDispatchToProps)(SearchBar);
Last Bug zu behandeln
Aber es hat einen letzten Fehler, dass ich nicht weiß, wie man abschieben. Wenn der Benutzer die Suchabfrage ändern und die Rücktaste zum Löschen des Suchfelds verwenden möchte, löst meine App immer unerwartet eine andere API-Anfrage aus. Hier ist ein Beispiel:
Irgendwelche Ideen, wie ich dieses Verhalten loswerden kann?
wenn Sie sagen, "_so lange der Benutzer tippt ..._ ", können Sie erklären, wie genau Sie bestimmen möchten, wenn ein Benutzer einen anderen Buchstaben eingeben möchte? Manche Benutzer geben 1 Buchstabe pro 0,5 Sekunden ein und andere geben langsamer ein. Sie können nicht wirklich sicher sein, wann ein Benutzer fertig ist Sie können die Ajax-Anfrage auf eine Zeiteinheit (1,5 Sekunden?) und/oder Mindestlänge string und hoffen auf das Beste –
ok, so sollte der Benutzer mehr als 2 Buchstaben eingeben & & auch meine App sollte 2 Sekunden warten vor dem Start von Ajax Anfrage – MountainConqueror