@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 не вызывался
  • Вопрос задан
  • 569 просмотров
Решения вопроса 1
@UsulPro
Потому-что запуск Render родителя запускает Render у всех дочерних компонентов. В этом суть React.
Вы можете вручную управлять тем будет ли компонент рендериться если добавите в него (в вашем случае в TreeStructure) функцию shouldComponentUpdate(nextProps, nextState)
Если она возвращает false то компонент рендериться не будет.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
07 мая 2024, в 14:38
8000 руб./за проект
07 мая 2024, в 14:38
15000 руб./за проект
07 мая 2024, в 14:36
70000 руб./за проект