Задать вопрос
@Pogran

Как происходит render?

Не могу понять почему у меня у компонентов постоянно тянется render()
У меня есть component Tree .
class Tree extends React.Component {
	constructor(props) {
		super(props);

		this.state = {
			oldValue: '',
			newValue: '',
			oldKey: '',
			newKey: '',
			level: '',
			action: false,
		};

		this.onAddLevel = this.onAddLevel.bind(this);
	}

	resetState() {
		this.setState({
			action: false,
			newKey: '',
			newValue: '',
			oldKey: '',
			oldValue: ''
		});
	}


	onAddLevel(e) {
		e.preventDefault();

		this.setState({
			level: e.target.dataset.level,
			oldKey: e.target.dataset.key,
			action: 'add-level',
			newValue: '',
			newKey: ''
		});
	}

	render() {
		console.log('Tree');

		return (
			<div className="tree">
				<TreeStructure
					addLevel={this.onAddLevel}
					structure={this.props.entity.structure}
				/>
			</div>
		);
	}
}

Tree.propTypes = {
	entity: React.PropTypes.object.isRequired,
	addLevel: React.PropTypes.func.isRequired
};

export default Tree;


И компонент TreeStructure.
import React from 'react';
import ControlLink from './ControlLink';
import isEmpty from 'lodash/isEmpty';

class TreeStructure extends React.Component {
	constructor(props) {
		super(props);
	}

	renderTree(object, level ='', padding = 0) {
		console.log('render Tree');
		padding  += 12;

		return (
			Object.keys(object).map(key => {
				if(typeof object[key] == 'string') {
					return (
						this.renderChildString(key, object[key], level ,padding)
					)
				} else {
					return (
						this.renderLevelString(key, object[key], level, padding)
					);
				}
			})
		);
	}

	renderChildString(key, value, level='',padding) {
		return (
			<div className="row-tree" style={{paddingLeft: `${padding}px`}} key={key} >
				<b>{key}</b>: {value}

				<div className="pull-right">
					<ControlLink
						title="Add level"
						level={level}
						keyVal={key}
						className="create-element"
						parentClassName="fa fa-plus"
						onClick={this.props.addLevel}
					/>

				</div>
				<div>
					{this.renderTree(object, levelKey, padding)}
				</div>
				<div style={{paddingLeft: `${padding}px`}} className="row-tree">
					<div>&#125;</div>
				</div>
			</div>
		);
	}

	render() {
		console.log('render structure');

		return (
			<div>
				{this.renderTree(this.props.structure)}
			</div>
		);
	}
}

TreeStructure.propTypes = {
	structure: React.PropTypes.object.isRequired,
	addLevel: React.PropTypes.func.isRequired
};

export default TreeStructure;


Так вот я в TreeStructure нажимаю на кнопку и у меня вызывается addLevel родителя. Вопрос почему потом у меня по цепочке вызываются все render и у TreeStructure в том числе. Т.е тут смысл в том что при клике изменяется только state у Tree, а у TreeStructure ничего не меняется. Так почему же вызывается render у TreeStructure . И как можно сделать чтобы при клике render у TreeStructure не вызывался
  • Вопрос задан
  • 571 просмотр
Подписаться 1 Оценить 1 комментарий
Помогут разобраться в теме Все курсы
  • Яндекс Практикум
    Мидл фронтенд-разработчик
    5 месяцев
    Далее
  • Яндекс Практикум
    React-разработчик
    3 месяца
    Далее
  • Яндекс Практикум
    Фронтенд-разработчик
    10 месяцев
    Далее
Решения вопроса 1
@UsulPro
Потому-что запуск Render родителя запускает Render у всех дочерних компонентов. В этом суть React.
Вы можете вручную управлять тем будет ли компонент рендериться если добавите в него (в вашем случае в TreeStructure) функцию shouldComponentUpdate(nextProps, nextState)
Если она возвращает false то компонент рендериться не будет.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
ITK academy Нижний Новгород
от 80 000 до 120 000 ₽
ITK academy Воронеж
от 50 000 до 90 000 ₽