Я новичок в реакции, и это скорее концептуальный вопрос, чем конкретное программирование.
У меня есть основной компонент, который состоит из 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} />
}
@sme Я добавил псевдокод. Пожалуйста, проверьте.
расширены ли компоненты Image и Graph из PureComponent? Вносят ли они какую-нибудь логику в свой shouldComponentUpdate()?
Да, они чистые, а график - это response-chartjs2 image - это просто изображение, а источником является prepareData. Не реализовано shouldComponentUpdate.



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


Ваше предположение верно.
Рендеринг запускается при изменении состояния компонента. Состояние может измениться из-за изменения реквизита или из прямого изменения setState. После этого реакция, основанная на обновленном состоянии, решает, нужно ли выполнять повторную визуализацию.
В вашем случае реквизиты и состояние не меняются после вызова prepareData.
Спасибо за ответ. Итак, здесь мне нужно поместить источник изображения и данные диаграммы в состояние и вызвать setState, чтобы изменить данные, а не возвращать объект и использовать его для подготовки данных? Для этого мне нужно вынести функцию prepareData() внутрь самого класса. Я прав ?
Но реквизиты для диаграммы и изображения меняются после того, как я позвонил в prepareData. Можете ли вы проверить две строки, добавленные наконец в приведенный выше псевдокод. Это все еще не обновляет компонент.
Переместите "returnData = prepareData (this.state.buttonSelected)" из рендеринга и поместите его в onButtonClick, после этого this.setState ({returnData}) и из рендеринга, например, доступа к нему. this.state.returnData.chartdata
Можете ли вы поделиться своей функцией prepareData? даже если это просто псевдокод