ReactJS вызов компонента

247
01 августа 2017, 19:10

Как вызвать компонент на JSX используя значение state?

У меня есть класс родитель, из которого вызывается компонент-ребёнок (вызов - ). Подскажите, пожалуйста, какой правильный синтаксис записи для вызова этого компонента, если его имя будет лежать в state. Например this.state = {component: Area}. А при вызове <{this.state.component}/> - не подходит

Answer 1

JSX тип не может быть выражением, а получение свойства объекта через точку - это тоже выражение.
Поэтому надо это выражение надо заранее вычислить и присвоить переменной. Обязательно с большой буквы (с маленькой буквы называются только заранее заданные теги).
Собственно прямо как написано в разделе документации ссылку на который я Вам уже давал.

Что-то в духе

render(){
    let AreaComponent = components[this.state.component];
    ...
    return <Calculated>
}

сomponents - это множество в котором Вы ваши компоненты по имени искать будете. Они же не из воздуха берутся. И структура которая магическим образом соотносит js строчку с каким-то js-объектом (реактовским классом с именем совпадающим со строчкой) все равно нужна. Видимо ваше затруднение лежит в том где ее эту структуру взять.

То есть грубо говоря вам нужен объект вида:

let components = {
    'AwesomeComponent': AwesomeComponent,
    'SuperComponent': SuperComponent,
    'YetAnotherComponent': AwesomeComponent
}

Если Вы используете es6 модули и импортируете компоненты не одной пачкой, то склейка их в одну структуру ложится на вас, так как на текущий момент нельзя по имени обратиться к переменной содержащий весь скоуп модуля.

Answer 2

Логика по клику кнопки, но могут быть и другие события:

class Test extends React.Component { 
	constructor() { 
		super() 
		this.state = { 
			showArea: false 
		} 
	} 
	render(){ 
 		let child = this._getChild(); 
		let areaNodes; 
		if(this.state.showArea) { 
			areaNodes = child; 
		} 
		return ( 
			<div> 
				<button onClick={this._showChild.bind(this)}>Click to show child</button> 
				{areaNodes}			 
			</div> 
		) 
	} 
	_showChild() { 
		this.setState({ 
			showArea: !this.state.showArea 
		}) 
	}  
	_getChild() { 
		return <TestChild /> 
	} 
} 
class TestChild extends React.Component { 
	render() { 
		return ( 
			<div>Hello</div> 
		) 
	} 
} 
ReactDOM.render(<Test />, document.getElementById('root'))
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script> 
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script> 
<div id="root"></div>

Answer 3

Так в документации к реакту это расписано же. Имя компонента должно начинаться с большой буквы и не должно быть выражением.

const MyComponent = this.state.component;
return <MyComponent />
READ ALSO
Удаление из массива информацию

Удаление из массива информацию

Имеется такой массив:

281
Помогите с настройкой Brackets

Помогите с настройкой Brackets

ЗдравствуйтеНужно сделать в Brackets, что бы тег перемещался через строчку, а писать можно было сразу между тегами с пробелами или табуляцией

304
Передача информации в контроллер

Передача информации в контроллер

Пользуюсь плагином jquery-confirm, по клику на элемент создаю вот такую форму:

211
Как настроить Webpack + Babel + Gulp

Как настроить Webpack + Babel + Gulp

ПриветХочу научиться работать с современными фронт-енд инструментами, но я что-то совершенно не могу найти ни одного человеческого мануала/скринкаста...

278