Как вызвать компонент на JSX используя значение state?
У меня есть класс родитель, из которого вызывается компонент-ребёнок (вызов - ). Подскажите, пожалуйста, какой правильный синтаксис записи для вызова этого компонента, если его имя будет лежать в state. Например this.state = {component: Area}. А при вызове <{this.state.component}/> - не подходит
JSX тип не может быть выражением, а получение свойства объекта через точку - это тоже выражение.
Поэтому надо это выражение надо заранее вычислить и присвоить переменной. Обязательно с большой буквы (с маленькой буквы называются только заранее заданные теги).
Собственно прямо как написано в разделе документации ссылку на который я Вам уже давал.
Что-то в духе
render(){
let AreaComponent = components[this.state.component];
...
return <Calculated>
}
сomponents - это множество в котором Вы ваши компоненты по имени искать будете. Они же не из воздуха берутся. И структура которая магическим образом соотносит js строчку с каким-то js-объектом (реактовским классом с именем совпадающим со строчкой) все равно нужна. Видимо ваше затруднение лежит в том где ее эту структуру взять.
То есть грубо говоря вам нужен объект вида:
let components = {
'AwesomeComponent': AwesomeComponent,
'SuperComponent': SuperComponent,
'YetAnotherComponent': AwesomeComponent
}
Если Вы используете es6 модули и импортируете компоненты не одной пачкой, то склейка их в одну структуру ложится на вас, так как на текущий момент нельзя по имени обратиться к переменной содержащий весь скоуп модуля.
Логика по клику кнопки, но могут быть и другие события:
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>
Так в документации к реакту это расписано же. Имя компонента должно начинаться с большой буквы и не должно быть выражением.
const MyComponent = this.state.component;
return <MyComponent />
Продвижение своими сайтами как стратегия роста и независимости