У меня есть родительский компонент, в котором я настраиваю состояние, вызываю дочерний компонент, принимаю значение от дочернего и снова отправляю его родителю и устанавливаю значение.
class Parent extends Component {
constructor(props) {
super(props);
this.onInputChange = this.onInputChange.bind(this);
this.state = {
value: ""
};
}
emailList = [
{
label: "Alen Musk",
text: "[email protected]"
},
{
label: "John smith",
text: "[email protected]"
},
{
label: "Jacky shroff",
text: "[email protected]"
},
{
label: "Bruce wayne",
text: "[email protected]"
}
];
onInputChange(value) {
this.setState({ value: value });
}
render() {
return (
<div>
<InputSuggestionsComponent
label = "Email"
value = {this.state.value}
typeaheadItems = {this.emailList}
lookupKey = "text"
onChange = {this.onInputChange}
/>
</div>
);
}
}
export default Parent;
Дочерний компонент:
<Field
onFocus = {this.setFocus}
onBlur = {this.onBlurHandler}
onKeyDown = {this.onKeyDown}
disabled = {this.props.disabled}
value = {this.props.value}
onChange = {this.changeHandler}
onSelect = {this.onSelectHandler}
required
name = {label}
type = {fieldType}
textColor = {currentTheme.text}
buttonMovable = {this.props.type === "password"}
/>
changeHandler = e => {
this.props.onChange(e.target.value);
this.checkTypeAhead(this.props.value);
};
setTypeAhead = value => {
console.info("props value in settypeahead", this.props.value);
console.info(" value in settypeahead", value);
const {
typeaheadItems,
lookupKey
} = this.props;
this.setState({
showSuggestions: true,
selectedIndex: null,
suggestions: typeaheadItems.filter(
item => (lookupKey ? item[lookupKey] : item).toLowerCase().indexOf(value.toLowerCase()) === 0
)
});
};
checkTypeAhead(value) {
//console.info("check for typeahead ", this.props);
if (this.props.typeaheadItems && this.props.lookupKey) {
this.setTypeAhead();
}
this.props.onChange(value);
}
Теперь, что происходит, вызывается мой дочерний обработчик onChange, где я беру значение из e.target.value и отправляю его родительскому элементу для обновления в this.state.props, после чего открывается мой список предложений.
Но что касается первого раза, я получаю this.props.value как "", поскольку он был установлен в родительском элементе.
Что делать, если я хочу принять ценность как тип использования?
Например: если пользователь вводит «а», я должен получить «а» в this.props.value.
@MadeOfAir: хорошо



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Возможно, вам придется изменить свою функцию, как показано ниже:
onInputChange(target) {
console.info('target obj:', target); // also try to log what you get
this.setState({ value: target.value });
}
Регистрируя параметр объекта target, вы можете узнать, как получить значение, введенное пользователем, и затем передать его объекту состояния.
Проблема в том, что обновление состояния происходит асинхронно. Итак, когда вы это сделаете
this.props.onChange(e.target.value);
this.checkTypeAhead(this.props.value);
вторая строка не получает обновленное родительское состояние, так как это еще не произошло.
Решением может быть использование события жизненного цикла componentDidUpdate в вашем дочернем компоненте, чтобы вы могли выполнять checkTypeAhead, только после вы получаете новые реквизиты от родительского компонента.
componentDidUpdate(prevProps, prevState, snapshot) {
if (prevProps.value !== this.props.value) { // check if a new value was passed
this.checkTypeAhead(this.props.value);
}
}
В вашем конкретном случае, когда родитель не выполняет никакой обработки value, вы можете просто напрямую использовать e.target.value. Однако первоначальное предложение позволяет вам больше гибкости.
this.props.onChange(e.target.value);
this.checkTypeAhead(e.target.value);
Большое спасибо. Я новичок в React и запутался в отношениях между родителями и детьми. Большое спасибо. У меня есть еще одно сомнение. Могу я спросить?
Можно ли установить свойства по умолчанию, как показано ниже в разделе Дочерний: `static defaultProps = {typeaheadItems: null, lookupKey: null}; `Как я уже писал, если еще условия? Например, если я не передам реквизиты от родителя, он просто отправит значение родителю!
Я не уверен, в чем проблема с вашим кодом. Я сделал фрагмент, на котором вы можете воспроизвести свою проблему. здесь codeandbox.io/s/ovzm69nkyz