React обрабатывает свои обновления, просматривая реквизиты и состояние компонента. То, как вы реализовали это сейчас, в основном правильно, когда вы вызываете setState()
, запускается повторный рендеринг.
Тем не менее, событие onChange
, которое вы ищете, происходит не всякий раз, когда ваши параметры динамически обновляются, но это событие запускается всякий раз, когда ваш пользователь выбирает другую опцию. Это не имеет ничего общего с React.
См. Ответ, предоставленный Rizal Ibnu, если вы хотите более эффективно проверять наличие обновлений.
Однако я бы добавил некоторые обновления в ваш код, он может быть короче:
class Dropdown extends React.Component {
constructor(props) {
super(props);
}
// You can 'bind' this also with an arrow function
handleChange = event => {
if (this.props.onChange) this.props.onChange(event.target.value);
};
componentDidUpdate(prevProps) {
if (this.props.options.length != prevProps.options.length) {
if (this.props.onChange) this.props.onChange(this.dropDown.current.value);
} else {
this.props.options.forEach(() => {
if (this.props.options.value != prevProps.options.value) {
if (this.props.onChange)
this.props.onChange(this.dropDown.current.value);
return;
}
})
}
}
}
render() {
return (
<select
value={this.props.value}
onChange={this.handleChange}
// Consider using callback refs
ref={dropdown => (this.dropDown = dropDown)}
>
// Pure preference, I like mapping a list inline
{this.props.options.map(option => (
<option value={option.value} key={option.value}>
{option.name}
</option>
))}
</select>
);
}
}
Я бы снова посмотрел на метод this.props.onChange
от твоего родителя, я не думаю, что он должен быть неопределенным.