Переключить логическое состояние между родительским компонентом

Ищете способ переключения логического значения состояния в дочернем компоненте из метода в родительском компоненте.

Родительский элемент содержит метод для открытия контактной формы.

  handleContact() {
    this.setState({
      contactOpen: !this.state.contactOpen,
    });
  }

Дочерний компонент ContactForm имеет состояние для thankYou (логическое значение), которое получает значение true при отправке формы.

Проблема заключается в том, что когда родительский метод для открытия контактной формы вызывается после того, как форма уже отправлена, сообщение с благодарностью остается на экране.

Я попытался переместить состояние thankYou в родительский элемент, создать метод showThankYou в родительском элементе и передать его дочернему элементу ContactForm. Кажется, что функция не запускается, и этот способ может быть слишком сложным.

Есть ли другой способ обновить логическое состояние в дочернем компоненте из метода handleContact в родительском?

ContactForm (дочерний элемент) должен управлять только изменениями ввода и отображением формы (в конечном итоге отправкой). Решение о том, нужно ли вам отображать ContactForm или другой компонент с сообщением «спасибо» (назовите его SuccessMessage или как-то еще), должен принимать родительский (контейнерный) компонент. Просто создайте логическое свойство состояния в родительском элементе, чтобы сохранить то, что должно быть отображено, и отобразите один из дочерних компонентов в соответствии с его значением.

gd_silva 27.12.2018 15:50

Да, имейте логическое состояние в родительском элементе и обновите это логическое значение своей функцией. Затем передайте его как опору своему ребенку. Тогда вы сможете делать с ним все, что захотите. В жизненных циклах вашего дочернего компонента вы можете взять его и кое-что с ним сделать. GetDerivedStateFromProps, WillUpdate, didUpdate

Nicholas 27.12.2018 16:15

@Nicholas В итоге я использовал componentDidUpdate так, как вы предложили. Спасибо.

kalecrush 27.12.2018 19:21

@kalecrush рад, что смог помочь

Nicholas 28.12.2018 10:10
Поведение ключевого слова "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
4
791
2

Ответы 2

    handleContact() {
    const contact = !this.state.contactOpen;
    this.setState({
      contactOpen: contact
    });
  }

Исправлено Николасом (https://stackoverflow.com/users/2836350/nicholas) (думаю, я уже пробовал этот подход и у меня не сработало, поэтому я использую тот, который указан выше):

handleContact=()=> this.setState(prevState=>({contactOpen: !prevState.contactOpen}))

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

kalecrush 27.12.2018 19:18

тем не менее, ваш метод handleContact все равно не сработает: D, возможно, вы нашли здесь 2 проблемы: D

José Santos 28.12.2018 11:57

Я предлагаю вам иметь один childComponent для вашей формы и childComponent / (просто jsx) для вашего сообщения с благодарностью и отображать оба в родительском компоненте следующим образом:

// Parent
constructor(props) {
    super(props);

    this.state = {
        contactOpen: true,
        showThankU: false
    }
}

onSubmit(params) {
   // Do the submission process

   this.setState({showThankU: true, contactOpen: false}, () => {
       // in the callback use setTimout
       // to hide thank you box after desired seconds

       setTimeout(() => this.setState({showThankU: false), 10000);
   });
}

render() {
    return (
        <div>
            {/* if you would like to hide it after submit use this.state.contactOpen && */}
            {this.state.contactOpen && 
              <ContactsForm onSubmit = {this.onSubmit.bind(this)}/>
            }

            {/* Whatever your thank you message (childComponet or just jsx) is: */}
            {this.state.showThankU && <ThankYouMessage {...props} />
        </div>
    );
}

если вы хотите обрабатывать все в компоненте contactForm, вы должны передать обратный вызов от родителя к дочернему (contactForm) и изменить состояние отображения сообщения или нет, а также передать это как другой реквизит в contactForm:

<ContactsForm 
    showMessage = {this.state.showMessage}
    onSubmit = {() => {
         this.setState({showMessage: true});
    }}
    {/* Other props */}
/>

Также имейте в виду, что когда вы хотите передать обратный вызов дочернему элементу, вы должны быть осторожны с это JavaScript:

для этого вы можете связать свои методы следующим образом:

// in constructor
this.myMethod = this.myMethod.bind(this)

// Or use ES6 and callback
<ChildComponent 
    myProp = {() => this.myMethod()}
/>

// Or bind when passing to child
<ChildComponent
    myProp = {this.myMethod.bind(this)}
/>

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

kalecrush 27.12.2018 19:20

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