Реагируйте js, устанавливая состояние родительского компонента из дочернего метода визуализации

#reactjs #react-state-management

Вопрос:

Функциональность : Я хочу изменить свойство объекта типа внутри состояния родительского компонента из метода визуализации дочернего компонента.

Что я пробовал до сих пор: я передал метод своему дочернему компоненту в качестве поддержки от родителя, который, в свою очередь, задает состояние родителя. Ниже несколько строк кода объясняют, чего я пытаюсь достичь.

В методе визуализации моего дочернего компонента у меня есть что-то вроде приведенного ниже

  <label>{this.setStateKey("title",item,mode)}</label>
 <label>{this.setStateKey("description",item,mode)}</label>
 

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

 this.props.changeParentState({title/description},item)
 

В моем родительском компоненте у меня есть свойство состояния типа объект, которое состоит из двух свойств: название и описание

 this.state = {
  item: {
   title:"",
   descripion:""
  }
}
 

Теперь внутри метода changeParentState родительского компонента я изменяю состояние с помощью оператора распространения

 changeParentState=(key,value)=>
{
  if(key === "title")
  {
     this.setState({ item: {
        ...this.state.item,
        title: 'value'
     }});
  }
  if(key === "description")
  {
     this.setState({ item: {
        ...this.state.item,
        description: 'value'
     }});
  }
}
 

Наблюдаемое поведение : Свойство элемента не содержит значения, отправляемого как часть заголовка. Он всегда содержит только значение описания (кажется, что второй вызов метода родителю всегда переопределяет первый ).

Кто-нибудь может, пожалуйста, помочь мне понять это поведение? Возможно, мне нужно пересмотреть некоторые основные концепции react. Заранее спасибо. 🙂

Ответ №1:

TL;DR эта первая строка :

 <label>{this.setStateKey("title",item,mode)}</label>
 

задает состояние title , но затем вторая строка :

 <label>{this.setStateKey("description",item,mode)}</label>
 

переопределяет это же состояние на description

Вы можете попробовать удалить вторую строку и посмотреть, установлено ли для вашего состояния значение title или нет


Вот краткое описание того, как выполняется ваш код, сначала эта строка :

  <label>{this.setStateKey("title",item,mode)}</label>
 

вызывается функция setStateKey() , которая вызывает эту this.props.changeParentState({title/description},item) функцию, и эта ее часть выполняется :

 if(key === "title")
  {
     this.setState({ item: {
        ...this.state.item,
        title: 'value'
     }});
  }
 

Который устанавливает ваше состояние как желаемое.
Но затем выполняется вторая строка :

 <label>{this.setStateKey("description",item,mode)}</label>
 

Как и раньше setStateKey() , вызывается функция, которая выполняет эту функцию this.props.changeParentState({title/description},item) , теперь эта часть вашего кода выполняется :

   if(key === "description")
  {
     this.setState({ item: {
        ...this.state.item,
        description: 'value'
     }});
  }
 

Что переопределяет ваше состояние до этого последнего.

Комментарии:

1. Здравствуйте, спасибо за ваш ответ. Вы были правы, что удаление второй строки устанавливает состояние родителя в заголовок. Не могли бы вы, пожалуйста, сообщить мне, есть ли какой-либо способ, с помощью которого я могу установить оба свойства элемента ( название и описание) внутри родительского состояния. Если быть более точным, я не хочу терять свойство заголовка элемента при настройке описания. Заранее спасибо 🙂

2. @Xero Простой способ сделать это-инициализировать массив, используя .push метод для вставки ваших объектов, а затем использовать setState() для обновления вашего начального item состояния