Sie haben verschiedene Möglichkeiten, dies zu lösen.
1. Debounce Ihre Aktion auf Komponentenebene
Dies ist der einfachste Ansatz. Wenn der Eingang eine Änderung auslöst, ruft er eine entprellte Version setSearch
auf, die den Serveraufruf verzögert.
import * as React from "react"
import {connect} from "react-redux"
import {setSearch} from "./actions"
export default connect(
null,
function mapDispatchToProps(dispatch) {
const setSearch_ = _.debounce(q => dispatch(setSearch(q)), 1000)
return() => ({setSearch: setSearch_})
}
)(
function SearchForm(props) {
const {setSearch} = props
return (
<input type="search" onChange={setSearch} />
)
}
)
2. Debounce redux-saga
Dieser Ansatz erfordert mehr vorformulierten sondern gibt Ihnen viel mehr Kontrolle über der Workflow. Mit einer Saga fangen wir die SET_SEARCH
Aktion ab, debunce es, rufen Sie die API, dann senden Sie eine neue Aktion, die die Ergebnisse enthält.
import {call, cancel, fork, put, take} from "redux-saga/effects"
import {setSearchResults} from "./actions"
import {api} from "./services"
import {delay} from "./utils"
export default function* searchSaga() {
yield [
// Start a watcher to handle search workflow
fork(watchSearch)
]
}
function* watchSearch() {
let task
// Start a worker listening for `SET_SEARCH` actions.
while (true) {
// Read the query from the action
const {q} = yield take("SET_SEARCH")
// If there is any pending search task then cancel it
if (task) {
yield cancel(task)
}
// Create a worker to proceed search
task = yield fork(handleSearch, q)
}
}
function* handleSearch(q) {
// Debounce by 1s. This will lock the process for one second before
// performing its logic. Since the process is blocked, it can be cancelled
// by `watchSearch` if there are any other actions.
yield call(delay, 1000)
// This is basically `api.doSearch(q)`. The call should return a `Promise`
// that will resolve the server response.
const results = yield call(api.doSearch, q)
// Dispatch an action to notify the UI
yield put(setSearchResults(results))
}
Wollen Sie some global für alle Ihre Anwendung (wie für alle API-Aufrufe) oder nur für diese Komponente? – KeitIG
Ich konnte sehen, dass es in anderen Komponenten in diesem Abschnitt der Anwendung verwendet wird. – Dave
siehe http://stackoverflow.com/questions/23123138/perform-debounce-in-react-js/28046731#28046731 –