[英]React JS updating setState in a for loop
我希望能够将数组值添加到 React JS 中的setState
。 基本上我正在为城市做一个搜索栏。 每次用户键入时,它都会更新setState
以包含更过滤的搜索。 基本上,如果用户想要搜索“加利福尼亚州洛杉矶”,他们会首先输入“L”。 因此,程序会搜索所有以“L”开头的城市并将它们添加到setState
中。 然后用户继续“Lo”,然后程序搜索所有以“Lo”开头的城市,并仅使用以“Lo”开头的城市更新setState
,依此类推。
出于某种原因,它总是重复同一个城市 100 次。 因此,如果该人键入“L”,它会将第一个城市添加到setState
100 次,而不是前 100 个不同的城市。 下面是我的代码。 我在 for 循环中使用它。
cities
已经是每个城市的 state 和美国的 state。 thisCity
和thisState
已经被声明。
for (var i = 0; i < cities.length; i++){
if(cities[i].city.toUpperCase().startsWith(e.target.value.toUpperCase())){
thisCity = cities[i].city;
thisState = cities[i].state;
setSuggest((suggest) => [...suggest, {id: Math.random() * 1000,
city: thisCity,
state: thisState}])
}
}
这里有几个问题。
首先,将var i = 0
替换为let i = 0
。 var
作用域是全局的,而let
作用域是块。
其次,您没有声明变量thisCity
和thisState
,因此它们也是全局设置的。 使用const
声明它们,因为它们不会改变。
每当调用 setSuggest 中的回调 function 时,它会获取设置为 thisCity 和 thisState 的最后一个值,而不是该块范围内的值。 这是因为回调 function 稍后执行。 如果您将一个console.log 放在setSuggest 中,另一个放在for 循环的末尾,您会看到for 循环的日志出现在setSuggest 的日志之前。
最后,你应该先弄清楚城市列表,然后设置你的 state。 这将显着提高性能。 总的来说,我建议更换你的 for 循环,以支持使用数组方法.filter
:
const compareTo = e.target.value.toUpperCase();
const suggestions = cities.filter(city => (
city.toUpperCase().startsWith(compareTo)
));
setSuggest(suggestions);
我发现这篇文章可以帮助您更好地理解变量 scope: https://dmitripavlutin.com/javascript-scope-gotchas/
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.