У меня есть следующий компонент
import {h, Component} from 'preact'
import {getPersons} from '../../lib/datalayer'
import Person from '../person'
import {SearchInput} from '../search'
export default class Persons extends Component {
state = {
allPersons: [],
persons: [],
search: ''
}
async fetchData () {
try {
const allPersons = await getPersons()
this.setState({allPersons: allPersons.slice(), persons: allPersons.slice()})
} catch (error) {
....
}
}
constructor (props) {
super(props)
this.state = {
allPersons: [],
persons: [],
search: ''
}
this.fetchData()
}
onSearchInput = (search) => {
if (search === '') {
this.setState({search: search, persons: this.state.allPersons.slice()})
} else {
const persons = this.state.allPersons.filter(p => p.name.toLowerCase().includes(search.toLowerCase())).slice()
this.setState({search: search, persons: persons)})
}
}
render () {
const {persons} = this.state
return (
<div>
<SearchInput onInputChange={this.onSearchInput} placeHolder={'filter: name'} />
{persons.map(p => <Person person={p} />)}
</div>
)
}
}
На странице отображается список людей, а сверху находится фильтр. Кажется, что фильтр работает нормально, я проверил его, выполнив console.log с результатами просто отлично
Проблема в том, что, если мой список содержит объекты:
[{name: 'thomas'}, {name: 'john'}, {name: 'marcus'}, {name: 'usa'}]
И Я пишу в поиске: «us»
Фильтр работает отлично, и результат:
[{name: 'marcus'}, {name: 'usa'}] \\ (the expected result)
На странице эти объекты отображаются
[{name: 'thomas'}, {name: 'john'}] \\ (wrong, this are the two first elements of the list)
Если я ищу: 'joh'
Результат фильтра будет
[{name: 'john'}] \\ (this is fine)
И страница отображает только
[{name: 'thomas'}] \\ (the first element in the list)
Это выглядит как количество элементов, которые отображаются это нормально, но содержимое потомков списка не перерисовывается.
Что не так с моим кодом?