Компонент, производный от React, не обновляется при изменении состояния

Я новичок в реакции, и это скорее концептуальный вопрос, чем конкретное программирование.

У меня есть основной компонент, который состоит из 3 подкомпонентов. Назовите их A, B, C. A - график, B - изображение, а C - набор переключателей (X, Y, Z). Существует состояние, связанное с C, для которого по умолчанию задан {buttonSelected: "Y"}.

Когда загружается основной компонент, из prepareData(this.state.buttonSelected) вызывается функция render(). Эта функция подготовит все данные, необходимые для отображения на графике и в изображении, а затем заполнит данные на объекте и вернет объект. Весь график и изображение внутри return() основного компонента создается с использованием этого возвращенного объекта, и компонент загружается успешно.

Теперь, когда я снова нажимаю на радиокнопку X, prepareData(this.state.buttonSelected) вызывается с правильным значением X из render(), он также возвращает объект, заполненный правильными данными для графика и изображения. Но график и изображение не перерисовываются с новыми значениями.

Это потому, что данные для создания графика и изображения не в состоянии? Должна ли каждая часть, которая нуждается в повторной визуализации, быть связана с props or state, и данные, полученные из другого состояния, не должны повторно отображаться?

редактировать: добавлен псевдокод

const prepareData = buttonSelected => {
   <chart data and image preparation based on buttonSelected >
   object.chartdata, object.imagedata = <prepared data>
   return object
}

class MainComponent extends Component {
   constructor(){
      this.state = {buttonSelected: "Y"}
   }

onButtonClick(c){ 
   this.setState({buttonSelected: c})
}
render(){ 
   returnData = prepareData(this.state.buttonSelected)
   return (
   <JSX using retrunData>
   <...... onClick  = {() => this.onButtonClick("Y") >
   <Chart data = {returnData.chartdata} />
   <Image source = {returnData.imagedata} />

}

Можете ли вы поделиться своей функцией prepareData? даже если это просто псевдокод

sme 01.11.2018 08:41

@sme Я добавил псевдокод. Пожалуйста, проверьте.

rockfight 01.11.2018 09:48

расширены ли компоненты Image и Graph из PureComponent? Вносят ли они какую-нибудь логику в свой shouldComponentUpdate()?

skyboyer 01.11.2018 09:55

Да, они чистые, а график - это response-chartjs2 image - это просто изображение, а источником является prepareData. Не реализовано shouldComponentUpdate.

rockfight 01.11.2018 10:04
Поведение ключевого слова "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
237
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ваше предположение верно.

Рендеринг запускается при изменении состояния компонента. Состояние может измениться из-за изменения реквизита или из прямого изменения setState. После этого реакция, основанная на обновленном состоянии, решает, нужно ли выполнять повторную визуализацию.

В вашем случае реквизиты и состояние не меняются после вызова prepareData.

Спасибо за ответ. Итак, здесь мне нужно поместить источник изображения и данные диаграммы в состояние и вызвать setState, чтобы изменить данные, а не возвращать объект и использовать его для подготовки данных? Для этого мне нужно вынести функцию prepareData() внутрь самого класса. Я прав ?

rockfight 01.11.2018 10:02

Но реквизиты для диаграммы и изображения меняются после того, как я позвонил в prepareData. Можете ли вы проверить две строки, добавленные наконец в приведенный выше псевдокод. Это все еще не обновляет компонент.

rockfight 01.11.2018 10:08

Переместите "returnData = prepareData (this.state.buttonSelected)" из рендеринга и поместите его в onButtonClick, после этого this.setState ({returnData}) и из рендеринга, например, доступа к нему. this.state.returnData.chartdata

Miroslav Savovski 01.11.2018 10:16

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