Родительская дочерняя проблема в React

У меня есть родительский компонент, в котором я настраиваю состояние, вызываю дочерний компонент, принимаю значение от дочернего и снова отправляю его родителю и устанавливаю значение.

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.

Я не уверен, в чем проблема с вашим кодом. Я сделал фрагмент, на котором вы можете воспроизвести свою проблему. здесь codeandbox.io/s/ovzm69nkyz

MadeOfAir 14.05.2018 12:28

@MadeOfAir: хорошо

pourushsingh gaur 14.05.2018 14:42
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
2
79
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Возможно, вам придется изменить свою функцию, как показано ниже:

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 и запутался в отношениях между родителями и детьми. Большое спасибо. У меня есть еще одно сомнение. Могу я спросить?

pourushsingh gaur 14.05.2018 12:15

Можно ли установить свойства по умолчанию, как показано ниже в разделе Дочерний: `static defaultProps = {typeaheadItems: null, lookupKey: null}; `Как я уже писал, если еще условия? Например, если я не передам реквизиты от родителя, он просто отправит значение родителю!

pourushsingh gaur 14.05.2018 12:18

Другие вопросы по теме