我有這樣的文本輸入
<CustomInput
value={searchInput}
onChangeText={(e) => func(e)}
mainStyle={{ width: "81%" }}
placeholder="Search"
/>
現在我有這樣的功能
const func = async (searchText) => {
setSearchInput(searchText);
searchAPI();
};
這是我的 API 呼叫代碼
const searchAPI = async () => {
try {
const data = new FormData();
data.append("string_search", searchInput);
setActivityIndicatorVal(true);
let response = await fetch(
"APILINK",
{
method: "POST",
body: data,
header: {
"Content-Type": "multipart/form-data",
},
}
);
var json = await response.json();
if (json.status == 1) {
setActivityIndicatorVal(false);
setList(json.data);
} else {
setActivityIndicatorVal(false);
console.log("Error");
getServiceList();
}
} catch (e) {
setActivityIndicatorVal(false);
Alert.alert("Error", "Error Massage : " e, [
{
text: "Cancel",
onPress: () => console.log("Cancel Pressed"),
style: "cancel",
},
{ text: "OK", onPress: () => console.log("OK Pressed") },
]);
return;
}
};
現在我的問題是,當我開始在文本框中輸入時,結果正在灼熱并正確顯示。但是我通過按鍵盤按鈕從文本輸入中洗掉所有文本。那么它應該顯示所有結果。但它只顯示我最近通過后按鍵盤按鈕洗掉的那個關鍵字。請幫忙謝謝。
uj5u.com熱心網友回復:
當用戶鍵入時,searchAPI由于如何 React 狀態更新和組件渲染作業,接收到舊的輸入值。
試試這個重構。
const func = async (searchText) => {
setSearchInput(searchText);
//This function execute before component rerender.
// always pass input text value not rely on state value
searchAPI(searchText);
};
然后searchAPI
const searchAPI = async (searchQuery) => {
try {
const data = new FormData();
data.append("string_search", searchQuery);
setActivityIndicatorVal(true);
let response = await fetch(
"APILINK",
{
method: "POST",
body: data,
header: {
"Content-Type": "multipart/form-data",
},
}
);
var json = await response.json();
if (json.status == 1) {
setActivityIndicatorVal(false);
setList(json.data);
} else {
setActivityIndicatorVal(false);
console.log("Error");
getServiceList();
}
} catch (e) {
setActivityIndicatorVal(false);
Alert.alert("Error", "Error Massage : " e, [
{
text: "Cancel",
onPress: () => console.log("Cancel Pressed"),
style: "cancel",
},
{ text: "OK", onPress: () => console.log("OK Pressed") },
]);
return;
}
};
您可以通過去抖搜索查詢并僅在用戶完成輸入搜索查詢時查詢資料庫來改善用戶體驗并節省服務器資源。
// Utilitiy debounce function
function debounce(fn, wait) {
var timeout;
return function () {
var ctx = this,
args = arguments;
clearTimeout(timeout);
timeout = setTimeout(function () {
fn.apply(ctx, args);
}, wait || 500);
};
}
const debouncedSearch = debounce(func, 500);
<CustomInput
onChangeText={debouncedSearch}
mainStyle={{ width: "81%" }}
placeholder="Search"
/>
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/428804.html
標籤:javascript 反应式 搜索
下一篇:如何解決undefinedisnotanobject(evaluate'route.params.data')inreactnative?
