reactjs - 反应状态未在退格键上更新
问题描述
我正在尝试使用实时搜索功能过滤国家列表,但是每当我按下退格键时,它都不会更新状态数组。
因此,我尝试在CodePen上搜索我的问题的潜在解决方案,并在此示例中使用了相同的确切代码,但在我的情况下它不起作用。
这是存在搜索字段的整个组件。
import React, { useEffect, useState } from 'react'
import CountryList from '../components/CountryList';
import axios from 'axios'
import SearchForm from '../components/SearchForm';
export default () => {
const [countries, setCountries] = useState( [] )
const [search, setSearch] = useState( '' )
useEffect(() => {
axios.get( 'https://restcountries.eu/rest/v2/all' )
.then( response => {
setCountries( response.data )
} )
}, [])
const onSearch = e => {
const searchQuery = e.target.value.toLowerCase()
setSearch( e.target.value )
const filteredCountries = countries.filter( country => {
const searchValue = country.name.toLowerCase()
return searchValue.indexOf( searchQuery ) > -1
} )
setCountries( filteredCountries )
}
return (
<main className="CountriesPage">
<input
type="search"
value={ search }
onChange={ onSearch }
/>
<CountryList data={ countries } />
</main>
)
}
我还在这里提供了一个 gif 。
输入和退格实时搜索字段时,预期结果应该是正确更新的国家/地区数组。
谢谢您的帮助!
解决方案
您在此处过滤您的国家/地区数组:
const filteredCountries = countries.filter( country => {
const searchValue = country.name.toLowerCase()
return searchValue.indexOf( searchQuery ) > -1
} )
setCountries( filteredCountries )
最后,您将您的国家/地区设置为过滤后的国家/地区列表。如果您从 5 个国家/地区开始,您现在可能已将国家/地区的列表过滤到 0 个元素。当您按退格键时,您并没有用原始条目填充国家/地区数组,因此当您再次过滤时,您现在正在过滤一个没有任何内容的列表。
将过滤后的国家/地区存储在州中,不要将国家/地区数组设置为过滤后的国家/地区。然后显示过滤的国家而不是国家。
推荐阅读
- vim - 将关键字参数映射到谷歌文档字符串的宏
- ios - 如何在使用容易崩溃的代码且没有抛出错误时快速防止崩溃
- terraform - Terraform 插值数据源
- laravel - PUT 请求在 Laravel 上被视为 GET 请求
- sql - 机器测试数据库的建议数据库模式是否合适?
- laravel-5 - 在 laravel 的控制器中保存 blob 图像
- php - Summernote 和 img-upload.php 文件中的绝对路径
- javascript - Equivalent of python's range in Javascript
- python - 用公式的结果填充整列 - 熊猫
- javascript - JSON.parse(string) 的匹配器 - 如何在运行匹配器之前调用 lambda?