Проблема здесь вызвана изменениями, вносимыми в состояние вашего компонента во время рендеринга.
Следует избегать установки состояния компонента непосредственно во время функции render()
компонентов (это происходит при вызове filter()
во времяrender()
функция вашего компонента).
Вместо этого рассмотрите возможность обновления state
вашего компонента только по мере необходимости (то есть, когда изменяется inputValue
опора).Рекомендуемый способ обновления state
при изменении значений prop
- через ловушку жизненного цикла компонента getDerivedStateFromProps()
.
Вот пример того, как вы можете использовать этот хук для вашего компонента:
class UsersList extends React.Component {
constructor(props) {
super(props);
this.state = {
allUsers: ["Michał", "Ania", "Kasia", "Tomek",
"Hubert", "Jan", "Martyna", "Rafał",
"Bartłomiej"],
filteredUsers: [],
input: null
}
}
/* Add this life cycle hook, it replaces filter(). Props are updated/incoming
props, state is current state of component instance */
static getDerivedStateFromProps(props, state) {
// The condition for prop changes that trigger an update
if(state.input !== props.inputValue) {
const filtered = state.allUsers.filter(user => user.toLowerCase().includes(props.inputValue));
/* Return the new state object seeing props triggered an update */
return {
allUsers: state.allUsers
filteredUsers: filtered.map(user => <li key={user}>{user}</li>),
input: props.inputValue
}
}
/* No update needed */
return null;
}
render() {
return (<ul>{this.state.filteredUsers}</ul>)
}
}
Надеюсь, это поможет